GLSL片段着色器输出类型

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

... out float ex_color;

ex_color = ...;

下面是我的问题:着色器会自动检测framebuffer的格式并将值写入它吗? 如果片段着色器输出浮点值,但帧缓冲格式为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分配为像素数据格式的含义是什么?


就像顶点着色器输入不必与glVertexAttribPointer指定的数据的确切大小相匹配,片段着色器输出不必与它们正在写入的图像的确切大小相匹配。 如果输出提供的组件比目标映像格式多,则会忽略额外的组件。 如果它提供的数量较少,那么其他组件具有未定义的值(与顶点输入不同,未指定的值具有明确定义的值)。

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

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

您应该始终使用大小适中的内部格式,而不是像GL_RED那样未格式化的格式。


有关内部格式和格式的正确说明,请参阅:

http://opengl.org/wiki/Image_Format和http://opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml。

您基本上需要GL_RED格式,并且可能需要GL_R8(无符号标准化的8位定点)作为内部格式。

很久以前,亮度纹理是单通道的常态,但在现代GL中这是一种不推荐的格式,红色现在是单通道的逻辑“可绘制”纹理格式,就像红/绿是最合理的格式一样为双通道。

至于你的着色器,核心规范定义了组件扩展的规则。 如果您将具有1个通道的纹理作为输入,但将其作为vec4进行采样,则它将等同于:vec4(RED,0.0,0.0,1.0)。

写入纹理有点不同。

从OpenGL 4.4规范,第15.2节(着色器执行),第262页 - http://www.opengl.org/registry/doc/glspec44.core.pdf

When a fragment shader terminates, the value of each active user-defined output variable is written to components of the fragment color output to which it is bound. The set of fragment color components written is determined according to the variable's data type and component index binding, using the mappings in table 11.1 [pp. 340].

默认情况下,如果你的片段着色器的输出是一个浮点数,它将写入你纹理的x(红色)分量。 您可以使用布局限定符(例如layout(component = 1)out float color;)指定它应该写入y(绿色),z(蓝色)或w(alpha)(假设您具有RGBA纹理)。

链接地址: http://www.djcxy.com/p/38537.html

上一篇: GLSL fragment shader output type

下一篇: Mipmapping in OpenGL