OpenGL3.3_C++_Windows(10)

最终演示

demo演示

Assimp模型渲染

  1. 模型导入库Assimp:导入很多种不同的模型文件格式,加载至Assimp的通用数据结构(树形)中,不论导入的是什么种类的文件格式,用同一种方式访问我们需要的数据。

  1. Assimp库配置:

    1. premake5.lua:cmake构建出sln,对于assimp project构建动态库(lib和dl),include头文件
    2. 运行premake5.exe,build两个project,
    3. assimp-vc143-mtd.lib:assimp-master\build\lib
    4. assimp-vc143-mtd.dll:assimp-master\build\bin\Debug
    5. 运行❌:找不到config.h :在assimp-master\build\include\assimp,config.h放置到assimp-master\include\assimp 目录下
    6. 这回加入include运行项目成功
    7. 配置参考, 配置参考
#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>

  1. 数据结构:

    1. 将整个模型加载进一个场景(Scene)对象,场景存储所有模型数据数组(真正的Mesh/Material对象),
    2. 接着场景载入为一系列的节点(Node),每个节点包含了场景对象中所储存数据的索引
    3. Scene对象(根节点的引用,)
    4. Root node(根节点)包含子节点和场景中网格数组的索引
    5. Mesh对象(包含了渲染所需要的所有相关数据,像是顶点位置、法向量、纹理坐标、面(Face)和物体的材质)Face代表的是物体的渲染图元(Primitive)(三角形、方形、点)
    6. Material对象,它包含了一些函数能让我们获取物体的材质属性,比如说颜色和纹理贴图(比如漫反射和镜面光贴图),结果是一系列的网格数据,包含在一个Model对象中
  2. 实现过程:

    1. 模型加载到Scene对象中,递归搜索每个节点的子节点,获取对应的Mesh对象
    2. 不需要将整个模型渲染为一个整体,只需要渲染组成模型的每个独立的网格就可以了
    3. model类(模型对象)(包含全部网格),
    4. mesh类(一个网格对象)(单个的可绘制实体)(负责网格绘制渲染)
  3. 具体代码:

  4. struct Vertex,struct Texture

  5. mesh的思路,依然是传入数据,初始化,渲染绘制的过程,

    1. setupMesh()
    2. C++结构体有一个很棒的特性,它们的内存布局是连续的(Sequential),和原来的数组没什么区别,我们能够直接传入一大列的Vertex结构体的指针作为缓冲的数据
    3. 不同的是,这回在VBO,VEO中传入的是struct,原来传入的数组,包含全部顶点的顶点/索引数据,一个结构体指包含一个顶点/索引数据,那么需要传入vector<struct>
    4. 并设置layout(sizeof(),计算它的字节大小,预处理指令offsetof(结构体, 结构体中变量的名字)变量距结构体头部的字节偏移量(Byte Offset)
    5. Draw():
    6. 绑定纹理:一开始并不知道这个网格有多少纹理、纹理是什么类型的。
    7. 设定一个命名标准:漫反射纹理被命名为texture_diffuseN,每个镜面光纹理应该被命名为texture_specularN(N的范围是1到纹理采样器最大允许的数字)
  6. model的思路:基本上就是遍历了所有网格,并调用它们各自的Draw函数

    1. vector<Mesh>meshes。
    2. Model()传入path
    3. Draw()通过for循环所有的meshes,进行渲染
    4. loadModel()Assimp::Importer加载模型到aiScene*场景中,检查……,处理节点processNode()
    5. processNode()递归处理树的每个节点aiNode *,
      1. 遍历检查当前节点的mNumMeshes网格数量,从aiScene*的mMeshes找到对应的网格数据
      2. 将这个数据传入processMesh(),返回iMesh并添加到meshes数组中,
      3. 遍历检查当前节点的mNumChildren子节点数量,递归processNode(),终止条件:所有的节点都被处理完毕,
    6. processMesh()aiMesh对象转化自己的Mesh类(调用构造),
      1. 循环mNumVertices,mNumFaces(mNumIndices),的个数,用库的函数mesh->mVertices等添加到数组,
      2. 传给mesh的构造函数(vertices, indices, textures),return 创建的mesh类对象
    7. loadMaterialTextures()检查给定类型的所有材质纹理,如果尚未加载,则加载这些纹理。  所需的信息将作为纹理结构返回。
    8. TextureFromFile()传入路径加载纹理,和创建纹理一样

  7. 理解MTL文件

#材质信息
#注释
# Blender MTL File: 'nanosuit.blend'
# Material Count: 6#newmtl < 材质名 >
#手臂
newmtl Arm
Ns 96.078431#高光色的权重
Ka 0.000000 0.000000 0.000000#环境色、漫射色和高光色,分量值的区间为[0.0,1.0]
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ni 1.000000#光学密度
d 1.000000#透明度
illum 2#光照模型
map_Kd arm_dif.png#使用的贴图
map_Bump arm_showroom_ddn.png
map_Ks arm_showroom_spec.png
  1. 加载自己的模型:

    1. 导入自己的obj……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1452015.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Java】多态、final关键字、抽象类、抽象方法

多态(Polymorphism) 【1】多态跟属性无关&#xff0c;多态指的是方法的多态&#xff0c;而不是属性的多态。 【2】案例代入&#xff1a; public class Animal {//父类&#xff1a;动物&#xff1a; public void shout(){ System.out.println("我是小动物&am…

JAVA-CopyOnWrite并发集合

文章目录 JAVA并发集合1_实现原理2_什么是CopyOnWrite?3_CopyOnWriteArrayList的原理4_CopyOnWriteArraySet5_使用场景6_总结 JAVA并发集合 从Java5开始&#xff0c;Java在java.util.concurrent包下提供了大量支持高效并发访问的集合类&#xff0c;它们既能包装良好的访问性能…

无人机的发展

朋友们&#xff0c;你们知道吗&#xff1f;无人机的发展之路可谓是科技界的一股清流&#xff0c;风头正劲啊&#xff01;从最初简单的遥控飞机到现在各种智能功能的加持&#xff0c;无人机真是越来越神奇了&#xff01; 首先&#xff0c;无人机在航拍领域大放异彩&#xff01;无…

ETL可视化工具 DataX -- 简介( 一)

引言 DataX 系列文章&#xff1a; ETL可视化工具 DataX – 安装部署 ( 二) 1.1 DataX 1.1.1 Data X概览 DataX 是阿里云DataWorks数据集成的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServ…

ChatGPT 提示词技巧一本速通

一、基本术语 概念 定义 案例 提示词 prompt 向AI模型提出的问题或者指示&#xff0c;告诉它我们希望得到什么样的回答或结果&#xff0c;是与模型互动的主要形式。 任务&#xff1a;生成一封电子邮件邀请。 提示词&#xff1a;请帮我写一封邀请同事参加下周五团队建设活…

Vue引入element-plus-04

我们这次开发是使用vue的脚手架来进行开发,前面我们已经使用过最原生的方式去编写我们的vue的语法,从今天开始就使用vue的脚手架,但是前提是你需要用于node的环境 在我们开始之前&#xff0c;我们至少需要有node npm是什么&#xff1f; npm是一个强大的包管理工具&#xff0c;它…

Stable Diffusion【应用篇】【艺术写真】:粘土风之后陶瓷风登场,来看看如何整合AI艺术写真吧

在国外的APP Remini引爆了粘土滤镜后&#xff0c;接着Remini又推出了瓷娃娃滤镜。相当粘土滤镜&#xff0c;个人更喜欢瓷娃娃滤镜&#xff0c;因为陶瓷工艺更符合东方艺术审美。 下面我们就来看看陶瓷特效在AI写真方面的应用。话不多说&#xff0c;我们直接开整。 关于粘土整…

基于BERT微调+模板填充快速实现文本转DSL查询语句

前言 Text2SQL是指将自然语言转化为类SQL查询语句&#xff0c;使得用户的查询文本可以直接实现和数据库交互&#xff0c;本文介绍一种以BERT为基础模型&#xff0c;通过模板填充来实现的Text2SQL算法和产品化。 内容摘要 Text2SQL任务说明模板填充的思路条件列选择子模型搭建…

TCGAbiolinks包学习

TCGAbiolinks 写在前面学习目的GDCquery GDCdownload GDC prepare中间遇到的报错下载蛋白质数据 写在前面 由于别人提醒我TCGA的数据可以利用TCGAbiolinks下载并处理&#xff0c;所以我决定阅读该包手册&#xff0c;主要是该包应该是有更新的&#xff0c;我看手册进行更新了&…

Kotlin编程实践-【Java如何调用Kotlin中带默认值参数的函数】

问题 如果你有一个带有默认参数值的 Kotlin 函数&#xff0c;如何从 Java 调用它而无须为每个参数显式指定值&#xff1f; 方案 为函数添加注解JvmOverloads。 也就是为Java添加重载方法&#xff0c;这样Java调用Kotlin的方法时就不用传递全部的参数了。 示例 在 Kotlin …

干部管理软件有哪些

随着信息技术的飞速发展&#xff0c;干部管理软件在各级党政机关、国企事业单位中扮演着越来越重要的角色。这些软件通过整合干部管理的各项业务流程&#xff0c;实现了干部信息的系统化、规范化和高效化管理。以下是几款主流的干部管理软件及其特点&#xff1a; 一、干部信息…

基于python深度学习的CNN图像识别鲜花-含数据集+pyqt界面

代码下载&#xff1a; https://download.csdn.net/download/qq_34904125/89383615 本代码是基于python pytorch环境安装的。 下载本代码后&#xff0c;有个requirement.txt文本&#xff0c;里面介绍了如何安装环境&#xff0c;环境需要自行配置。 或可直接参考下面博文进行…

AI 一键换脸,背景替换,ioDraw让图片更有趣

还在为繁琐的图片处理而烦恼吗&#xff1f;快来试试ioDraw的AI图片工具&#xff01; 它集图像识别、图像生成、智能换脸、背景替换、图像融合、肖像风格化、空间风格化、智能扩图、智能抠图、画质提升、美颜、拉伸修复、透视校正等功能于一身&#xff0c;为你提供前所未有的图…

(Javascript)AI数字人mp4转canvas播放并去除背景绿幕

1、需求介绍 H5页面嵌入AI数字人播报&#xff0c;但生成的数字人是mp4格式且有绿幕背景&#xff0c;需要转成canvas并去除背景&#xff1b; 2、效果&#xff1a; 去除前&#xff1a; 去除后&#xff1a; 3、代码 <!DOCTYPE html> <html lang"en"><…

【第9章】Vue之Element Plus快速入门

文章目录 前言一、安装1. 兼容性2. 安装 二、按需导入1.自动导入2.Vite 三、全局配置四、官方案例五、效果总结 前言 基于 Vue 3&#xff0c;面向设计师和开发者的组件库。 一、安装 1. 兼容性 Element Plus 目前还处于快速开发迭代中。 由于 Vue 3 不再支持 IE11&#xff0c…

Opus从入门到精通(五)OggOpus封装器全解析

Opus从入门到精通(五)OggOpus封装器全解析 为什么要封装 前面Opus从入门到精通(四)Opus解码程序实现提到如果不封装会有两个问题: 无法从文件本身获取音频的元数据(采样率,声道数,码率等)缺少帧分隔标识,无法从连续的文件流中分隔帧(尤其是vbr情况) 针对上面的问题我们可以…

北京活动会议通常会邀约哪些媒体参会报道?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 北京作为我国的首都和文化中心&#xff0c;各类活动会议资源丰富&#xff0c;吸引了众多媒体的关注。以下是一些通常会被邀约参会报道的重要媒体类型&#xff1a; 国家级新闻机构&#x…

flink standalone部署模式

standalone模式可以在单台机器以不同进程方式启动&#xff0c;也可以以多机器分布式方式启动。 任务的提交模式有三种&#xff1a;application mode、session model、per-job mode&#xff08;1.4x版本后过时&#xff09;。 注意区分任务的提交模式与集群的部署模式区别。 以…

注册中心理论学习

注册中心介绍 注册中心&#xff08;也称为服务注册中心或服务发现服务&#xff09;是微服务架构中的一个关键组件&#xff0c;它负责服务的注册与发现。在微服务体系中&#xff0c;服务实例的数量和位置是动态变化的&#xff0c;注册中心提供了一个集中的地方来存储这些信息&a…

linux中DNS域名解析服务(后续补充)

分离解析简介&#xff1a; 分离解析的域名服务器实际也是主域名服务器&#xff0c;这里主要是指根据不同的客户端提供不同的域名解析记录。比如来自内网和外网的不同网段地址的客户机请求解析同一域名时&#xff0c;为其提供不同的解析结果。 实验要求&#xff1a;防火墙要么关…