2

编辑:我很抱歉 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 卡打开“标准”模式?

4

1 回答 1

1

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

于 2012-05-16T18:38:52.453 回答