GLSL frag shader - 仅适用于nVidia,非标准代码?

时间:2012-05-01 09:19:54

标签: opengl glsl sfml

编辑:我很抱歉Stack Overflow,但我很迟钝。 frac(tex_offset) - > fract(tex_offset),它现在可以在ATI卡和nVidia卡上运行正常,当时指定#version。这就是为什么我认识的大多数程序员都没有留下太多头发的原因。

-

我正在为一个学校项目开发游戏。它是一个垂直滚动条,因此所需的功能之一是滚动背景。我尝试了一些方法,但最终我写了一个简单的片段着色器(这是我第一次触摸着色器编程,所以不知道我在做什么):

uniform sampler2D tex;
uniform float tex_offset;

void main()
{
    vec2 coords = vec2(gl_TexCoord[0].s, gl_TexCoord[0].t - frac(tex_offset));
    gl_FragColor = texture2D(tex, coords);
}

我使用SFML所以我不会触及幕后的大部分内容,但我正在使用的纹理传递给tex变量,tex_offset是通过将经过的总秒数乘以一个因子来控制滚动速度,在我的游戏循环中生成。

这似乎做了它应该做的事情;它无限制地在一个方向上滚动无缝重复纹理。它适用于我的笔记本电脑,它可以在我的家用电脑上运行,它们都有nVidia卡。但是,当我们尝试使用ATI卡在组成员的计算机上运行它时,它什么也没做。我做了一些谷歌搜索,似乎nVidia卡也接受“非标准”GLSL代码,这可能解释兼容性问题。我发现很难在GLSL上找到很好的教程/解释,因为我挖掘的大部分内容都来自版本1.2-1.4而且我显然使用的是版本3中不推荐使用的语法(gl_FragColor,gl_TexCoord)。但是,当我尝试将#version设置为120或140或其他时,着色器也停止在我的nVidia计算机上工作。

因此,尝试将此词语置于问题形式:此着色器代码有什么问题?有没有办法调试语法,如果可能的话,如何打开我的nVidia卡的“标准”模式?

1 个答案:

答案 0 :(得分:1)

frac(tex_offset)更改为fract(tex_offset),它在ATI卡上运行正常,并且在现在指定#version时也适用于nVidia卡。