【发布时间】:2013-07-30 10:05:26
【问题描述】:
假设我遇到了这样的问题:现在我有一个帧缓冲区,而一个纹理只包含一个颜色分量(例如,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赋值为像素数据格式是什么意思?
【问题讨论】:
-
我认为
GL_RED不是有效的内部格式。你需要的是一个真实大小的内部格式(很可能是GL_R8)。 -
所以这就是我感到困惑的地方。但毕竟这个样本在我运行它时运行良好。并且能详细解释一下函数 glTexImage2D 的内部格式、格式和类型吗?
-
“所以这就是我感到困惑的地方。” - 这不是你真正感到困惑的唯一事情。但是我现在没有时间对所有这些东西做出一个好的大规模解释,所以我希望 Nicol Bolas、datenwolf 或其他人跳进去,对所有这些问题给出真正的答案。
-
@ChristianRau:注意
GL_RED是有效的内部格式。这不是一个好的;您应该始终使用具有明确大小的内部格式。 -
@NicolBolas 哦,我认为 RG 纹理是在非大小的通用格式已经被认为是一个坏主意并且引入通用 RG 格式时引入的(即使那样我也会认为它是
GL_R而不是GL_RED)。我认为GL_RED仅适用于客户端像素格式。感谢您的澄清。
标签: opengl glsl framebuffer