-1

LWJGL でいくつかの簡単なテスト プログラムを作成しようとしています。ポイントの 2D グリッドを表す浮動小数点値でいっぱいの ByteBuffer オブジェクトを作成しました。

glBegin/glEnd を使用してグリッドをレンダリングすると、適切な出力が表示されます。

    float[] values = new float[MESH_SIZE * MESH_SIZE * 4];
    heightField.position(0);
    heightField.asFloatBuffer().get(values);
    glBegin(GL_POINTS);
    for (int i = 0; i < MESH_SIZE * MESH_SIZE; ++i) {
        int offset = i * 4;
        glVertex3f(values[offset], values[offset + 1], values[offset + 2]);
    }
    glEnd();

glVertexPointer を使用してレンダリングすると、画面の中心にある 1 つの点以外は生成されません。

    heightField.position(0);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 4 * 4, heightField);
    glDrawArrays(GL_POINTS, 0, MESH_SIZE * MESH_SIZE);
    glDisableClientState(GL_VERTEX_ARRAY);

OpenGL と lwjgl のドキュメントを読むと、これら 2 つのコードは同じ出力を生成するはずですが、明らかにそうではありません。私は何が欠けていますか?

4

1 に答える 1

0

悲しいことに、問題は質問に表示されません。最終的に、実験の結果、バッファの構造に問題があることが明らかになりました。このコードを使用してバッファを初期化していました

    heightField = ByteBuffer.allocateDirect(vertex_count * 4 * 4);

ただし、この行に切り替えたところ、コードが機能し始めました

    heightField = BufferUtils.createByteBuffer(vertex_count * 4 * 4);

ByteBuffer.allocateDirect()ハードウェアのバイト順ではなく、Java のバイト順がデフォルトになっていることがわかりました。これは、ネイティブ GL 関数に渡されたときに、バッファ内の float のバイト順が逆になったことを意味します。そのため、画面の中央に 1 つのドットが表示されました。0,0 ポイントはどちらの方法でも同じでしたが、他のすべてのバイトはおそらくレンダリング ビューポートの外に大きく出ていました。

于 2013-05-16T05:18:42.167 に答える