当前位置:网站首页>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则需要通过数据分析数据。

原网站

版权声明
本文为[刘敬一如]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_54831038/article/details/125911813