0

LWJGL の OpenGL の実装を操作し、照明機能を操作しようとしています。これには、OpenGL に渡すために FloatBuffers を作成する必要があります。関連するコードは次のとおりです。

GL11.glClearColor(0,0,0,0);

float[] ambientLight={(float).3,(float).5,(float).8,1};
FloatBuffer ambientLightB = FloatBuffer.allocate(4);
ambientLightB.put(ambientLight);

float[] diffuseLight={(float).25,(float).25,(float).25,1};
FloatBuffer diffuseLightB = FloatBuffer.allocate(4);
diffuseLightB.put(diffuseLight);

float[] lightPosition={0,0,1,1};
FloatBuffer lightPositionB = FloatBuffer.allocate(4);
lightPositionB.put(lightPosition);

float[] matAmbient={1,1,1,1};
FloatBuffer matAmbientB = FloatBuffer.allocate(4);
matAmbientB.put(matAmbient);

float[] matDiff={1,1,1,1};
FloatBuffer matDiffB = FloatBuffer.allocate(4);
matDiffB.put(matDiff);

GL11.glShadeModel(GL11.GL_SMOOTH);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glFrontFace(GL11.GL_CCW);
GL11.glEnable(GL11.GL_LIGHTING);

GL11.glMaterial(GL11.GL_FRONT,GL11.GL_AMBIENT,matAmbientB);
GL11.glMaterial(GL11.GL_FRONT, GL11.GL_DIFFUSE,matDiffB);
GL11.glLight(GL11.GL_LIGHT0,GL11.GL_AMBIENT,ambientLightB);
GL11.glLight(GL11.GL_LIGHT0,GL11.GL_DIFFUSE,diffuseLightB);
GL11.glLight(GL11.GL_LIGHT0,GL11.GL_POSITION,lightPositionB);
GL11.glEnable(GL11.GL_LIGHT0);

glMaterial を最初に呼び出すと、次のエラーが発生します。

Exception in thread "main" java.lang.IllegalArgumentException: 残りのバッファー要素の数は 0 です。少なくとも 4 である必要があります。最大 4 つの要素を返すことができるため、実際に返される要素に関係なく、少なくとも 4 つの要素を持つバッファーが必要です。カウント

ここで何が間違っているのかよくわかりませんが、FloatBuffer の作成に問題があるようです。

4

3 に答える 3

1

このソリューションでは、LWJGL (BufferUtils.createFloatBuffer) に固有の別の関数呼び出しと、flip() メソッドが必要になりました。以下はバッファを正しく初期化しました

float[] matAmbient={1,1,1,1};
FloatBuffer matAmbientB = BufferUtils.createFloatBuffer(4);
matAmbientB.put(matAmbient);
matAmbientB.flip();
于 2012-03-03T14:51:06.250 に答える
1

put() の後にバッファを Flip() するか、FloatBuffer.wrap() を使用します。これにより、コードの行数も節約できます。または、さらに4 つのスロットが必要な場合は、8 つの要素を割り当てます。

于 2012-03-03T01:21:10.723 に答える
0

LWJGL で FloatBuffers を使用するという考え方は、ネイティブ コードがそこにあるバッファを直接使用できるようにすることです。これが正しく機能するためには、次のように使用する必要があります。

//Create a directly allocated buffer in bytes (16 = 4 Floats * size of float in bytes)
ByteBuffer bytes = ByteBuffer.allocateDirect(16).order(ByteOrder.nativeOrder());
FloatBuffer fb = bytes.asFloatBuffer();
fb.put(...);
fb.rewind(); //Moves the internal buffer pointer back to the start for the next thing to read from it

ByteOrder.nativeOrder() は、システムがビッグ エンディアンまたはリトルエンディアンを使用しているかどうかにかかわらず、Java からネイティブ コードに正しく転送されることを保証します。( http://en.wikipedia.org/wiki/Endiannessを参照)

LWJGL バッファ ユーティリティがこれを行う可能性があります。

于 2012-03-05T10:15:55.330 に答える