首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL计算着色机SSBO

OpenGL计算着色机SSBO
EN

Stack Overflow用户
提问于 2015-08-19 11:45:46
回答 1查看 6.3K关注 0票数 4

我想要一个在输出缓冲区中写入1的计算机着色器。我编译着色器并将它附加到程序中,然后调用glDispatchCompute()函数,直到计算着色器结束。但是当我看到数组时,只有0。

有人能告诉我错误在哪里吗?

这是我的电脑着色代码:

代码语言:javascript
复制
#version 430 core

layout  (local_size_x  =  2)  in;

layout(std430, binding=0) writeonly buffer Pos{
    float Position[];
};

void main(){
    Position[gl_GlobalInvocationID.x] = 1.0f;
}

这是我的一些主要内容:

代码语言:javascript
复制
GLuint program_compute = 0, SSBO = 0;

//...(Create, compile and link the program with the shader)...

vector<GLfloat> initPos;
int num_numeros = 12;

for (int i = 0; i < num_numeros; i++){
    initPos.push_back(0.0f);
}

glUseProgram(program_compute);

glGenBuffers(1, &SSBO);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, SSBO);
glBufferData(GL_SHADER_STORAGE_BUFFER, num_numeros * sizeof(GLfloat), &initPos, GL_DYNAMIC_DRAW);

glDispatchCompute(num_numeros/2, 1, 1);
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, 0);

for (int i = 0; i < num_numeros; i++){
    cout << "p" << i << ": " << initPos[i] <<  endl;
}
cout << endl;

编辑:最后它起作用了。谢谢,

正如BDL所说,我忘记了从GPU内存中读取缓冲区。现在起作用了。这是新代码:

代码语言:javascript
复制
GLuint program_compute = 0, SSBO = 0;

// ...The same code as above

glDispatchCompute(num_numeros/2, 1, 1);
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, 0);

glBindBuffer(GL_SHADER_STORAGE_BUFFER, SSBO);

GLfloat *ptr;
ptr = (GLfloat *) glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_WRITE_ONLY);
initPos.clear();

for (int i = 0; i < num_numeros; i++){
    initPos.push_back(ptr[i]);
}

glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);

for (int i = 0; i < num_numeros; i++){
    cout << "p" << i << ": " << initPos[i] <<  endl;
}
cout << endl;

编辑:谢谢Andon M. Coleman.

我是从一个只写的缓冲区中读取的。这是固定的线路:

代码语言:javascript
复制
ptr = (GLfloat *) glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_READ_ONLY);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-19 11:49:30

glBufferData 将initPos的内容复制到SSBO中。然后,着色器在缓冲区上操作,而不是在cpu内存数组上操作。除非您将缓冲区从GPU读取回CPU内存的某个位置,否则initPos将永远不会改变。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32094598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档