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……

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从开源EPR产品Odoo学习

前言 一个先进、敏捷、经济高效、可快速扩展的Odoo免费开源企业信息化解决方案,让企业获得适应未来发展的长期创新和增长能力。 Odoo 的免费开源模式 让我们可利用无数开发人员和业务专家,在短短数年内,打造数百款应用。凭借强大的技术基础,Odoo 的框架是非常独特且优秀的…

0614,表达式,语句

题目一&#xff1a; 许多简单的交互式程序都是基于菜单的&#xff1a;它们向用户显示可供选择的命令列表&#xff1b;一旦用户选择了某条命令&#xff0c;程序就执行相应的操作&#xff0c;然后提示用户输入下一条命令&#xff1b;这个过程一直会持续到用户选择 "退出&qu…

图论(一)之概念介绍与图形#matlab

图论&#xff08;一&#xff09;之概念介绍与图形目录 前言 一、图论介绍 二、基本概念 2.1图的概念 2.2图形分类 2.3邻接矩阵 2.3.1无向图 2.3.2有向图 2.3.3有向赋权图 2.4出度&#xff08;Outdegree&#xff09; 2.5入度&#xff08;Indegree&#xff09; 3.四种…

Apollo9.0 PNC源码学习之Control模块(五)—— 基于LQR的横向控制

前面文章&#xff1a; Apollo9.0 PNC源码学习之Control模块&#xff08;一&#xff09; Apollo9.0 PNC源码学习之Control模块&#xff08;二&#xff09; Apollo9.0 PNC源码学习之Control模块&#xff08;三&#xff09; Apollo9.0 PNC源码学习之Control模块&#xff08;四&…

GenICam标准(六)

系列文章目录 GenICam标准&#xff08;一&#xff09; GenICam标准&#xff08;二&#xff09; GenICam标准&#xff08;三&#xff09; GenICam标准&#xff08;四&#xff09; GenICam标准&#xff08;五&#xff09; GenICam标准&#xff08;六&#xff09; 文章目录 系列文…

鸿蒙用 BuilderParam 实现同一个布局不同内容组件

面通过一个案例展示BuilderParam的具体用法&#xff0c;例如&#xff0c;现需要实现一个通用的卡片组件&#xff0c;如下图所示 卡片中显示的内容不固定&#xff0c;例如 具体实现代码如下&#xff1a; Entry Component struct BuildParamDemo {build() {Column(){Card() {imag…

C++:STL容器-->set

使用set容器时需要导入头文件&#xff1a;#include <set> set和multiset区别&#xff1a; set不允许容器中有重复的元素 multiset允许容器中有重复的元素 1. 构造函数 set<T> st; set s(const &st); void printSet(set<int>& s) {for (set<int>…

CC2500和CC1101移植说明

主要通过如何移植、移植注意、关于芯片配置、如何生成导出配置四大步骤来说明CC2500和CC1101移植 首先通过下图1这个宏进行选择 如何移植 要移植的部分在 CC2500_hal.c 和 CC2500_hal.h中, 搜索 "//移植" 就可以定位到 库 所需的依赖, 需要根据 您的环境实现这些…

【机器学习】LightGBM: 优化机器学习的高效梯度提升决策树

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 LightGBM: 优化机器学习的高效梯度提升决策树引言一、LightGBM概览二、核心技术…

VSCode格式化插件-prettier

VSCode格式化插件 1.安装插件&#xff1a;prettier 2.设置默认格式化工具 设置中&#xff0c;搜索 “Default Formatter”。 在编辑器设置中&#xff0c;将默认格式化工具设为 Prettier。 3.启用格式化选项&#xff1a; 在设置中搜索 “Format On Save”&#xff0c;并勾选…

【机器学习】机器学习与物流科技在智能配送中的融合应用与性能优化新探索

文章目录 引言机器学习与物流科技的基本概念机器学习概述监督学习无监督学习强化学习 物流科技概述路径优化车辆调度需求预测 机器学习与物流科技的融合应用实时物流数据分析数据预处理特征工程 路径优化与优化模型训练模型评估 车辆调度与优化深度学习应用 需求预测与优化强化…

从 Solana 课程顺利毕业获得高潜岗位,他的 Web3 开发探险之旅

在 TinTinLand 的学习&#xff0c;给了我入门 Web3 行业的 Entry Ticket&#xff0c;我认为这张 Ticket 是非常宝贵和重要的。 Alex&#xff0c;一位从某家知名研究所毅然辞职&#xff0c;踏入Web3世界的年轻开发者&#xff0c;凭借在 TinTinLand 推出的「Solana 黑客松先锋训练…

leetcode(力扣)第15题-三数之和---使用c语言双指针法,二级指针的应用

题目&#xff1a; 15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 编写过程的问题&#xff1a; 记住线索 1、对数组使用快排排序&#xff1b;2、固定 a 对 b、c 使用双指针&#xff1b;3、注意去重问题。函数返回值的类型。{1&#xff0c;2&#xff0c;-3}。结果作为…

Unity动态添加聊天文本

1.创建一个滚动视图 2.调整滚动视图的位置并删掉这个 3.创建一个输入框和一个按钮 这里插一句一定要给content添加这个组件并设置单元格大小 4创建一个脚本并编写下面代码 using System.Collections; using System.Collections.Generic; using TMPro; using Unity.VisualScrip…

云原生系列之Docker常用命令

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列文章目录 云原生之…

宠物空气净化器避坑指南:希喂、霍尼韦尔、安德迈谁是性价比之王

作为一个拥有两只布偶的猫奴&#xff0c;家中猫浮毛无处不在&#xff0c;稍有松懈&#xff0c;出门衣物上便沾满猫毛&#xff0c;影响形象。不仅如此&#xff0c;空气中还飘浮着猫咪们的浮毛和异味。难以清理。经过我不懈的努力&#xff0c;我终于找到了解决这一问题的神器——…

救命!挖到宝了,这本计算机书真的巨巨好看

一本适合大学生使用的计算机科学和编程学习指南&#xff0c;它通过丰富的内容和多样的学习形式&#xff0c;帮助学生建立坚实的计算机科学基础&#xff0c;并激发他们对计算机科学的兴趣。 这本书涵盖了多种类型的练习题&#xff0c;旨在帮助读者巩固理论知识并提高实际编程技能…

前端菜鸡流水账日记 -- pnpm的学习

哈咯哇大家&#xff0c;我又来了&#xff0c;最近稍微悠闲一些&#xff0c;所以就趁着这个机会学习一些新的知识&#xff0c;今天就是碰巧遇到了pnm&#xff0c;这个可以看作是npm的升级版本&#xff0c;比npm要快&#xff0c;用起来也更得劲更迅速 官网地址&#xff1a;https…

React入门教程:构建你的第一个React应用

在当今快速发展的Web开发领域&#xff0c;前端技术日新月异&#xff0c;而React作为一款强大的JavaScript库&#xff0c;已经成为众多开发者的首选。React以其组件化、高效的性能和灵活的数据处理机制闻名于世&#xff0c;被广泛用于构建动态且复杂的用户界面。在本教程中&…

Oracle数据库连接并访问Microsoft SQL Server数据库

Oracle数据库连接并访问Microsoft SQL Server数据库 说明&#xff1a;  1.实际开发中&#xff0c;Oracle数据库与SQLServer数据库之间可能需要相互进行访问&#xff0c;方便业务数据抽取&#xff0c;编写视图及表等操作。  2.SQLServer访问Oracle数据库配置相对较为简单&…