我有以下问题。当使用超过特定大小的 SSBO(具有 2^15 个元素的数组)时,会读取错误值。这仍然远低于GL_MAX_SHADER_STORAGE_BLOCK_SIZE
我的设备 512MB 的限制 - 问题已经在 Kb 范围内开始。这在桌面上根本不会发生,并且一切都按预期工作 -该问题仅发生在 Android 上。
我创建了一个小样本来显示问题。可以在这里找到:https ://github.com/cbauernhofer/android_ssbo_test
基本思想是我分配了一个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 实现完全相同的行为。
谁能向我解释这里发生了什么?