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);
和其他变体,它们只是不起作用。我什至可以输出未填充的矩形,但只能输出白色。
gl_FragColor
是vec4
。您应该明确定义其类型。此外,这些颜色已标准化,这意味着它们的范围从 0.0f
到 1.0f
。
这应该有效:
vec3 green = vec3(0, 1.0f, 0);
gl_FragColor = vec4(green, 1);
一些东西逗号运算符(https://en.wikipedia.org/wiki/Comma_operator)。表达式
(green, 1)
的计算结果仅为 1
。所以你的代码实际上是gl_FragColor = 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,而其他图形驱动程序则更严格地遵守规范,并且在编译着色器时只会返回错误。您可以在我的文章前面找到允许的隐式转换的列表。