【问题标题】:GLSL frag shader - only works on nVidia, non-standard code?GLSL 片段着色器 - 仅适用于 nVidia,非标准代码?
【发布时间】:2012-05-10 20:46:39
【问题描述】:

编辑:对不起 Stack Overflow,但我是智障。 frac(tex_offset) -> fract(tex_offset),当现在指定 #version 时,它可以在 ATI 卡和 nVidia 卡上正常工作。这一定是我认识的大多数程序员头发不多的原因。

-

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

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 卡打开“标准”模式?

【问题讨论】:

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

标签: opengl glsl sfml


【解决方案1】:

将frac(tex_offset) 更改为fract(tex_offset),它可以在ATI 卡上正常工作,现在指定#version 时也可以在nVidia 卡上工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多