GLSL片段着色器输出类型

问题描述 投票:2回答:2

假设我遇到这样的问题:现在我有一个帧缓冲区,并且纹理仅包含一个颜色分量(例如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分配为像素数据格式是什么意思?

opengl glsl framebuffer
2个回答
6
投票

就像vertex shader inputs不必与glVertexAttribPointer指定的数据的确切大小匹配,fragment shader outputs不必与要写入的图像的确切大小匹配。如果输出提供的成分多于目标图像格式,则多余的成分将被忽略。如果提供的数量较少,则其他组件具有不确定的值(与顶点输入不同,其中未指定的值具有明确的值)。

将GL_RGB分配为像素数据格式是什么意思?

这是pixel transfer format。它描述了您要提供给OpenGL的像素格式,而不是OpenGL将其存储为的格式。

您应始终使用sized internal formats,而不是像GL_RED之类的大小不限的数字。


3
投票

有关内部格式和格式的详细说明,请参阅:

http://opengl.org/wiki/Image_Formathttp://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节(着色器执行),第441页-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. 341].

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

© www.soinside.com 2019 - 2024. All rights reserved.