当前位置:网站首页>Debug No5基础光照
Debug No5基础光照
2022-07-23 06:10:00 【刘敬一如】
2022年下午15:14
1.bug状态:不显示渲染。报错提示顶点着色器和片段着色器编译失败。
分析:Asset数据没问题,组件生产线可能会出现问题,第一步就是initModel(),然后是initShader().再者就是rend()中的顺序问题,按步骤依次检查。


解决:发现一处initShader()是通过cube着色器调用。经再检验发现,因为包装的组件名,与类的成员函数同名冲突,而使此处调用的不是用于编译两个立方体shader的组件方法,而是只调用了一个编译立方体shader的成员方法。
收获:封装时的命名要避免冲突。成员方法通过类对象调用,普通函数直接调用即可。可见基础不扎实。
2.bug状态:只显示一个(渲染完整的)cube立方体,而不显示光源立方体。

分析:虽然传入的顶点属性有位置和UV。但是我认为对于光源立方体来说可以省略纹理和UV信息。所以这里存在的问题一定是,我设置的读取了过多的属性信息,而在rend()环节没有解析着色器中对应变量。或者是我读取的着色器中缺少了属性信息,却解析了一些着色器中不存在的变量。但是无论那种,我都没有看到VS编译器有报错,除非关于着色器的错误是打开着色器文件的错误或着色器及其明显的语法错误。

解决:删除了着色器中的纹理等多余变量,在rend()环节没有绑定纹理。
收获:其实着色器读取数据是十分灵活的,比如顶点属性的原生数据有纹理,位置,颜色的数据的时候,但是我可以在顶点着色器中只接收我可能会用到的数据。比如光源立方体的顶点着色器中只接收了位置信息并且在渲染时我也不用对其他用不到的属性信息进行处理。

void rend()
{
//缓冲区
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
//描述摄像机
_projMatrix = glm::perspective(glm::radians(45.0f), 1.0f, 0.1f, 100.0f); //定制投影矩阵
_camera.update(); //实时更新摄像机矩阵
cube_shader.shader_Begin();
//资源说明
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _texture);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, _texture2);
glm::mat4 _modelMatrix(1.0f);
//解析着色器 变量,并传入数据
cube_shader.setMatrix("_modelMatrix", _modelMatrix);
cube_shader.setMatrix("_viewMatrix", _camera.getMatrix());//给对应名字的矩阵传入数据
cube_shader.setMatrix("_projMatrix", _projMatrix);
cube_shader.setInt("_texture", 0);
cube_shader.setInt("_texture2", 1);
//绑定顶点数组,绘制轮廓
glBindVertexArray(VAO_cube);
glDrawArrays(GL_TRIANGLES, 0, 36);
cube_shader.shader_End();
sun_shader.shader_Begin();
//解析着色器 变量,并传入数据
sun_shader.setMatrix("_modelMatrix", _modelMatrix);
sun_shader.setMatrix("_viewMatrix", _camera.getMatrix());//给对应名字的矩阵传入数据
sun_shader.setMatrix("_projMatrix", _projMatrix);
_modelMatrix = glm::translate(_modelMatrix, glm::vec3(3.0f, 0.0f, 0.0f));
sun_shader.setMatrix("_modelMatrix", _modelMatrix);
//绑定顶点数组,绘制轮廓
glBindVertexArray(VAO_sun);
glDrawArrays(GL_TRIANGLES, 0, 36);
sun_shader.shader_End();
}总结:在把握完知识的基础框架和细化框架后,总结出了整体框架后,就应该多去巩固练习。提高熟练度。
3.bug3 :渲染效果,光线偏蓝。(光照强度设置 从0.5--1.0---1.5)但颜色和原图对比明现不正确。

分析:我猜测是由于光源颜色读入不正确,但是检查多次流程未发现数据有误。在RenderDoc中,提示顶点着色器编译有问题。。。经过输出光源,发现光源是蓝色了,但是经过观察发现这种蓝色不是巧合,而是(1.0f)的蓝+(1.0f)的绿调和成的蓝。而且我调节图二中的红色值,无论怎样都不起作用,但是蓝色值和绿色值可用。于是把这两者联系到一起,恍然大悟!原来是初始化传过的红色值顶掉了赋值时的红色值,使赋值时的红色无效。
//发生bug前代码
glm::vec3 ligntColor(1.0f);
//这种写法的意思是只换了1.0f的红色,其余颜色未传。
//这与glm::mat3(1.0f)的写法有区别,后者意为传入一个单位矩阵。


解决方法:声明光源颜色和光源位置的时候,不要将初始化写成 glm::vec3 light_color(1.0f);而是在下面重新赋值。或者直接初始化成目标值。
但一直没解决RenderDoc中的报错。提示是API用的不规范。原因还未探明。

收获:检验是实践真理的唯一标准,任何细节都不要放过蛛丝马迹。另外对于glm::vec3这个数据是C++数据,而uniform是从CPU直接传向GPU的数据,所以需要单独在着色器中解析变量。但uniform变量的数据与uniform无关,只会影响传输方式。
4.bug状态:漫反射下cube失去纹理。
分析:说明是纹理出现了错误,第一步着色器读取数据有问题,于是检查了顶点属性指针,发现偏移量取错,修改过后颜色正常。
最后总结: 我需要提升一种能力,就是将错误概括成专业术语的能力。比如:未达到预期渲染的bug状态有很多种,但是只有一种精准的概括。代码能力和debug能力的提升,是个不断精简要求的过程。前几日bug都是流程类型的容易改,但是现在的bug则需要通过数据分析数据。
边栏推荐
- 转行软件测试有学历要求吗?低于大专是真的没出路吗?
- 倍福PLC和C#通过ADS通信传输Bool数组变量
- 信号完整性(SI)电源完整性(PI)学习笔记(三十一)电源分配网路(三)
- 谈谈学习和工作——钱学森
- Beifu PLC and C transmit int array type variables through ads communication
- 第八天笔记
- 从List<Map>中截取指定的范围数据集合
- Signal integrity (SI) power integrity (PI) learning notes (32) power distribution network (4)
- 【JZOF】07 重建二叉树
- Outlook tutorial, how to switch calendar views and create meetings in outlook?
猜你喜欢

Opencv image processing (medium) image smoothing + histogram

Outlook tutorial, how to switch calendar views and create meetings in outlook?

OpenCV图像处理(下) 边缘检测+模板匹配+霍夫变换

第八天笔记

Convert the specified seconds to minutes and seconds

Confused, work without motivation? Career development hopeless? It's enough to read this article

聊聊研发团队中的“人”

高压MOS管KNX42150 1500V/3A 应用于变频器电源-逆变器等

JVM detailed parsing

将指定秒转为时分秒格式
随机推荐
【JZOF】08 二叉树的下一个结点
Common scheduled cron expressions for scheduled tasks
Outlook tutorial, how to switch calendar views and create meetings in outlook?
[ACTF2020 新生赛]BackupFile 1
EasyGBS平台出现录像无法播放并存在RTMP重复推流现象,是什么原因?
Redis如何实现持久化?详细讲解RDB的三种触发机制及其优缺点,带你快速掌握RDB
北汇信息12岁啦|Happy Birthday
倍福PLC和C#通过ADS通信传输int类型变量
[jzof] 07 rebuild binary tree
[jzof] 09 realize queue with two stacks
成功 万象奥科与CODESYS技术联合调测
OpenCV图像处理(上)几何变换+形态学操作
Compilation and preprocessing
分类模型的评估
将指定秒转为时分秒格式
倍福PLC和C#通过ADS通信传输int数组类型变量
射击 第 1-3 课:图像精灵
How does redis implement persistence? Explain in detail the three triggering mechanisms of RDB and their advantages and disadvantages, and take you to quickly master RDB
Offer II 094. Minimum palindrome segmentation
Communicate 11 tips for poor performance