使用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)。
然而,英特尔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做了正确的事情,而英特尔HD现在总是重复产生一种相当不同但仍然不断闪烁的噪音模式:
我必须怀疑(又一个)英特尔GL驱动程序错误,或者您是否看到我的GLSL代码有任何问题 - 不是从美观的角度来看(它是着色器代码生成实验项目的一部分)但仅从规范正确的角度来看?
答案 0 :(得分:3)
我认为将“out”颜色作为参数发送到另一个函数看起来很奇怪。我会改写这样的东西:
void main () {
vec3 col = vec3(0f,0f,0f);
col = fx_RedTest(col);
col = fx_Grayscale(col);
out_Color = col;
}
它有什么不同吗?