Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++/OpenGL/GLSL,带有“随机”瑕疵的纹理_C++_Opengl_Glsl_Artifacts - Fatal编程技术网

c++/OpenGL/GLSL,带有“随机”瑕疵的纹理

c++/OpenGL/GLSL,带有“随机”瑕疵的纹理,c++,opengl,glsl,artifacts,C++,Opengl,Glsl,Artifacts,想知道是否有人经历过这种情况,并知道原因。在使用纹理阵列之后,我得到了这些奇怪的瑕疵 我的gpu是AMD R9 270 忍者编辑删除了文章的其余部分以便于阅读,因为它只是显示了可能出现问题的代码,因为该项目是开源的,现在我只显示problemfragment着色器的源代码 Frag: 编辑:github repos如果缺少一些lib,很抱歉,无法将它们链接到github 编辑:感谢您指出我在使用未定义的结果访问数组时没有常数[tid]。我现在和它一起工作 switch(tid){ cas

想知道是否有人经历过这种情况,并知道原因。在使用纹理阵列之后,我得到了这些奇怪的瑕疵

我的gpu是AMD R9 270

忍者编辑删除了文章的其余部分以便于阅读,因为它只是显示了可能出现问题的代码,因为该项目是开源的,现在我只显示problemfragment着色器的源代码 Frag:

编辑:github repos如果缺少一些lib,很抱歉,无法将它们链接到github

编辑:感谢您指出我在使用未定义的结果访问数组时没有常数[tid]。我现在和它一起工作

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

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

看起来着色器正在渲染它在内存中找到的任何随机数据。 你有没有试着检查一下这个纹理。。。在渲染之前的正确时间调用,并且glGenTextures返回的值。。。有效吗

在使用纹理阵列之后,我得到了这些奇怪的瑕疵

您没有使用纹理阵列。使用纹理采样器阵列。从片段着色器:

根据which states,您在此处尝试执行的操作是不允许的

使用方括号将采样器聚合到着色器内的阵列中 []只能使用整型常量表达式编制索引请参见 第4.3.3节“常量表达式”

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

在德国劳埃德船级社4中,这一约束已有所放宽,引用自:

当聚集到着色器内的数组中时,采样器只能 使用动态一致积分表达式索引,否则 结果未定义

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


我不知道您想实现什么,但也许您可以通过使用dobe获得它,它将完整的图像集表示为单个GL纹理对象,并且在访问它们时不会施加此类约束。

它们似乎都是有效的,GlGenTexture为3个纹理返回1、2、3,glBindTexture为绑定1、2,3,仅在冲洗时调用。工件似乎总是在同一个地方,来自其他纹理的工件似乎被替换,但是调试着色器输入输出位置,因为颜色似乎很完美。我仍然在开始,我的代码主要是从这里开始的:,这对他来说很好,但感谢您提供的信息,所以我现在可以尝试其他无工件!您对该常量的看法完全正确,通过执行switchtid{case 0:textureColor=texturetextures[0],fs_in.uv;break;…}使其工作
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);
    }