Opengl GLSL frag着色器-仅适用于nVidia,非标准代码?

Opengl GLSL frag着色器-仅适用于nVidia,非标准代码?,opengl,glsl,sfml,Opengl,Glsl,Sfml,编辑:很抱歉堆栈溢出,但我是弱智frac(tex_offset)->fract(tex_offset),当现在指定#版本时,它在ATI卡和nVidia卡上都可以正常工作。这就是为什么我认识的大多数程序员都没有多少头发了 - 我正在为一个学校项目做一个游戏。这是一个垂直滚动条,所以其中一个必需的功能是滚动背景。我尝试了几种方法,但最终我编写了一个简单的片段着色器(这是我第一次接触着色器编程,所以我真的不知道我在做什么): 我使用,所以我不会在幕后接触很多东西,但是我使用的纹理会传递给tex变量,并

编辑:很抱歉堆栈溢出,但我是弱智
frac(tex_offset)
->
fract(tex_offset)
,当现在指定
#版本时,它在ATI卡和nVidia卡上都可以正常工作。这就是为什么我认识的大多数程序员都没有多少头发了

-

我正在为一个学校项目做一个游戏。这是一个垂直滚动条,所以其中一个必需的功能是滚动背景。我尝试了几种方法,但最终我编写了一个简单的片段着色器(这是我第一次接触着色器编程,所以我真的不知道我在做什么):

我使用,所以我不会在幕后接触很多东西,但是我使用的纹理会传递给
tex
变量,并且
tex\u偏移量
会在我的游戏循环中通过将总运行秒数乘以控制滚动速度的因子来生成

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


所以,试着用疑问的形式来表达这个问题:这个着色器代码有什么错?有什么方法可以调试语法吗?如果可能的话,我如何为我的nVidia卡打开“标准”模式?

frac(tex_offset)
更改为
fract(tex_offset)
,它在ATI卡上运行良好,现在指定了#版本时也可以在nVidia卡上运行

也许版本140不支持@SAKrisT我不这么认为-我已经系统地尝试了版本110、120、130、140、150、330、400、410和420。事实上,只有当我完全省略了
#version
标签时,它才起作用。如果你自己找到了正确的解决方案,而现有答案都没有给出,那么发布(并接受)你自己问题的答案是完全有效的。这比编辑原始问题要好得多。@Wedvich:你知道着色器/着色器程序在编译过程中会生成信息日志,对吧(
glGetShaderInfoLog
/
glGetProgramInfoLog
)?编译着色器时,请检查返回代码,如果着色器编译失败,请打印编译日志。这样,您就可以找出ATI卡的问题所在。Ati卡在着色器编译方面非常严格,而nvidia卡则过于宽松。NVidia允许许多非标准功能(如着色器中的0.0f),但会将警告打印到着色器/程序日志中。因此,您肯定应该将着色器/程序日志保存在某个地方。@SigTerm:我不知道,谢谢!:)
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);
}