2013-09-07 17 views
5

私はopenglには新しく、ここで何が起こっているのか分かりません。私は、複数のオブジェクトを作成するために2つのVAOを使用しようとしているし、それらを回転/変換するカスタムマトリックスを使用しています。画像をロードすると画像が上手くなりますが、2つをロードすると両方がちらつきます。私のinitはこれです。バッファ、頂点の位置、頂点のインデックス、頂点の色ごとに異なる配列があります。複数のオブジェクトをレンダリングしている間に、openglがちらつく

void init() 
{ 
readFile(); 
//glEnable(GL_DEPTH); 
glEnable(GL_DEPTH_TEST); 
//make background yerpul in colour 
glClearColor(0.235, 0.194, 0.314, 1.0); 


    // Load shaders and use the resulting shader program 
    program = InitShader("aVertexShader61.glsl", "aFragShader61.glsl"); 
    glUseProgram(program); 

    // Create a vertex array object 
    glGenVertexArrays(1, &vao); 
    glBindVertexArray(vao); 

    // Create and initialize two buffer objects 
    glGenBuffers(2, buffers); 

    //one buffer for the vertexPositions and colours 
    glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); 
    glBufferData(GL_ARRAY_BUFFER, numVertexPositionBytes + numVertexColourBytes,NULL, GL_STATIC_DRAW); 
    glBufferSubData(GL_ARRAY_BUFFER, 0, numVertexPositionBytes, vertexPositions); 
    glBufferSubData(GL_ARRAY_BUFFER, numVertexPositionBytes, numVertexColourBytes, vertexColours); 

    //one buffer for the indices 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, numVertexIndexBytes,vertexIndicies, GL_STATIC_DRAW); 

    // set up vertex arrays 
    GLuint vPosition = glGetAttribLocation(program, "vPosition"); 
    glEnableVertexAttribArray(vPosition); 
    glVertexAttribPointer(vPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 

    GLuint vColor = glGetAttribLocation(program, "vColor"); 
    glEnableVertexAttribArray(vColor); 
    glVertexAttribPointer(vColor, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(numVertexPositionBytes)); 

    // Second object 

    glGenVertexArrays(1, &vao2); 
    glBindVertexArray(vao2); 

    glGenBuffers(2, buffers2); 

    //one buffer for the vertexPositions and colours 
    glBindBuffer(GL_ARRAY_BUFFER, buffers2[0]); 
    glBufferData(GL_ARRAY_BUFFER, numVertexPositionBytes + numVertexColourBytes,NULL, GL_STATIC_DRAW); 
    glBufferSubData(GL_ARRAY_BUFFER, 0, numVertexPositionBytes, vertexPositions2); 
    glBufferSubData(GL_ARRAY_BUFFER, numVertexPositionBytes, numVertexColourBytes, vertexColours2); 

    //one buffer for the indices 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers2[1]); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, numVertexIndexBytes,vertexIndicies2, GL_STATIC_DRAW); 

    // set up vertex arrays 
    GLuint vPosition2 = glGetAttribLocation(program, "vPosition"); 
    glEnableVertexAttribArray(vPosition2); 
    glVertexAttribPointer(vPosition2, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 

    GLuint vColor2 = glGetAttribLocation(program, "vColor"); 
    glEnableVertexAttribArray(vColor2); 
    glVertexAttribPointer(vColor2, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(numVertexPositionBytes)); 


    glBindVertexArray(0); 
} 

これはglutPostRedisplay()で呼び出される私のディスプレイです。私のアイドル機能では、アイドルから何かへの他の呼び出しは行われません。 mStackは外部ファイルから作成された行列スタックオブジェクトです

void 
    display(void) 
{ 

    //clear for first object, generate matrix and apply to object 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    mStack.loadIdentity(); 
    mStack.translatef(0,yDisplace,0); 
    mStack.rotatef(Theta[Yaxis], 0.0,1.0,0.0); 
    for (unsigned char i=0; i<NumVertices; i++){ 
     mStack.transformf(&vertexPositionsInit[i*4],&vertexPositions[i*4]); 

    } 

    //Apply to second object 
    for (unsigned char i=0; i<NumVertices; i++){ 
     mStack.transformf(&vertexPositionsInit2[i*4],&vertexPositions2[i*4]); 

    } 


    //Draw first object 
    glBindVertexArray(vao); 
    glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); 
    glBufferSubData(GL_ARRAY_BUFFER, 0, numVertexPositionBytes, vertexPositions); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]); 
    //Indexing into vertices we need to use glDrawElements 
    glDrawElements(GL_TRIANGLES, NumIndicies, GL_UNSIGNED_BYTE, 0); 
    glutSwapBuffers(); 


    //Clear and draw second object 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glutSwapBuffers(); 
    glBindVertexArray(vao2); 
    glBindBuffer(GL_ARRAY_BUFFER, buffers2[0]); 
    glBufferSubData(GL_ARRAY_BUFFER, 0, numVertexPositionBytes, vertexPositions2); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers2[1]); 
    //Indexing into vertices we need to use glDrawElements 
    glDrawElements(GL_TRIANGLES, NumIndicies, GL_UNSIGNED_BYTE, 0); 
    glutSwapBuffers(); 


} 

私は単純な頂点シェーダとフラグメントシェーダを使用しています。 頂点シェーダ、

in vec4 vPosition; 
in vec4 vColor; 
out vec4 color; 

void main() 
{ 
    gl_Position = vPosition; 
    color = vColor; 
} 

とフラグメントシェーダは、

in vec4 color; 
out vec4 fColor; 

void main() 
{ 
    fColor = color; 
} 

任意の助けをいただければ幸いですし、必要であれば、私はマトリックスファイルを投稿することができます。 ありがとう

+0

サイドノート:使用しているシェーダは「パススルー」シェーダと呼ばれ、シェーダをまったく使用していない場合は同じ出力が得られます。その行列コードの大部分はシェーダーに入ることができますが、もちろん一度に一つのことを修正します。 :) –

+0

これは行列の計算によって引き起こされる問題かもしれませんか?私はそれがバッファーの問題でなければならないと思ったので、私は行列コードを含まなかったのですが、私は本当に分かりません。 – user2755996

+0

マトリックスコードは、オブジェクトがどこにあるかを決定します。オブジェクトが表示されていても、ちらつきやトレイルが残っている場合は、マトリックスの問題ではないでしょう。 –

答えて

5

オブジェクトの間にglutSwapBuffers()またはglClear()をコールしないでください。バッファーを入れ替えることは、GLUTに "わかりました、私はこのフレームで終わっています。次のフレームから始めましょう"と言う方法です。通常

OpenGLは基本的にグローバル変数の巨大な箱と、それはだから、あなたが、各オブジェクトをレンダリングコードから(glClear()への呼び出しとglutSwapBuffers()など)各フレームを設定し、完了コードを分割することをお勧めしますあなたのメソッドを小さな断片に分割することなく、良いOpenGLコードを書くのは難しいです。

+0

返事をいただき、ありがとうございました。私はクリアバッファーとスワップバッファーをコメントアウトしました.2番目のオブジェクトはフレームの軌跡を残し、背景もちらつきます:s – user2755996

+0

オブジェクトの間のすべてをコメントアウトしましたか?まだ冒頭にglClear()が必要で、最後にglutSwapBuffers()が必要です。 1つのオブジェクトに対してコードが動作し、そのオブジェクトのすべてを2番目にコピーしたように見えますが、これらの呼び出しの一部はフレームごとに1つで、オブジェクトごとに1つです。 –

+0

それは:)、私は以前に両方のための描画セクションの終わりの代わりに各オブジェクトの最後にスワップバッファを持っていた。ありがとうスティーブ – user2755996

関連する問題