Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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
Opengl 是否有增加GL_MAX_阵列_纹理_层的解决方法?_Opengl_Glsl_Opengl 3 - Fatal编程技术网

Opengl 是否有增加GL_MAX_阵列_纹理_层的解决方法?

Opengl 是否有增加GL_MAX_阵列_纹理_层的解决方法?,opengl,glsl,opengl-3,Opengl,Glsl,Opengl 3,我正在使用纹理阵列渲染Minecraft风格的体素地形。它的工作非常出色,但我最近注意到,GL\u MAX\u ARRAY\u TEXTURE\u LAYERS比GL\u MAX\u TEXTURE\u SIZE小很多 我的纹理非常小,8x8,但我需要能够支持从数百到数千个纹理阵列的渲染;我只需要GL\u MAX\u ARRAY\u TEXTURE\u LAYERS更大一些 OpenGL 4.5要求GL\u MAX\u ARRAY\u TEXTURE\u LAYERS至少为2048,这可能就足够

我正在使用纹理阵列渲染Minecraft风格的体素地形。它的工作非常出色,但我最近注意到,
GL\u MAX\u ARRAY\u TEXTURE\u LAYERS
GL\u MAX\u TEXTURE\u SIZE
小很多

我的纹理非常小,8x8,但我需要能够支持从数百到数千个纹理阵列的渲染;我只需要
GL\u MAX\u ARRAY\u TEXTURE\u LAYERS
更大一些

OpenGL 4.5要求
GL\u MAX\u ARRAY\u TEXTURE\u LAYERS
至少为2048,这可能就足够了,但我的应用程序的目标是OpenGL 3.3,它只能保证256+

我正在画一些空白,试图找出一个谨慎的解决办法来解决这个限制;根据支持的纹理层的最大数量划分地形渲染对我来说一点也不简单

我研究了
ARB\u sparse\u texture
是否有帮助,但是
GL\u MAX\u sparse\u ARRAY\u texture\u LAYERS\u ARB
GL\u MAX\u ARRAY\u texture\u LAYERS
相同;该扩展只是VRAM使用的解决方案,而不是层使用

我可以从
sampler2DArray
数组访问GLSL着色器吗
GL\u MAX\u composed\u TEXTURE\u IMAGE\u UNITS
必须至少为80+,因此
80+*256+=20480+
这就足够了。那么,理论上我可以这样做吗

const int MAXLAYERS = 256;
vec3 texCoord;
uniform sampler2DArray[] tex;
void main()
{
    int arrayIdx = int(texCoord.z + 0.5f) / MAXLAYERS  256
    float arrayOffset = texCoord.z % MAXLAYERS;
    FragColor = texture(tex[arrayIdx],
        vec3(texCoord.x, texCoord.y, arrayOffset));
}

最好放弃阵列纹理,只使用纹理图集(或者使用阵列纹理,每个层都包含大量子纹理,但正如我将要展示的,这是非常不必要的)。如果您使用的是如此低分辨率的纹理,您可能没有使用线性插值,因此您可以轻松避免从相邻纹理溢出。即使你有出血的问题,也可以通过在子纹理之间增加一些空间来轻松解决

即使子纹理需要为10x10以避免溢出,1024x1024纹理(GL 3.3要求的最小尺寸)也会提供102x102子纹理,即10'404纹理。这应该足够了。如果不是,则将其设置为具有所需层数的阵列纹理

取样器阵列无法满足您的需要。首先,不能声明任何类型的无大小
统一
数组。可以,但必须在着色器中的某个点使用大小重新声明它,因此无大小声明没有多大意义。您只能在SSBO中使用未调整大小的数组,作为SSBO的最后一个元素

第二,即使有大小,用于的数组的索引也必须是大小。由于您试图在一次绘制调用中绘制多维数据集的所有面,并且每个面都可以从不同的层中进行选择,因此该表达式的值没有动态统一的意图


第三,即使您使用,也会遇到相同的问题:除非您使用的是NVIDIA硬件,否则您选择的采样器必须是动态统一采样器。这要求进入采样器数组的索引是动态统一的。你的不是。

我不认为出血很容易治愈;我正在使用minification=GL\u LINEAR\u MIPMAP\u LINEAR和maxification=GL\u NEAREST\u MIPMAP\u LINEAR。我还使用了各向异性过滤和mipmap。我认为1像素填充可以减少出血,但不能消除出血。如果F 82822222222f,u u 8282222222222ff,rγγγγγ-222f,rγ-uγγγ-2222f,rγγ-u,r,r,r,r,r,r,rγγγ,r,rγγγ,r,r,r,r,r,r,γ,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,w,w,以及以及以及w,w,i,我,我,我,我,我,我以及以及以及以及以及以及我,我,我,我,我,我,我,我,我,我,我,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l,l 82828222̶w̶o̶r̶k̶m̶i̶p̶m̶a̶p̶s̶(,似乎可以)