我使用着色器存储缓冲区对象进行三线性插值。所以我像这样在片段着色器中访问我的 ssbo:
layout(std430, binding = 0) buffer ColorSSBO { int value[]; };
int c000 = value[x0 + y0 * dataWidth + z0 * area];
int c100 = value[x1 + y0 * dataWidth + z0 * area];
int c010 = value[x0 + y1 * dataWidth + z0 * area];
int c110 = value[x1 + y1 * dataWidth + z0 * area];
int c001 = value[x0 + y0 * dataWidth + z1 * area];
int c101 = value[x1 + y0 * dataWidth + z1 * area];
int c011 = value[x0 + y1 * dataWidth + z1 * area];
int c111 = value[x1 + y1 * dataWidth + z1 * area];
它变得非常低效,因为这个缓冲区很大,如果我可以一次读取数组的多个元素,那就太好了,或者至少是那些连续的
我不需要修改这个数组,我觉得我错过了一些东西,也许有一些 readonly 的关键字
这就是我使用 lwjgl 加载 ssbo 的方式:
public void loadSSBO(int[][] values){
if (ssbo != 0) GL15.glDeleteBuffers(ssbo);
int size = values[0].length;
long pixelSIZE = size * (Integer.SIZE / 8);
ssbo = GL15.glGenBuffers();
GL33.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, ssbo);
GL15.glBufferData(GL43.GL_SHADER_STORAGE_BUFFER, pixelSIZE * values.length, GL15.GL_STATIC_DRAW); // declare buffer
for (int i = 0; i < values.length; i++) {
GL15.glBufferSubData(GL43.GL_SHADER_STORAGE_BUFFER, pixelSIZE * i, values[i]);
}
GL33.glBindBufferBase(GL43.GL_SHADER_STORAGE_BUFFER, 0, ssbo);
GL33.glBindBuffer(GL43.GL_SHADER_STORAGE_BUFFER, 0); //unbind
}