c++/OpenGL/GLSL,带有 "random" 工件的纹理

c++/OpenGL/GLSL, textures with "random" artifacts

想知道是否有人遇到过这种情况并知道原因。使用 "texture arrays"

后我得到了这些奇怪的工件

http://i.imgur.com/ZfLYmQB.png

(我的GPU是AMD R9 270)

片段:

#version 330 core

layout (location = 0) out vec4 color;

uniform vec4 colour;
uniform vec2 light;

in DATA{
    vec4 position;
    vec2 uv;
    float tid;
    vec4 color;
}fs_in;

uniform sampler2D textures[32];

void main()
{
    float intensity = 1.0 / length(fs_in.position.xy - light);
    vec4 texColor = fs_in.color;
    if(fs_in.tid > 0.0){    
        int tid = int(fs_in.tid - 0.5);
        texColor = texture(textures[tid], fs_in.uv);
    }
    color = texColor; // * intensity;
}

编辑:github repos(抱歉,如果它缺少一些库,无法将它们链接到 github)https://github.com/PedDavid/NubDevEngineCpp

编辑: 感谢 derhass 指出我正在做一些未定义结果的事情(访问没有常量 ([tid]) 的数组)。我现在可以使用

switch(tid){
    case 0: textureColor = texture(textures[0], fs_in.uv); break;
    ...
    case 31: textureColor = texture(textures[31], fs_in.uv); break;
}

不是最漂亮的,但现在还不错!

看起来着色器正在渲染它在内存中找到的任何随机数据。 您是否尝试检查是否在正确的时间(渲染之前)调用了 glBindTexture(...) 以及使用的值(由 glGenTextures(...) 返回)是否有效?

I'm getting these strange artifacts after using "texture arrays"

您没有使用 "texture arrays"。您使用 纹理采样器数组 。来自您的片段着色器:

#version 330 core
// ...
in DATA{
    // ...
    float tid;
}fs_in;

//...

    if(fs_in.tid > 0.0){    
        int tid = int(fs_in.tid - 0.5);
        texColor = texture(textures[tid], fs_in.uv);
    }

根据 GLSL 3.30 specification 的规定

,不允许您在此处尝试执行的操作

Samplers aggregated into arrays within a shader (using square brackets [ ]) can only be indexed with integral constant expressions (see section 4.3.3 “Constant Expressions”).

您的 tid 不是常量,所以这行不通。

在 GL 4 中,此限制有所放宽(引用自 GLSL 4.50 spec):

When aggregated into arrays within a shader, samplers can only be indexed with a dynamically uniform integral expression, otherwise results are undefined.

你现在的输入也不是动态统一,所以你也会得到未定义的结果。

我不知道你想达到什么目的,但也许你可以通过使用 array textures 来实现它,它会将一组完整的图像表示为单个 GL 纹理对象,并且不会强加访问它们时的此类限制。