Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL SSBO大小问题(仅限Android)_Android_Opengl Es_Ssbo - Fatal编程技术网

OpenGL SSBO大小问题(仅限Android)

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-

我有以下问题。当使用超过一定大小的SSBO(包含2^15个元素的数组)时,将读取错误值。这仍然远低于我的设备512MB的
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实现完全相同的行为

有人能解释一下这里发生了什么事吗