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

opengl - use large (100k) uniform array in shader

在我的程序中,我正在对一个模型进行单一渲染。我有一个生成的无符号字符数组,其中每个字节中的所有位都可以使用。模型中的每个三角形在数组中都有一个元素。为了获得三角形的颜色,我使用了 gl_PrimitiveID,它为您提供了正在渲染的缓冲区中的三角形位置。

我的问题是我的 GPU 是 4.2,这意味着我只能使用 UBO 而不能使用 SSBO。最大数组大小(字节数组)略高于 16,000,我需要 100,000,The smallest required UBO size is 16KB。在我的例子中,使用标准统一的 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);
}

您可以使用 texture buffer objects (TBOs)

请注意,虽然它们是通过 texture 接口公开的,但数据访问与纹理完全不同,数据直接从底层缓冲区对象中获取,没有采样器开销。

另请注意,TBO 的保证最小尺寸仅为 65536 纹素。但是,在所有桌面实现中,它要大得多。另请注意,您最多可以将 4 个浮点数打包到一个纹素中,这样 100000 个值将是可能的,即使只有最小尺寸可用。