gpt4 book ai didi

opengl - 为什么这个 GLSL 着色器在 GeForce 上可以正常工作,但在 Intel HD 4000 上却奇怪地闪烁?

转载 作者:行者123 更新时间:2023-12-04 05:11:48 25 4
gpt4 key购买 nike

使用 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 代码有任何问题 -- 不是从美观的角度来看 (它是着色器代码生成实验项目的一部分)但仅来自 规范正确性 观点?

最佳答案

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

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

它有什么区别吗?

关于opengl - 为什么这个 GLSL 着色器在 GeForce 上可以正常工作,但在 Intel HD 4000 上却奇怪地闪烁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14834180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com