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

时间:2015-03-07 23:04:40

标签: c++ opengl glsl buffer

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

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

1 个答案:

答案 0 :(得分:7)

您可以使用texture buffer objects (TBOs)

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

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