OpenGL - 在着色器中使用大型(100k)统一数组

3
在我的程序中,我要渲染一个模型。我有一个生成的无符号字符数组,其中每个字节中的所有位都可以使用。数组中有一个元素对应于模型中的每个三角形。为了获取三角形的颜色,我使用 gl_PrimitiveID,它可以给出正在渲染的缓冲区中三角形的位置。
我的问题是我的GPU版本是4.2,这意味着我只能使用UBO而不能使用SSBO。最大数组大小(字节数组)略大于16,000,而我需要100,000个,所需的最小UBO大小为16KB。在我的情况下,使用标准的uniform float[N]具有与UBO相同的限制。
我一直在研究这个: https://www.opengl.org/registry/specs/NV/shader_buffer_load.txt 但在我使用设备特定的东西之前,我想知道是否还有其他选择。
如果您想查看,这是我的当前Frag-Shader:
#version 420 core
out vec3 color;
layout (std140) uniform ColorBlock{
    unsigned char colors[16000]; // this need to be 100,000
};
void main(){
    float r, g, b;
    r = colors[1.0f / gl_PrimitiveID];
    g = colors[1.0f / gl_PrimitiveID];
    b = colors[1.0f / gl_PrimitiveID];
    color = vec3(r, g, b);
}

unsigned char?GLSL支持的最小数据类型是32位。如果你在C中有一个字节数组,你需要在GLSL中解包它。 - undefined
1个回答

9
你可以使用纹理缓冲对象(TBOs)。请注意,虽然它们通过texture接口公开,但数据访问与纹理完全不同,数据直接从底层缓冲区对象获取,没有采样器开销。此外,请注意TBO的保证最小大小仅为65536个纹素。但是,在所有桌面实现中,它都要大得多。还请注意,您可以将最多4个浮点数打包到一个纹素中,因此即使只有最小大小可用,也可以通过这种方式获得100,000个值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接