2022年7月15日 下午 单项应用纹理程序
1.Bug状态:只有一张深绿色背景。
分析:以PS作为类比来分析。首先,说明生成窗口没有问题。没有出现预期得图形,说明绘制轮廓出现问题。(即顶点位置装配出现问题)
解决,经检查发现EBO没有传入相关数据。
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);
2.Bug状态,显示出一个黑色矩形。
分析:显示出正确得轮廓发现,即图元装配正确,着色环节出现问题。
重点检查着色器得代码,以及纹理绑定环节(initTexture()).
解决:发现没有 声明全局纹理变量 。在rend()环节也没有 绑定纹理 绘制。
3.Bug状态,显示出一张采样信息错误的图片,没有纹理信息。
![]()
目标纹理 ![]()
Bug纹理
分析:发现Bug纹理里面有红黄绿,但是却无法识别图像。明确是采样的问题。又换了其他的图测试,发现有大量留白。推测黑色部分信息缺失。
解决:发现采样格式上设定为了GL_RGB,而不是RGBA,导致没有深度信息。
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,_pImage->getWidth(),_pImage->getHeight(),0,GL_RGBA,GL_UNSIGNED_BYTE,_pImage->getData());
总结:对于实现纹理的操作流程不熟练。要善于把握结构。
另外要注意细节的模仿。
OpenGL流水线:
Aseet区 ---->封装生产线(组装各种组件) ---->组件装配区
(1) Asset区,主要包含全局变量的声明,shaderProgram,VAO,VBO等,以及一些外部导入的资源_texture.
(2)封装生产线(组装各种组件)主要包含initModel , initTexture,initShader方法,shader源代码等等。这些方法封装了各个渲染需要的组件的的调用,而具体方法的复杂实现在其对应的类中(如shader类中的编译shader方法,ffImage类中的读取纹理图片等等)。
(3)组件装配区 主要指rend功能。这个过程可以假想成PS内的绘图功能,选定图层,选择画笔样式,设置绘制轮廓(指定数据),设置绘制方式。
除这三大部分以外,其余的代码就组成状态机的初始结构,基本不会出BUG。所以在Debug时可以从这三个角度入手。
对一个组件来说,主要要处理 数据传输问题(包括C++传入shader及shader之间的数据传输)。组件生产线问题(一般需要对应相应的类,易于管理和信息封装)。调用组件(需要设置调用顺序,绘制流程)这一块我不熟练,以后要多总结规律。