Opengl 写操作的SSBO同步
我有一个OpenGL程序,它显示出(巨大的)缺乏可重复性。在片段着色器中,我查找特定条件。如果满足该条件,我将向SSBO写入与该片段关联的世界空间坐标,这是我从顶点着色器保留的 我的问题是,从程序的一次重复到下一次重复,对SSBO的写入操作的数量差别很大。是否可能,如果多个着色器希望同时写入SSBO,则不会总是这样做 我不从其他着色器读取SSBO。因此,这不是写/读同步的问题。我只在回到CPU应用程序时读取SSBOOpengl 写操作的SSBO同步,opengl,Opengl,我有一个OpenGL程序,它显示出(巨大的)缺乏可重复性。在片段着色器中,我查找特定条件。如果满足该条件,我将向SSBO写入与该片段关联的世界空间坐标,这是我从顶点着色器保留的 我的问题是,从程序的一次重复到下一次重复,对SSBO的写入操作的数量差别很大。是否可能,如果多个着色器希望同时写入SSBO,则不会总是这样做 我不从其他着色器读取SSBO。因此,这不是写/读同步的问题。我只在回到CPU应用程序时读取SSBO 我在NVIDIA GTX645卡上使用OpenGL 4.3。在CPU应用程序中:
我在NVIDIA GTX645卡上使用OpenGL 4.3。在CPU应用程序中:
//Create one Shader Storage Buffer Object for vertices of detected points
GLuint Detected_Vertices_SSBO;
glGenBuffers(1,&Detected_Vertices_SSBO);
glBindBuffer(GL_SHADER_STORAGE_BUFFER,Detected_Vertices_SSBO);
glBufferData(GL_SHADER_STORAGE_BUFFER,(sizeN-NbTotalreflectionPoints.at(i))*sizeof(glm::vec4),NULL,GL_DYNAMIC_DRAW);
sprintf(OpenGLErrorMessage,"%s\n","Error on Vertices SSBO at creation time.");
QueryForOpenGLErrors(OpenGLErrorMessage);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER,0,Detected_Vertices_SSBO);
sprintf(OpenGLErrorMessage,"%s\n","Error on Vertices SSBO at binding time.");
QueryForOpenGLErrors(OpenGLErrorMessage);
//Create one Shader Storage Buffer Object for colors of detected points
GLuint Detected_Vertices_Colors_SSBO;
glGenBuffers(1,&Detected_Vertices_Colors_SSBO);
glBindBuffer(GL_SHADER_STORAGE_BUFFER,Detected_Vertices_Colors_SSBO);
glBufferData(GL_SHADER_STORAGE_BUFFER,(sizeN-NbTotalreflectionPoints.at(i))*sizeof(glm::vec4),NULL,GL_DYNAMIC_DRAW);
sprintf(OpenGLErrorMessage,"%s\n","Error on Colors of Vertices SSBO at creation time.");
QueryForOpenGLErrors(OpenGLErrorMessage);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER,1,Detected_Vertices_Colors_SSBO);
sprintf(OpenGLErrorMessage,"%s\n","Error on Vertices Colors SSBO at binding time.");
QueryForOpenGLErrors(OpenGLErrorMessage);
….
glDrawArrays(GL_POINTS, 2*3+NbTargets1*12*3, NbPoints); //
glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
glFinish();
…
glBindBuffer(GL_SHADER_STORAGE_BUFFER, Detected_Vertices_SSBO);
glm::vec4 * SSBO_Position_ptr = (glm::vec4*)glMapBuffer(GL_SHADER_STORAGE_BUFFER,GL_READ_ONLY);
sprintf(OpenGLErrorMessage,"%s\n","Error on Vertices SSBO at mapping time.");
QueryForOpenGLErrors(OpenGLErrorMessage);
glFinish();
glBindBuffer(GL_SHADER_STORAGE_BUFFER, Detected_Vertices_Colors_SSBO);
glm::vec4 * SSBO_Color_ptr = (glm::vec4*)glMapBuffer(GL_SHADER_STORAGE_BUFFER,GL_READ_ONLY);
sprintf(OpenGLErrorMessage,"%s\n","Error on Vertices Colors SSBO at mapping time.");
QueryForOpenGLErrors(OpenGLErrorMessage);
glFinish();
然后,在片段着色器中:
#version 430 core
布局(早期碎片测试)
其中条件=0或1
我希望这会有所帮助。我很抱歉地告诉你,我在stackoverflow中的格式化问题上仍然有很多问题。我一定太老了 是的。我已经修好了。在网上浏览了很长一段时间后,我发现,使用
glDeleteBuffers(1,&u SSBO)仅代码>可能并不总是足以删除缓冲区:其名称也必须删除。您可能认为SSBO已被删除,您可以通过使用glBindBuffer(GL\u SHADER\u STORAGE\u BUFFER,Detected\u Vertices\u SSBO)绑定一个新的SSBO但是,从我所了解到的(并且它是有效的),新绑定可能会被绑定到相同的SSBO名称(或句柄)。为了防止出现这种情况,请确保使用glBindBuffer(GL\u SHADER\u STORAGE\u BUFFER,0)取消绑定SSBO代码>在绑定新代码之前。命令中的参数0
将确保SSBO已真正解除绑定。祝你好运 如果没有源代码,很难看出问题所在。这可能需要一些时间,但我会整理一些东西来回答Nicol BolasI目前遇到的类似问题。你已经解决了吗?我的程序每次都在映射的缓冲区中读取相同的值。
// Interpolated values from the vertex shaders
in vec4 fragmentColor;
in vec4 worldspace;
//SSBO's for detected points and their colors
layout (binding=0, std430) coherent buffer detected_vertices_storage
{
vec4 detected_vertices[];
}Positions;
layout (binding=1, std430) coherent buffer detected_vertices_colors_storage
{
vec4 detected_vertices_colors[];
}Colors;
...
Positions.detected_vertices[int(round(Condition * ((gl_FragCoord.y-0.5)*1024.0+(gl_FragCoord.x-0.5))/(1024.0*1024.0)*NbOfCosines))] = worldspace;
Colors.detected_vertices_colors[int(round(Condition * ((gl_FragCoord.y-0.5)*1024.0+(gl_FragCoord.x-0.5))/(1024.0*1024.0)*NbOfCosines))] = color;