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.mzph.cn/web/27383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python-AI篇】人工智能技能树思维导图

大致总结一下得出如下思维导图&#xff0c;如不完善日后迭代更新 1. python基础三方库 1.1 科学计算库 ---- numpy库 1.2 科学计算库 ---- Scipy库 1.3 数据分析处理库 ---- pandas库 1.4 可视化库 ---- matplotlib库 1.5 可视化库 ---- seaborn库 1.6 机器学习和数据挖掘库 …

这世上又多了一只爬虫(spiderflow)

让我们一起默念&#xff1a; 爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫爬虫 接着大声喊出来&#xff1a; 一&#xff01;只&#xff01;爬&#xff01;虫&#xff01;呀&#xff01;爬&#xff01;呀&#xff01;爬&#xf…

高考志愿填报选专业,兴趣爱好和就业前景哪个优先?

每个人都有自己的兴趣与爱好&#xff0c;而高考志愿填报是在为自己选择职业方向。最理想的状态就是把自己的兴趣和爱好与自己的职业统一起来&#xff0c;让兴趣和爱好促进职业的发展&#xff0c;为职业增添动力。但现实生活中&#xff0c;这种理想的状态并不是每个人都能达到的…

AXI 1G/2.5G Ethernet Subsystem IP核使用过程中参数配置全解

AXI 1G/2.5G Ethernet Subsystem 是一个为FPGA设计的以太网子系统&#xff0c;它支持1Gbps和2.5Gbps的数据传输速率&#xff0c;使得FPGA能够直接进行高速以太网通信。这个子系统通常包含以太网MAC控制器、GMII&#xff08;千兆媒体独立接口&#xff09;或RGMII&#xff08;简化…

Web前端后端架构:构建高效、稳定与可扩展的互联网应用

Web前端后端架构&#xff1a;构建高效、稳定与可扩展的互联网应用 在构建互联网应用的过程中&#xff0c;Web前端与后端架构的设计与实施至关重要。一个优秀的架构能够确保应用的稳定性、高效性和可扩展性&#xff0c;为用户提供流畅、安全的体验。本文将从四个方面、五个方面…

抖音视频素材在哪找无版权?免版权可以剪辑视频素材网站分享

在抖音视频制作中&#xff0c;素材的选择至关重要。今天&#xff0c;我就为大家推荐几个宝藏网站&#xff0c;帮你找到既好用又无版权纠纷的视频素材。无论你是新手还是老手&#xff0c;这些网站都能满足你的需求。 蛙学府 首先推荐的是蛙学府。这个网站提供丰富的视频素材&am…

C语言从头学18——类型的自动转换

某些情况下&#xff0c;C语言会自动转换某个值的类型&#xff0c;以下几种情况有必要了解&#xff1a; 1、赋值运算过程中类型转换 赋值运算符会自动将右边的值转成左边变量的类型。 (1) 浮点数赋值给整数变量&#xff0c;C语言会直接丢弃小数部分&#xff…

React小记(一)_基础部分

1、项目搭建与结构 2、类组件和函数组件 主要区别&#xff1a;1、函数组件没有生命周期2、函数组件没有this指向3、函数组件没有状态4、函数组件通过hooks实现各种操作5、props在函数的第一个参数接收6、函数体相当于类组件的render函数import React from reactfunction App()…

AI 到底是什么?

AI到底是什么&#xff1f; AI&#xff08;Artificial Intelligence&#xff09;指的是一种可以制造计算机程序的计算机科学工程&#xff0c;也是当前计算机学科中的一个研究分支。把“Artificial Intelligence”翻译为“人为再造情报”更贴合它在当前落地项目中的工作场…

[CUDA编程] cuda graph优化心得

CUDA Graph 1. cuda graph的使用场景 cuda graph在一个kernel要多次执行&#xff0c;且每次只更改kernel 参数或者不更改参数时使用效果更加&#xff1b;但是如果将graph替换已有的kernel组合&#xff0c;且没有重复执行&#xff0c;感觉效率不是很高反而低于原始的kernel调用…

Linux-笔记 设备树插件

目录 前言&#xff1a; 设备树插件的书写规范&#xff1a; 设备树插件的编译&#xff1a; 内核配置: 应用背景&#xff1a; 举例&#xff1a; 前言&#xff1a; 设备树插件&#xff08;Device Tree Blob Overlay&#xff0c;简称 DTBO&#xff09;是Linux内核和嵌入式系统…

【Ardiuno】使用ESP32单片机网络功能调用API接口(图文)

接着上文连通wifi后&#xff0c;我们通过使用HTTPClient库进行网络相关操作&#xff0c;这里我们通过http协议进行接口调用。 为了简化操作&#xff0c;小飞鱼这里使用了本地服务器上的文件作为接口&#xff0c;正常操作时会调用接口后&#xff0c;将服务器返回的数据进行解析…

门控循环单元GRU与长短期记忆网络LSTM

门控循环单元与长短期记忆网络 门控隐状态 问题提出&#xff1a;对于一个序列来说不是每个观察值都是同等重要想只记住相关的观察需要&#xff1a; 能关注的机制&#xff08;更新门&#xff09;能遗忘的机制&#xff08;重置门&#xff09; 第一个词元的影响至关重要。 我们…

【第10章】Vue之Element Plus常用组件

文章目录 前言一、表格1. 带斑马纹表格2. 展示 二、分页1.国际化(中文)2.分页代码3. 展示 三、表单1. 表单代码2. 展示 四、卡片1. 卡片代码2. 展示 总结 前言 通过上一章的快速入门&#xff0c;我们已经学习了按钮使用&#xff0c;接下来学习Element Plus的常用组件&#xff…

SQL 快速参考

SQL 快速参考 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系数据库管理系统&#xff08;RDBMS&#xff09;的标准编程语言。它用于执行各种操作&#xff0c;如查询、更新、插入和删除数据库中的数据。本快速参考将提供SQL的基本语法和常用命令&…

意向锁通俗解释

意向锁概念 意向锁&#xff08;Intention Lock&#xff09;是一种数据库并发控制机制&#xff0c;用于协调和管理多个事务对数据库对象&#xff08;如表、行等&#xff09;的并发访问。它通过在数据库对象上加锁来避免事务间的冲突&#xff0c;确保数据的一致性和完整性。 意…

JavaScript之对象

对象 什么是对象 一种数据类型&#xff0c;可以理解为一种无序的数据集合&#xff0c;数组是有序的数据集合 用来描述一个事物&#xff1a;静态特征、动态特征 对象使用 声明语法&#xff1a; //第一种 let 对象名 {属性名&#xff1a;属性值, //多个属性由逗号隔开方法…

826. 安排工作以达到最大收益

826. 安排工作以达到最大收益 题目链接&#xff1a;826. 安排工作以达到最大收益 代码如下&#xff1a; class Solution { public:int maxProfitAssignment(vector<int>& difficulty, vector<int>& profit, vector<int>& worker) {vector<…

统计信号处理基础 习题解答10-12

题目&#xff1a; 如果&#xff0c;其中&#xff1a; 对某个&#xff0c;令。证明当时使最大。另外&#xff0c;证明。它们为什么是相同的&#xff1f;如果&#xff0c;基于的的MMSE估计量是什么&#xff1f; 解答&#xff1a; 根据多维高斯分布的定义&#xff0c;可以得到&am…

2024年最新版-Kubeadm快速部署Kubernetes集群(K8S)

Kubernetes集群部署 文章目录 Kubernetes集群部署资源列表基础环境一、环境准备&#xff08;三台主机都要执行&#xff09;1.1、绑定hosts1.2、安装常用软件1.3、关闭交换分区1.4、时间同步 二、Docker环境部署&#xff08;三台主机都要执行&#xff09;2.1、安装依赖包2.2、添…