c ++ / OpenGL / GLSL,带有“随机”伪像的纹理

佩德罗·戴维(Pedro David)

想知道是否有人经历过这种情况并知道原因。使用“纹理数组”后,我得到了这些奇怪的工件

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

(我的GPU是AMD R9 270)

  • ninja edit删除了该帖子的其余部分,以提高可读性,因为它只是显示可能存在问题的代码,因为该项目是开源的,所以我现在仅显示问题的来源(片段着色器)

片段:

#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;
}

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

使用“纹理数组”后,我得到了这些奇怪的工件

您没有使用“纹理数组”。您使用纹理采样器数组从片段着色器:

#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规范您在此处尝试做的事情是不允许的

聚合到着色器中的数组中的采样器(使用方括号[])只能用整数常量表达式索引(请参见第4.3.3节“常量表达式”)。

tid不是一个常数,因此这将不起作用。

在GL 4中,此约束有所放松(引自GLSL 4.50 spec):

当将它们聚合到着色器中的数组中时,只能使用动态统一的整数表达式对采样器进行索引,否则结果将不确定。

您现在输入的内容也不是动态统一的,因此您也将获得未定义的结果。

我不知道您要达到什么目的,但是也许可以通过使用数组纹理来实现,它可以将一组完整的图像表示为单个GL纹理对象,并且在访问它们时不会施加此类约束。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章