1

さまざまなコンピューターでのOpenGLレンダリングで問題が発生しています。

動作:Intel HD3000 / Sandyブリッジ:ATI 6950 ATI 6970m ATI 5670m Quadro FX 2000

動作しません:Nvidiaモビリティ9600 gt Quadro FX 1800

コード行「renderLines()」が呼び出されると、「機能しない」グラフィックカードの画面には何も表示されません。「renderLines()」がないと、テストしたすべてのグラフィックカードですべてが期待どおりに機能します。

「renderSprites()」はrenderLines()と非常によく似ていますが、唯一の違いは、線ではなく画面にクワッドをレンダリングすることです。

void GraphicsEngineOGL3::update()
{
    this->renderSprites();
    this->renderLines(); // this is the offending line of code
    SDL_GL_SwapBuffers();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    checkError();
}

void GraphicsEngineOGL3::renderLines()
{
    if(lineBuffer_.empty()) // note: lineBuffer is a std::Vector<Vertex>
        return;

    glEnableClientState(GL_VERTEX_ARRAY);           // DEPRECATED in OGL 3.1
    glEnableClientState(GL_COLOR_ARRAY);

    // Note: glVertexPointer is deprecated, change to glVertexAttribPointer
    glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &(lineBuffer_[0].x));  // DEPRECATED in OGL 3.1
    glColorPointer(4, GL_BYTE, sizeof(Vertex), &(lineBuffer_[0].r));

    glBindBuffer( GL_ARRAY_BUFFER, VBOs_[activeVBO_]);
    glBufferData( GL_ARRAY_BUFFER, lineBuffer_.size() * sizeof(Vertex), &(lineBuffer_[0]), GL_STREAM_DRAW);
    glDrawArrays( GL_LINES, 0, lineBuffer_.size()); // where 4 is the number of vertices in the quad
    glBindBuffer( GL_ARRAY_BUFFER, 0); // Binding the buffer object with 0 switchs off VBO operation. 

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);

    lineBuffer_.clear();
    checkError();
}
4

1 に答える 1

4

現時点では、最初に頂点配列を設定してRAM配列(_lineBuffer)からデータを取得し、次にVBOをバインドしてそのデータをコピー_lineBufferします。とにかく、これはおそらくあなたが望むことをしないでしょう(あなたがそこで何をしたいのかを言うのは難しいですが)。

呼び出しは、現在バインドされている、またはバインドされていない場合はCPU RAMからgl...Pointerデータを取得することを常に念頭に置いてください(現在バインドされているVBOは関係ありません)。したがって、この場合、呼び出しは効果がなく、アレイはVBOからではなくCPUアレイからデータを取得します。VBOを使用する場合は、呼び出しの前にバッファをバインドする必要がありますが、この場合、アドレスが実際にはバッファへのバイトオフセットであり、実際のRAMアドレスではないことを確認してください。GL_ARRAY_BUFFER0glDrawArraysglBindBuffer_lineBuffergl...Pointer

glBindBuffer( GL_ARRAY_BUFFER, VBOs_[activeVBO_]);
glBufferData( GL_ARRAY_BUFFER, lineBuffer_.size() * sizeof(Vertex), &(lineBuffer_[0]), GL_STREAM_DRAW);

glVertexPointer(3, GL_FLOAT, sizeof(Vertex), (const char*)0+offsetof(Vertex,x));  //use the current VBO
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Vertex), (const char*)0+offsetof(Vertex,r));

glBindBuffer( GL_ARRAY_BUFFER, 0);    //can already be unbound

glDrawArrays( GL_LINES, 0, lineBuffer_.size());

GL_UNSIGNED_BYTE符号付きタイプよりも色の方が自然なカラーデータに使用したことに注意してください。場合によっては、GL_BYTE色が[0,1]ではなく[-1,1]に変換され、[0,1]にクランプされます(線形変換されません)。

しかし、配列がVBOからではなくVBOからデータを取得するようにしたい場合_lineBuffer(これは疑わしいです)、とにかくバッファー関数の呼び出しは不要であり、省略できます。

あなたのコードは非常に奇妙で確かに間違っていますが、それでも機能するはずであることに注意してください。ですから、これが本当に問題だったのかどうかはわかりませんが、間違いなく問題でした。しかし、それはごく普通の道ではないので、せいぜい、あなたの色を混乱させたり、いくつかのドライバーで奇妙に実装されたりするGL_BYTE代わりにの使用を推測します。GL_UNSIGNED_BYTE

于 2011-10-29T14:58:15.320 に答える