使用 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) 版本 -- 最新版本] 总是反复显示以下不断闪烁的噪音模式:
现在,为了进行一些实验,我稍微改变了 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 现在总是重复地产生一种完全不同但仍然不断闪烁的噪声模式:
我是否必须怀疑(又一个)英特尔 GL 驱动程序错误,或者您是否看到我的 GLSL 代码有任何问题——不是从漂亮的角度来看(它是着色器代码生成实验项目的一部分),而只是从规范正确性的角度来看看法?