2017-01-28 7 views
0

私には、(巨大な)再現性の欠如を示すOpenGLプログラムがあります。フラグメントシェーダでは、私は特定の条件を探します。その条件が満たされている場合、私はSSBOに、そのフラグメントに関連付けられたワールド空間座標を書き込みます。これは、頂点シェーダから保持しています。書き込みのSSBO同期

私の問題は、プログラムの次の繰り返しから、SSBOへの書き込み操作の数が大幅に異なることです。複数のシェーダーが同時にSSBOに書き込む場合、必ずしもそうすることはできませんか?

他のシェーダからSSBOに読み込みません。したがって、書き込み/読み取り同期の問題ではありません。 SSBOはCPUアプリケーションに戻ったときだけ読んでいます。

私はNVIDIA GTX645カードでOpenGL 4.3を使用しています。

+0

問題がソースコードなしでわかりにくいです。 –

+0

私は時間がかかるかもしれませんが、私はニコールボラスに答えるために一緒に何かを入れます – RobertB

答えて

0
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."); 
      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(); 

、フラグメントシェーダで:

#version 430 core 

レイアウト(early_fragment_tests)において、

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

前記条件= 0または1

私はこれが役立つことを願っています。私はまだstackoverflowでこの書式のものに多くの問題を抱えていることを伝えて申し訳ありません。私はあまりにも古くなければならない!

+0

私は現在同様の問題があります。あなたはすでにこれを解決しましたか?私のプログラムは毎回、マップされたバッファ内の同じ値を読み込みます。 – porky11

0

はい。私はそれを修正した。
Webで長年見回したところ、glDeleteBuffers(1, &_SSBO);を使用しても、バッファを削除するだけでは必ずしも十分ではないことがわかりました。その名前も削除する必要があります。あなたはSSBOが削除されていると思って、glBindBuffer(GL_SHADER_STORAGE_BUFFER, Detected_Vertices_SSBO);を使って新しいものをバインドすることができますが、私が学んだことから(そしてうまくいけば)、新しいバインディングが同じSSBO名(またはハンドル)に行われることがあります。これを防ぐために、SSBOがアンブードであることを確認してから、glBindBuffer(GL_SHADER_STORAGE_BUFFER,0);をバインドして新しいものをバインドしてください。このコマンドの引数0は、SSBOが本当にバインドされていないことを確認します。がんばろう!

関連する問題