OpenGL SSBO大小问题(仅限Android)
我有以下问题。当使用超过一定大小的SSBO(包含2^15个元素的数组)时,将读取错误值。这仍然远低于我的设备512MB的OpenGL SSBO大小问题(仅限Android),android,opengl-es,ssbo,Android,Opengl Es,Ssbo,我有以下问题。当使用超过一定大小的SSBO(包含2^15个元素的数组)时,将读取错误值。这仍然远低于我的设备512MB的GL\u MAX\u SHADER\u STORAGE\u BLOCK\u SIZE限制-问题已经从Kb范围开始。 这在桌面上根本不会发生,一切都按预期进行-问题只发生在Android上 我创建了一个小样本来说明这个问题。可以在这里找到: 基本思想是分配一个N字节的缓冲区,并仅使用最后16个字节(对应于一个vec4)作为着色器中的直接颜色输入。这意味着我有一个偏移量M,它是N-
GL\u MAX\u SHADER\u STORAGE\u BLOCK\u SIZE
限制-问题已经从Kb范围开始。
这在桌面上根本不会发生,一切都按预期进行-问题只发生在Android上
我创建了一个小样本来说明这个问题。可以在这里找到:
基本思想是分配一个N字节的缓冲区,并仅使用最后16个字节(对应于一个vec4
)作为着色器中的直接颜色输入。这意味着我有一个偏移量M,它是N-16。如果M超过1024*32(=2^15)事情开始崩溃,从SSBO读取错误值
有趣的是,边框不是关于字节数,而是关于SSBO数据数组中元素数。因此,如果我们更改为不使用vec4
,而是使用普通浮点数组,并将着色器更改为:
#version 310 es
precision mediump float;
layout(std430, binding = 0) readonly buffer layoutName
{
float data[];
} testSsbo;
uniform int uTestSSBOOffset;
out vec4 outColor;
void main() {
uint testOffset = uint(uTestSSBOOffset);
outColor.x = testSsbo.data[testOffset + 0u];
outColor.y = testSsbo.data[testOffset + 1u];
outColor.z = testSsbo.data[testOffset + 2u];
outColor.w = testSsbo.data[testOffset + 3u];
}
偏移量为:
int ssboOffset = ssboOffsetIndex * 1;
我得到了与vec4实现完全相同的行为
有人能解释一下这里发生了什么事吗