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 个值将是可能的,即使只有最小尺寸可用。
在我的程序中,我正在对一个模型进行单一渲染。我有一个生成的无符号字符数组,其中每个字节中的所有位都可以使用。模型中的每个三角形在数组中都有一个元素。为了获得三角形的颜色,我使用了 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 个值将是可能的,即使只有最小尺寸可用。