GLSL片段着色器输出类型

use*_*794 2 opengl framebuffer glsl

假设我遇到这样的问题:现在我有一个帧缓冲区,并且纹理只包含一个颜色组件(例如,GL_RED)已经绑定到它.片段着色器会是什么样的?我想答案是:

......浮出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指定为像素数据格式的含义是什么?

Nic*_*las 6

就像顶点着色器输入不必匹配glVertexAttribPointer指定的数据的确切大小一样,片段着色器输出也不必与它们正被写入的图像的确切大小相匹配.如果输出提供的组件多于目标图像格式,则忽略额外组件.如果它提供的更少,则其他组件具有未定义的值(与顶点输入不同,其中未指定的值具有明确定义的值).

将GL_RGB指定为像素数据格式的含义是什么?

这是像素传输格式.这描述了您为OpenGL提供的像素格式,而不是OpenGL将它们存储为的格式.

你应该总是使用大小的内部格式,而不是像unsised那样的格式GL_RED.