0

我使用着色器存储缓冲区对象进行三线性插值。所以我像这样在片段着色器中访问我的 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
}
4

0 回答 0