2017-01-28 3 views
0

Ich habe ein OpenGL-Programm, das einen (großen) Mangel an Wiederholbarkeit zeigt. Im Fragment-Shader suche ich nach einer bestimmten Bedingung. Wenn diese Bedingung erfüllt ist, schreibe ich in einen SSBO die zu diesem Fragment gehörigen Worldspace-Koordinaten, die ich vom Vertex-Shader behalten habe.SSBO Synchronisation von schreibt

Mein Problem ist, dass von einer Wiederholung des Programms zu einem nächsten die Anzahl der Schreibvorgänge zum SSBO sehr unterschiedlich ist. Kann es sein, dass wenn mehrere Shader gleichzeitig zur SSBO schreiben wollen, dies nicht immer der Fall ist?

Ich lese nicht zu den SSBO von den anderen Shadern. Es ist also kein Problem der Schreib/Lese-Synchronisation. Ich lese den SSBO nur, wenn ich wieder in der CPU-Anwendung bin.

Ich verwende OpenGL 4.3 auf einer NVIDIA GTX645-Karte.

+0

Es ist schwer zu sehen, was das Problem ohne den Quellcode ist. –

+0

Es könnte einige Zeit dauern, aber ich werde etwas zusammensetzen, um Nicol Bolas zu beantworten – RobertB

Antwort

0

In der CPU Anwendung:

//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."); 
      QuerryForOpenGLErrors(OpenGLErrorMessage); 
      glBindBufferBase(GL_SHADER_STORAGE_BUFFER,0,Detected_Vertices_SSBO); 
      sprintf(OpenGLErrorMessage,"%s\n","Error on Vertices SSBO at binding time."); 
      QuerryForOpenGLErrors(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."); 
      QuerryForOpenGLErrors(OpenGLErrorMessage); 
      glBindBufferBase(GL_SHADER_STORAGE_BUFFER,1,Detected_Vertices_Colors_SSBO); 
      sprintf(OpenGLErrorMessage,"%s\n","Error on Vertices Colors SSBO at binding time."); 
      QuerryForOpenGLErrors(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."); 
       QuerryForOpenGLErrors(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."); 
       QuerryForOpenGLErrors(OpenGLErrorMessage); 
       glFinish(); 

Dann wird in dem Fragment-Shader:

#version 430 core 

layout (early_fragment_tests) in;

// 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; 

wobei Bedingung = 0 oder 1.

Ich hoffe, das hilft. Es tut mir leid zu sagen, dass ich immer noch große Probleme mit dieser Formatierung im Stackoverflow habe. Ich muss zu alt sein!

+0

Ich habe derzeit ein ähnliches Problem. Hast du das schon gelöst? Mein Programm liest immer den gleichen Wert im gemappten Puffer. – porky11

0

Ja. Ich habe es repariert.
Nachdem ich mich lange im Internet umgesehen habe, habe ich herausgefunden, dass die Verwendung von glDeleteBuffers(1, &_SSBO); möglicherweise nicht immer ausreicht, um den Puffer zu löschen: sein Name muss ebenfalls gelöscht werden. Sie würden denken, das SSBO wurde gelöscht und Sie können ein neues binden, indem Sie glBindBuffer(GL_SHADER_STORAGE_BUFFER, Detected_Vertices_SSBO); verwenden, aber von dem, was ich gelernt habe (und es funktionierte), kann es vorkommen, dass die neue Bindung an den gleichen SSBO-Namen (oder handle) vorgenommen wird. Um dies zu verhindern, stellen Sie sicher, dass der SSBO nicht gebunden ist, indem Sie glBindBuffer(GL_SHADER_STORAGE_BUFFER,0); verwenden, bevor Sie einen neuen binden. Das Argument 0 in dem Befehl wird sicherstellen, dass der SSBO wirklich nicht verbunden wurde. Viel Glück!