2

使用 OpenGL 3.3 核心配置文件,我使用以下着色器通过gl.DrawArrays(gl.TRIANGLES, 0, 3)渲染全屏“四边形”(作为单个超大三角形) 。

顶点着色器:

#version 330 core
#line 1

vec4 vx_Quad_gl_Position () {
    const float extent = 3;
    const vec2 pos[3] = vec2[](vec2(-1, -1), vec2(extent, -1), vec2(-1, extent));
    return vec4(pos[gl_VertexID], 0, 1);
}

void main () {
    gl_Position = vx_Quad_gl_Position();
}

片段着色器:

#version 330 core
#line 1
out vec3 out_Color;

vec3 fx_RedTest (const in vec3 vCol) {
    return vec3(0.9, 0.1, 0.1);
}

vec3 fx_Grayscale (const in vec3 vCol) {
    return vec3((vCol.r * 0.3) + (vCol.g * 0.59) + (vCol.b * 0.11));

}

void main () {
    out_Color = fx_RedTest(out_Color);
    out_Color = fx_Grayscale(out_Color);
}

现在,代码可能看起来有点奇怪,目前的目的可能看起来毫无用处,但这不应该对 GL 驱动程序进行调整。

在 GeForce 上,按预期获得灰屏。即,应用于硬编码颜色“红色”(0.9、0.1、0.1)的“灰度效果”。

但是,Intel HD 4000 [驱动程序 9.17.10.2932 (12-12-2012) 版本 -- 最新版本] 总是反复显示以下不断闪烁的噪音模式:shot01

现在,为了进行一些实验,我稍微改变了 fx_Grayscale() 函数——实际上它应该产生相同的视觉结果,只是编码略有不同:

vec3 fx_Grayscale (const in vec3 vCol) {

    vec3 col = vec3(0.9, 0.1, 0.1);
    col = vCol;
    float x = (col.r * 0.3) + (col.g * 0.59) + (col.b * 0.11);
    return vec3(x, x, x);
}

同样,Nvidia 做了正确的事情,而 Intel HD 现在总是重复地产生一种完全不同但仍然不断闪烁的噪声模式:shot02

我是否必须怀疑(又一个)英特尔 GL 驱动程序错误,或者您是否看到我的 GLSL 代码有任何问题——不是从漂亮的角度来看(它是着色器代码生成实验项目的一部分),而只是从规范正确性的角度来看看法?

4

1 回答 1

3

我认为将“out”颜色作为参数发送给另一个函数看起来很奇怪。我会像这样重写它:

void main () {
    vec3 col = vec3(0f,0f,0f);
    col = fx_RedTest(col);
    col = fx_Grayscale(col);
    out_Color = col;
}

它有什么不同吗?

于 2013-02-12T14:03:19.147 回答