假设我有这样的问题:现在我有一个帧缓冲区和一个只包含一种颜色组件(例如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分配为像素数据格式的含义是什么?
``` ... 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分配为像素数据格式的含义是什么?
GL_RED
不是一个有效的内部格式。你需要一个真正具有大小的内部格式(很可能是GL_R8
)。 - Christian RauGL_RED
是一个有效的内部格式。只是不是一个好的格式;您应该始终使用具有显式大小的内部格式。 - Nicol BolasGL_R
而不是GL_RED
)。我认为GL_RED
仅适用于客户端像素格式。感谢您的澄清。 - Christian Rau