Mic*_*ell 2 c++ opengl buffer glsl
在我的程序中,我正在做一个模型的渲染.我有一个生成的无符号字符数组,其中每个字节中的所有位都可以使用.数组中的每个三角形都有一个元素.获取我使用的三角形的颜色,gl_PrimitiveID它给出了正在渲染的缓冲区中三角形的位置.
我的问题是我的GPU是4.2意味着我只能使用UBO而不是SSBO.最大数组大小(字节数组)略大于16,000,我需要100,000,所需的最小UBO大小为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);
}
Run Code Online (Sandbox Code Playgroud)
您可以使用纹理缓冲区对象(TBO).
请注意,虽然它们是通过texture接口公开的,但数据访问与纹理完全不同,数据直接从底层缓冲区对象中提取,没有采样器开销.
另请注意,TBO的保证最小尺寸仅为65536个纹素.但是,在所有桌面实现中,它都要大得多.另请注意,您最多可以将4个浮点数打包到纹素中,这样即使只有最小尺寸,也可以使用100000个值.