2022年7月17日 上午9点半
在实现了单项纹理应用后,想实践,多项纹理叠加组合。
1.bug状态:控制台有一些提示报错
分析:这一部分代码实现不完整,没有设置纹理单元以获取值。
2.bug状态:location获取不了shader程序的ID,但这两种方法理论上都没问题 (1)将获取ID的方法,封装成Shader类的成员方法 (2)通过Shader类,获得成员变量ID
分析:方法(1)局部封装思想vec4(vec3,1.0) 但是把glUniform1i错写成了glUniforml1。
方法(2)因为将类成员设成私有,所以不可访问。
另外这暴露了Shader的ID信息,不是一个好方法。
解决:查dos.gl查文档,研究了下函数的参数。ID是调用该Shader程序的句柄。在理论没有问题的前提下,应围绕错误展开分析。而去博客找相关解决办法,是浪费时间的。信息不够精准。
3.bug状态:两张纹理在片段着色器和在主函数调用时,名字不统一,另外一个二元坐标和一个思四元坐标不能对应处理。
分析:片段着色器程序是实参,而主函数也是实参,应要保持参数统一。虽然导入两张纹理和一张纹理方法和步骤是类似的,但是在处理上是不同的,需要设置纹理单元,考虑叠加顺序以及纹理环绕方式等等。
4.bug状态:只显示一张纹理,非叠加效果。
分析:图片读入问题,打断点调试,读取成功,排除。于是猜测可能第一张图片是被覆盖了。尝试删掉一张图片,发现总是显示第二张,确定bug原因。
解决:两张图片不能连续读取,需要在绑定第一张后再读取第二张。原因:因为两张图片用的是一个指针,存在调用顺序问题。
总结:今天找Bug花了接近两个小时。浪费在了和OpenGL文档比对上,我应该加强代码框架的阅读能力。先自己实现,再去对照源代码的思路。
另外,也发现了解决问题时的针对性不高,如果在理论上行得通,其实找bug就更容易。一种是语法方面,一种是步骤是否完整。改错时思路不要过于发散。一条路行不通,不要反反复复无目的尝试。
学习方法:代码是第一位的。理论是辅助的。不搞文字概念,只解决实际问题。每日把对应OpenGL的练习完成。