当前位置: 首页 > news >正文

【OpenGL/Assimp】渲染模型、半透明材质与封装光源

文章目录

    • 渲染成果
    • Assimp库准备:
    • Mesh类修改:
    • 透明贴图使用:
    • 光源封装:
    • 使用方式在如下测试环境中:

渲染成果

在这里插入图片描述

Assimp库准备:

从GitHub拉取源码,根据网络教程,借助CMake生成VS工程项目,并用VS将其编译为静态链接库(lib)或动态链接库(dll + lib)。最后将其库文件和工程内的include文件复制到图形工程下。

Mesh类修改:

在抽象Model,Mesh这些类时,我改动LearnOpenGL的最大的类是Mesh类,将其直接使用的GLAPI替换成了封装好的API,类如下。修改的数据结构在Model中修改相应的数据存放方法即可

//Mesh.h#pragma once
#include <GL/glew.h>
#include <GLFW/glfw3.h>#include <glm/glm.hpp>#include <vector>#include "Shader.h"
#include "VertexArray.h"
#include "VertexBuffer.h"
#include "VertexBufferLayout.h"
#include "IndexBuffer.h"
#include "Texture.h"using namespace std;struct Vertex
{glm::vec3 Position;glm::vec3 Normal;glm::vec2 TexCoords;
};struct TextureData
{string name;Texture* texture;
};class Mesh
{
public:vector<Vertex> vertices;vector<GLuint> indices;vector<TextureData> textures;Mesh(vector<Vertex> vertices, vector<GLuint> indices, vector<TextureData> textures);void Draw(Renderer& renderer, Shader& shader);private:VertexArray VAO;VertexBuffer VBO;IndexBuffer EBO;void setupMesh();
};//Mesh.cpp
#include "Mesh.h"Mesh::Mesh(vector<Vertex> vertices, vector<GLuint> indices, vector<TextureData> textures)
{this->vertices = vertices;this->indices = indices;this->textures = textures;this->setupMesh();             
}void Mesh::setupMesh()
{VAO.Bind();VBO.Init(&vertices[0], vertices.size() * sizeof(Vertex));EBO.Init(&indices[0], indices.size());VAO.AddVertexBuffer(VBO);VAO.Unbind();
}void Mesh::Draw(Renderer& renderer, Shader& shader)
{for (int i = 0; i < textures.size(); i++){textures[i].texture->Bind(i);shader.SetUniform1i(textures[i].name, i);}renderer.Draw(VAO, EBO, shader);
}

透明贴图使用:

我所需要绘制的模型有半透明的面部贴图,因此需要使用透明度,这里需要注意的是,如果所有使用数据获取数据的地方都没有出错但仍没有透明效果,可以检查原始数据的问题,如图片本身的透明效果,在工程中加载图片时是否包含透明通道。

//shader
void main()
{vec3 norm = normalize(Normal);vec3 viewDir = normalize(viewPos - FragPos);//透明测试vec4 texColor = texture(texture_diffuse, TexCoords);if(texColor.a < 0.2 && mixFactor == 0)discard;//光照着色color = vec4(CalcPointLight(light, norm, FragPos, viewDir), 1);
}

光源封装:

每次使用光源需要大段的赋值语句,因此对其进行简单封装,目前只封装了点光源

//Light.h#pragma once
#include <iostream>
#include <glm/glm.hpp>#include "Shader.h"using namespace std;class Light
{
public:Light(glm::vec3 position = { 1.2f, 1.0f, 2.0f }, glm::vec3 ambient = { 0.4, 0.4, 0.4 },glm::vec3 diffuse = { 1.2, 1.2, 1.2 },glm::vec3 specular = { 0.1, 0.1, 0.1 },float constant = 1, float linear = 0.09, float quadratic = 0.032);void SetupShader(Shader& shader, string lightName);private:glm::vec3 m_Position;glm::vec3 m_Ambient;glm::vec3 m_Diffuse;glm::vec3 m_Specular;float m_Constant;float m_Linear;float m_Quadratic;
};//Light.cpp
#include "Light.h"Light::Light(glm::vec3 position, glm::vec3 ambient, glm::vec3 diffuse, glm::vec3 specular, float constant, float linear, float quadratic)
{m_Position = position;m_Ambient = ambient;m_Diffuse = diffuse;m_Specular = specular;m_Constant = constant;m_Linear = linear;m_Quadratic = quadratic;
}void Light::SetupShader(Shader& shader, std::string lightName)
{shader.SetUniform3f(lightName + ".position", m_Position.x, m_Position.y, m_Position.z);shader.SetUniform3f(lightName + ".ambient", m_Ambient.x, m_Ambient.y, m_Ambient.z);shader.SetUniform3f(lightName + ".diffuse", m_Diffuse.x, m_Diffuse.y, m_Diffuse.z);shader.SetUniform3f(lightName + ".specular", m_Specular.x, m_Specular.y, m_Specular.z);shader.SetUniform1f(lightName + ".constant", m_Constant);shader.SetUniform1f(lightName + ".linear", m_Linear);shader.SetUniform1f(lightName + ".quadratic", m_Quadratic);
}

使用方式在如下测试环境中:

#pragma once#include "RunBase.h"#include "Model.h"
#include "Light.h"#include <glm/gtc/type_ptr.hpp>class AssimpTest : public RunBase
{
public:Model* body, *blue, *ear, *eye, *mao, *mouth;Shader diffuseShader;Renderer renderer;Light light;AssimpTest() : RunBase(){diffuseShader.Init("res/shaders/AssimpTest.shader");}virtual void Init(GLFWwindow* window, float targetFrameTime) override{/*GLCall(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC1_ALPHA));GLCall(glEnable(GL_BLEND));*/body = new Model("res/models/jixuanyou/body.obj");blue = new Model("res/models/jixuanyou/blue.obj");ear = new Model("res/models/jixuanyou/ear.obj");eye = new Model("res/models/jixuanyou/eye.obj");mao = new Model("res/models/jixuanyou/mao.obj");mouth = new Model("res/models/jixuanyou/mouth.obj");}virtual void RenderLoop(GLFWwindow* window, float targetFrameTime) override{renderer.Clear();//绘制受光物体diffuseShader.Bind();//视图矩阵(透视参数)glm::mat4 view(1), proj(1), model(1);view = camera.GetViewMatrix();proj = glm::perspective<GLfloat>(45, 640 / 480, .1f, 100.f);//赋值透视diffuseShader.SetUniformMat4f("view", glm::value_ptr(view));diffuseShader.SetUniformMat4f("projection", glm::value_ptr(proj));diffuseShader.SetUniformMat4f("model", glm::value_ptr(model));//赋值光照light.SetupShader(diffuseShader, "light");//赋值视图位置diffuseShader.SetUniform3f("viewPos", camera.Position.x, camera.Position.y, camera.Position.z);diffuseShader.SetUniform1f("shininess", 4);// 取消纯色diffuseShader.SetUniform1f("mixFactor", 0);//不透明物件body->Draw(renderer, diffuseShader);ear->Draw(renderer, diffuseShader);eye->Draw(renderer, diffuseShader);mouth->Draw(renderer, diffuseShader);// 使用纯色diffuseShader.SetUniform1f("mixFactor", 1);// 浅蓝色diffuseShader.SetUniform3f("diffuseColor", 0.50, 0.66, 0.81);mao->Draw(renderer, diffuseShader);// 深蓝色diffuseShader.SetUniform3f("light.diffuse", 4, 4, 4);diffuseShader.SetUniform3f("light.specular", 0.5, 0.5, 0.5);diffuseShader.SetUniform3f("diffuseColor", 0.022, 0.06, 0.21);blue->Draw(renderer, diffuseShader);}virtual bool UseCameraControl() override{return true;}
};

相关文章:

【OpenGL/Assimp】渲染模型、半透明材质与封装光源

文章目录 渲染成果Assimp库准备&#xff1a;Mesh类修改&#xff1a;透明贴图使用&#xff1a;光源封装&#xff1a;使用方式在如下测试环境中&#xff1a; 渲染成果 Assimp库准备&#xff1a; 从GitHub拉取源码&#xff0c;根据网络教程&#xff0c;借助CMake生成VS工程项目&a…...

pandas与sql对应关系【帮助sql使用者快速上手pandas】

本页旨在提供一些如何使用pandas执行各种SQL操作的示例&#xff0c;来帮助SQL使用者快速上手使用pandas。 目录 SQL语法一、选择SELECT1、选择2、添加计算列 二、连接JOIN ON1、内连接2、左外连接3、右外连接4、全外连接 三、过滤WHERE1、AND2、OR3、IS NULL4、IS NOT NULL5、B…...

Linux WEB漏洞

定义&#xff1a;Linux Web 漏洞是指在基于 Linux 操作系统的 Web 应用程序、Web 服务器软件或者相关的网络服务配置中存在的安全弱点。这些漏洞可能导致攻击者未经授权访问敏感信息、篡改网页内容、执行恶意代码&#xff0c;甚至完全控制服务器。 常见类型及原理 SQL 注入漏…...

音视频入门基础:RTP专题(2)——使用FFmpeg命令生成RTP流

通过FFmpeg命令可以将一个媒体文件转推RTP&#xff1a; ffmpeg -re -stream_loop -1 -i input.mp4 -c:v copy -an -f rtp rtp://192.168.0.102:5400 但是通过ffplay尝试播放上述产生的RTP流时会报错&#xff1a;“Unable to receive RTP payload type 96 without an SDP file …...

大语言模型预训练、微调、RLHF

转发&#xff0c;如有侵权&#xff0c;请联系删除&#xff1a; 1.【LLM】3&#xff1a;从零开始训练大语言模型&#xff08;预训练、微调、RLHF&#xff09; 2.老婆饼里没有老婆&#xff0c;RLHF里也没有真正的RL 3.【大模型微调】一文掌握7种大模型微调的方法 4.基于 Qwen2.…...

vue3后台系统动态路由实现

动态路由的流程&#xff1a;用户登录之后拿到用户信息和token&#xff0c;再去请求后端给的动态路由表&#xff0c;前端处理路由格式为vue路由格式。 1&#xff09;拿到用户信息里面的角色之后再去请求路由表&#xff0c;返回的路由为tree格式 后端返回路由如下&#xff1a; …...

解决idea中无法拖动tab标签页的问题

1、按 Ctrl Alt S 打开设置&#xff0c;找到路径 File | Settings | Appearance & Behavior | Appearance 2、去掉勾选 Drag-and-drop with Alt pressed only 即可...

WMS仓库管理系统,Vue前端开发,Java后端技术源码(源码学习)

一、项目背景和建设目标 随着企业业务的不断扩展&#xff0c;仓库管理成为影响生产效率、成本控制及客户满意度的重要环节。为了提升仓库作业的透明度、准确性和效率&#xff0c;本方案旨在构建一套全面、高效、易用的仓库管理系统&#xff08;WMS&#xff09;。该系统将涵盖库…...

25/1/12 嵌入式笔记 学习esp32

了解了一下位选线和段选线的知识&#xff1a; 位选线&#xff1a; 作用&#xff1a;用于选择数码管的某一位&#xff0c;例如4位数码管的第1位&#xff0c;第2位&#xff09; 通过控制位选线的电平&#xff08;高低电平&#xff09;&#xff0c;决定当前哪一位数码管处于激活状…...

【NLP】ELMO、GPT、BERT、BART模型解读及对比分析

文章目录 一、基础知识1.1 Word Embedding&#xff08;词嵌入&#xff09;1.2 词嵌入模型1.3 神经网络语言模型NNLM 二、ELMO2.1 ELMO的提出2.2 ELMO核心思想2.3 ELMO的优缺点 三、GPT3.1 Transformer3.2 GPT简介3.3 GPT模型架构3.4 预训练及微调3.5 GPT和ELMO对比 四、BERT4.1…...

go语言学习(数组,切片,字符串)

字符串 如果里面存储的是汉字,那么其实就是存储的是UTF--8编码,所以一个字会对应多个字节.如果想要获取汉字的个数,可以使用rune,来处理unicode字符 length: utf8.RuneCountInString( s) 如果只使用len()获取的是字节的个数, 字符串的功能 1,获取字节长度 len(xx) 2,获取字…...

PM 实战 - 智能药盒PRD + 市场规模分析

写在前面 智能硬件 PRD 实例资源很少&#xff0c;Po下个人作品&#xff0c;假定前提为to Boss需求&#xff0c;目标在于覆盖产品设计核心部分&#xff08;用户画像Persona、产品逻辑图、产品架构图、软件原型图、硬件低保真设计、用例Use Case、硬件标准&#xff09;。不是申请…...

SQL刷题快速入门(二)

其他章节&#xff1a;SQL刷题快速入门&#xff08;一&#xff09; 承接上一章节&#xff0c;本章主要讲SQL的运算符、聚合函数、SQL保留小数的几种方式三个部分 运算符 SQL 支持多种运算符&#xff0c;用于执行各种操作&#xff0c;如算术运算、比较、赋值、逻辑运算等。以下…...

hive迁移后修复分区慢,怎么办?

我有1个30TB的分区表&#xff0c;客户给的带宽只有600MB&#xff0c;按照150%的耗时来算&#xff0c;大概要迁移17小时。 使用hive自带的修复分区命令&#xff08;一般修复分区比迁移时间长一点&#xff09;&#xff0c;可能要花24小时。于是打算用前面黄大佬的牛B方案。 Hive增…...

代码随想录算法训练营day27

代码随想录算法训练营 —day27 文章目录 代码随想录算法训练营前言一、贪心算法理论基础二、455.分发饼干三、376. 摆动序列53. 最大子数组和总结 前言 今天是算法营的第27天&#xff0c;希望自己能够坚持下来&#xff01; 今日任务&#xff1a; ● 贪心算法理论基础 ● 455.…...

python 代码使用 DeepXDE 库实现了一个求解二维非线性偏微分方程(PDE)的功能

import deepxde as dde import numpy as np import matplotlib.pyplot as plt import tensorflow as tf# 设置时空计算域 Lx 1 # x 范围从 0 到 1 Ly 1 # y 范围从 0 到 1 Lt 0.05 # t 范围从 0 到 0.05 geom dde.geometry.Rectangle([0, 0], [Lx, Ly]) # 空间域 timed…...

【Go】:深入解析 Go 1.24:新特性、改进与最佳实践

前言 Go 1.24 尚未发布。这些是正在进行中的发布说明。Go 1.24 预计将于 2025 年 2 月发布。本文将深入探讨 Go 1.24 中引入的各项更新&#xff0c;并通过具体示例展示这些变化如何影响日常开发工作&#xff0c;确保为读者提供详尽而有价值的参考。 新特性及改进综述 HTTP/2 …...

VUE3 一些常用的 npm 和 cnpm 命令,涵盖了修改源、清理缓存、修改 SSL 协议设置等内容。

以下是一些常用的 npm 和 cnpm 命令&#xff0c;涵盖了修改源、清理缓存、修改 SSL 协议设置等内容。 npm 常用命令 1. 修改 npm 源 更改为淘宝的 npm 镜像源&#xff08;可以提高安装速度&#xff09;&#xff1a; bash复制代码 npm config set registry https://registry…...

【SpringBoot】@Value 没有注入预期的值

问题复现 在装配对象成员属性时&#xff0c;我们常常会使用 Autowired 来装配。但是&#xff0c;有时候我们也使用 Value 进行装配。不过这两种注解使用风格不同&#xff0c;使用 Autowired 一般都不会设置属性值&#xff0c;而 Value 必须指定一个字符串值&#xff0c;因为其…...

【STM32-学习笔记-6-】DMA

文章目录 DMAⅠ、DMA框图Ⅱ、DMA基本结构Ⅲ、不同外设的DMA请求Ⅳ、DMA函数Ⅴ、DMA_InitTypeDef结构体参数①、DMA_PeripheralBaseAddr②、DMA_PeripheralDataSize③、DMA_PeripheralInc④、DMA_MemoryBaseAddr⑤、DMA_MemoryDataSize⑥、DMA_MemoryInc⑦、DMA_DIR⑧、DMA_Buff…...

从数据孤岛到智能决策中枢:一体化系统如何重构 HR 数据流

去年某制造企业 HR 总监跟我抱怨&#xff1a;员工入职要在招聘系统录一遍信息&#xff0c;转正时人事系统再录一遍&#xff0c;发工资时薪酬系统又要重新核对。三个系统互不相通&#xff0c;一个员工的完整档案要从三个地方拼凑。这不是个例&#xff0c;而是很多企业正在经历的…...

Halcon点云拼接实战:如何用特征模板搞定3D扫描缺失问题?

Halcon点云拼接实战&#xff1a;特征模板技术在工业3D扫描中的应用 在工业检测和逆向工程领域&#xff0c;3D扫描常常面临一个棘手问题——单次扫描无法完整捕获复杂物体的所有表面细节。想象一下&#xff0c;当您需要检测一个汽车发动机缸体的内部结构&#xff0c;或者重建一…...

终极指南:如何用 PHP Steam API 包轻松集成 Steam 游戏数据

终极指南&#xff1a;如何用 PHP Steam API 包轻松集成 Steam 游戏数据 【免费下载链接】Steam A composer package to make use of the steam web api. 项目地址: https://gitcode.com/gh_mirrors/stea/Steam 想要在你的 PHP 或 Laravel 应用中集成 Steam 游戏数据吗&a…...

DLSS Swapper完全指南:5步实现游戏性能自由切换

DLSS Swapper完全指南&#xff1a;5步实现游戏性能自由切换 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾因游戏更新后DLSS版本不兼容导致帧率下降而烦恼&#xff1f;是否想要尝试新版本DLSS功能却发现手动替…...

SMUDebugTool终极指南:AMD Ryzen系统硬件调试与性能优化的完整解决方案

SMUDebugTool终极指南&#xff1a;AMD Ryzen系统硬件调试与性能优化的完整解决方案 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目…...

终极指南:五分钟让Win11老游戏重获联机能力的完整解决方案

终极指南&#xff1a;五分钟让Win11老游戏重获联机能力的完整解决方案 【免费下载链接】ipxwrapper 项目地址: https://gitcode.com/gh_mirrors/ip/ipxwrapper 还在为Win11系统下无法联机玩《星际争霸》《魔兽争霸2》《暗黑破坏神》等经典游戏而烦恼吗&#xff1f;今天…...

构建智能压枪系统:罗技鼠标宏的底层技术与实战优化

构建智能压枪系统&#xff1a;罗技鼠标宏的底层技术与实战优化 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 问题剖析&#xff1a;后坐力控制的…...

从‘古董’协议到云存储桥梁:聊聊FTP在现代开发中的那些‘真香’应用场景

从‘古董’协议到云存储桥梁&#xff1a;聊聊FTP在现代开发中的那些‘真香’应用场景 当谈到文件传输协议时&#xff0c;很多人第一反应可能是"这不是上个世纪的技术吗&#xff1f;"。确实&#xff0c;FTP(File Transfer Protocol)诞生于1971年&#xff0c;比大多数程…...

gInk:重新定义屏幕标注体验的轻量化协作工具

gInk&#xff1a;重新定义屏幕标注体验的轻量化协作工具 【免费下载链接】gInk An easy to use on-screen annotation software inspired by Epic Pen. 项目地址: https://gitcode.com/gh_mirrors/gi/gInk 远程会议中&#xff0c;当产品经理试图在共享屏幕上圈出设计稿的…...

Fay-UE5数字人系统架构深度解析:基于Unreal Engine 5的实时交互虚拟人技术实现

Fay-UE5数字人系统架构深度解析&#xff1a;基于Unreal Engine 5的实时交互虚拟人技术实现 【免费下载链接】fay-ue5 项目地址: https://gitcode.com/gh_mirrors/fa/fay-ue5 Fay-UE5是一个基于Unreal Engine 5引擎构建的高性能数字人解决方案&#xff0c;通过深度集成F…...