假设我遇到这样的问题:现在我有一个帧缓冲区,并且一个纹理仅包含一个已绑定(bind)到它的颜色组件(例如,GL_RED)。片段着色器会是什么样子?我猜答案是:
... out float ex_color;
ex_color = ...;
我的问题是:着色器会自动检测帧缓冲区的格式并向其写入值吗?如果片段着色器输出浮点值但帧缓冲区格式为 GL_RGBA 会怎样?
顺便问一下,创建只有一个组件的纹理的正确方法是什么?我阅读了 g-truc 中的示例,其中有一个如下示例:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED,GLsizei(Texture.dimensions().x), GLsizei(Texture.dimensions().y), 0,GL_RGB, GL_UNSIGNED_BYTE, 0);
指定 GL_RGB 作为像素数据格式是什么意思?
最佳答案
就像 vertex shader inputs不必与 glVertexAttribPointer fragment shader outputs 指定的数据的确切大小匹配不必与要写入的图像的确切大小相匹配。如果输出提供的组件多于目标图像格式,则多余的组件将被忽略。如果它提供的值较少,则其他组件具有未定义的值(与顶点输入不同,其中未指定的值具有明确定义的值)。
What's the meaning of assign GL_RGB as pixel data format?
这就是pixel transfer format 。它描述了您提供给 OpenGL 的像素格式,而不是 OpenGL 存储它们的格式。
您应该始终使用sized internal formats ,而不是像 GL_RED
这样的未调整大小的。
关于opengl - GLSL 片段着色器输出类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17943984/