0

PBO (OpenGL を使用したピクセル バッファー オブジェクト) を使用してカラー ピッキング システムを実装しようとしていましたが、終了すると、マップ時に PBO から出力された数値がまったく意味をなさないことに気付きました。アプリケーションでさまざまな色の大きな正方形をレンダリングすると、結果のDIDがこれらのさまざまな色の間で変化しましたが、数値を分析した後でも、意味がわかりません。

たとえば、純粋な赤をクリックすると (-1,0,0) のバイトが返され、純粋な青では (0,0,-1) が返されましたが、すべてのロジックに対して、純粋な緑では (-1,0,-1) が返されました。 、シアンも (-1,0,0) を与え、黄色は (76,-1,0) を与えます。

2 つの異なる色が同じバイト構成になる可能性があることを考えると、これらの数値は明らかに間違っています。完全に赤い色は (127,0,0) であるべきではありませんか?

1 ピクセルしか読み取っていないため、サイズ 3 の初期化に使用したコードを次に示します。

pboid = glGenBuffersARB(); //Initialize buffer for pbo
glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, pboid); //bind buffer
glBufferDataARB(GL_PIXEL_PACK_BUFFER_EXT, 3,GL_DYNAMIC_READ); //create a pbo with 3 slots
glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, 0); //unbind buffer

そして、これがピクセルの読み取りに使用したコードです

glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, pboid); //Bind the pbo
glReadPixels((int)lastMousePosition.x,(int)lastMousePosition.y,1,1, GL_RGB, GL_UNSIGNED_BYTE, 0); //Read 1 pixel
ByteBuffer colorBuffer = glMapBufferARB(GL_PIXEL_PACK_BUFFER_EXT, GL_READ_ONLY_ARB); //Map the buffer so we can read it
for(int x = 0; x < colorBuffer.limit(); x++)
{
    System.out.println("color byte: " + colorBuffer.get(x)); //Print out the color byte
}
glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_EXT); //Unmap the buffer so it can be used again
glBindBufferARB(GL_PIXEL_PACK_BUFFER_EXT, 0); //Unbind the pbo

私が行った仮定が間違っている場合は、修正してください。おそらく、このシステムを使用して、各要素を一意の色で fbo にレンダリングし、クリックされたピクセルの色をテストすることで、どの gui 要素がクリックされているかを知ることを計画しています。助けていただける方、よろしくお願いします!

4

2 に答える 2

1

ついに私はついに問題を見つけました!

まず、Byte.toUnsignedInt(byte) を使用して、pbo が提供する色を従来の 0 ~ 255 の範囲の RGB 数値に変換できます。

第 2 に、これが主な問題です。OpenGL が pbo を埋めるためにピクセル座標を要求するとき、それは右下を基準にしています。私の問題は、右上に相対的な座標を与えるGLFWを使用していたことです。つまり、画面の垂直方向の中央での色の選択は正確でしたが、他の場所で色を選択するときに探していた画面の逆の部分を取得していました. これを修正するには、ウィンドウの高さからマウス クリックの y 座標を差し引くだけです。

助けとアイデアをありがとう!

于 2018-08-25T11:21:45.903 に答える