当前位置:网站首页>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则需要通过数据分析数据。
边栏推荐
- EasyGBS平臺出現錄像無法播放並存在RTMP重複推流現象,是什麼原因?
- Beifu PLC and C transmit string array type variables through ads communication
- Jenkins持续集成报错stderr: fatal: unsafe repository (‘/home/water/water‘ is owned by someone else)
- Functional testing to automated testing, sharing ten years of automated testing experience
- What happens when you enter the web address and the web page is displayed
- 第七天笔记
- [jzof] path in matrix 12
- The relationship between method area, perpetual generation and meta space
- Outlook 教程,如何在 Outlook 中切换日历视图、创建会议?
- 谈谈学习和工作——钱学森
猜你喜欢

CORTEX-A系列处理器

网易白帽子黑客训练营笔记(2)

Talk about "people" in the R & D team

Current limiting based on redis+lua

MySQL----复合查询 外连接

【NOI模拟赛】不知是哪一道CF的论文题(概率期望,鞅的停时定理)

功能测试转自动化测试,十年自动化测试经验分享

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

信号完整性(SI)电源完整性(PI)学习笔记(三十二)电源分配网路(四)

谈谈学习和工作——钱学森
随机推荐
What happens when you enter the web address and the web page is displayed
Summary of time complexity( Ο Is the asymptotic upper bound, Ω is the asymptotic lower bound, P, NP, NP hard, NPC problem)
Quelle est la raison pour laquelle la plate - forme easygbs ne peut pas lire l'enregistrement vidéo et a un phénomène de streaming répété rtmp?
UI automation
第七天笔记
Beihui information is 12 years old | happy birthday
信號完整性(SI)電源完整性(PI)學習筆記(三十二)電源分配網路(四)
当输入网址后,到网页显示,期间发生了什么
MySQL----复合查询 外连接
【日常训练】814. 二叉树剪枝
分类模型的评估
[noi simulation race] I don't know which CF paper title it is (probability expectation, martingale's stop time theorem)
高压MOS管KNX42150 1500V/3A 应用于变频器电源-逆变器等
OpenCV图像处理(上)几何变换+形态学操作
[jzof] 10 Fibonacci series
Space shooting part 1: player spirit and control
CAN控制器的位同步过程
[jzof] 08 next node of binary tree
第九天笔记
JVM内存模型简介