如何在glsl片段着色器中正确设置像素颜色?

问题描述 投票:0回答:3
uniform sampler2D textureY;
        uniform sampler2D textureUV;
        uniform int rect_width;
        layout(origin_upper_left) in vec4 gl_FragCoord;
        void main(void)
        {
        vec3 yuv; 
        vec3 rgb; 
        yuv.x = texture2D(textureY, textureOut.st).r - 0.0625; 
        yuv.y = texture2D(textureUV, textureOut.st).r - 0.5; 
        yuv.z = texture2D(textureUV, textureOut.st).g - 0.5; 
        rgb = mat3( 1,       1,         1, 
                    0,       -0.39465,  2.03211, 
                    1.13983, -0.58060,  0) * yuv; 
        gl_FragColor = vec4(rgb, 1);  //This Works, output is correct texture
  
  vec3 green = vec3(0, 255, 0); 
  //vec3 green = vec3(0, 0.5, 0); //doesnt help too
  //vec3 green = vec3(0, 100.5, 0); //doesnt help too
  //vec3 green = vec3(0, 100.5f, 0); //write warning, doesnt help too
         int width = rect_width; 
        gl_FragColor = (green, 1);//whole sceen became white  
  if(TL;DR) gl_FragColor = (green, 1); //Creates desired rectangle but white color not green        
  }

OpenGL 3.3,如果需要的话可以使用 Qt。我可以正常绘制纹理,但是当我显式更改片段的颜色时,无论我使用哪个参数,它总是变成白色。
我试过了

vec3 green = vec3(0, 0.5, 0);
gl_FragColor = (green, 1);

vec3 green = vec3(0, 255, 0);
gl_FragColor = (green, 1);

和其他变体,它们只是不起作用。我什至可以输出未填充的矩形,但只能输出白色。

opengl colors glsl shader
3个回答
2
投票

gl_FragColor
vec4
。您应该明确定义其类型。此外,这些颜色已标准化,这意味着它们的范围从
0.0f
1.0f

这应该有效:

vec3 green = vec3(0, 1.0f, 0);
gl_FragColor = vec4(green, 1);

2
投票

一些东西逗号运算符https://en.wikipedia.org/wiki/Comma_operator)。表达式

(green, 1)
的计算结果仅为
1
。所以你的代码实际上是
gl_FragColor = 1;
。如果想要向量类型表达式,则必须指定向量类型。


1
投票

来自您的代码:

gl_FragColor = (green, 1);//whole sceen became white  

该赋值使用了 逗号运算符,这使得表达式返回 1。因此,您实际上是将 1 赋值给 gl_FragColor

根据GLSL 150的规格,适用于OpenGL 3.2

out vec4  gl_FragColor;                    // deprecated

在允许的隐式转换列表中您的 int (1) 到 vec4 不存在。

所以我们需要先解决这个问题, 示例解决方案:

gl_FragColor = vec4(green.rgb, 1.0);

下一个问题是绿色的值。 OpenGL 期望 gl_FragColor 包含标准化的颜色值。 (我无法轻易找到一个明显的来源来说明这一点)

更改绿色以满足这些要求将导致如下结果:

vec3 green = vec3(0.0, 1.0, 0.0);
gl_FragColor = vec4(green.rgb, 1.0);

注意: 赋值时要注意类型。某些图形驱动程序允许您将例如:1 或 vec3 分配给 gl_FragColor,而其他图形驱动程序则更严格地遵守规范,并且在编译着色器时只会返回错误。您可以在我的文章前面找到允许的隐式转换的列表。

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