在我的程序中,我正在做一个模型的渲染。我有一个生成的无符号字符数组,其中每个字节中的所有位都可以使用。数组中的每个三角形都有一个元素。为了获得三角形的颜色,我使用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);
}
答案 0 :(得分:7)
您可以使用texture buffer objects (TBOs)。
请注意,虽然它们是通过texture
接口公开的,但数据访问与纹理完全不同,数据直接从底层缓冲区对象中提取,没有采样器开销。
另请注意,TBO的保证最小尺寸仅为65536像素。但是,在所有桌面实现中,它都要大得多。另请注意,您最多可以将4个浮点数打包到纹素中,这样就可以达到100000个值,即使只有最小尺寸可用。