1

次のコードを使用して、2Dゲームでスポットライトを作成しようとしています

float[] ambient = {0.1f, 1, 1, 1};
float[] position = {45, 20, 0, 1};
float[] direction = {0, -1, 0};

gl.glEnable(GL10.GL_LIGHT1);
gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_AMBIENT, ambient, 0 );
gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_POSITION, position, 0);
gl.glLightfv(GL10.GL_LIGHT1, GL10.GL_SPOT_DIRECTION, direction, 0);
gl.glLightf(GL10.GL_LIGHT1, GL10.GL_SPOT_CUTOFF, 30.0f);

一般的にスポットは機能していますが、移動したり、方向やカットオフを変更したりすることはできません。位置ベクトルを変更すると、8は同じ位置に留まるか、完全に消えます。同じことが方向とカットオフでも起こります。それは常に45度の角度で左/上に輝いています。GL_AMBIENTをGL_DIFFUSEまたはGL_SPECULARに変更すると、ライトも消えます。変更できるのはライトの色だけです。

私は何が間違っているのですか?

4

2 に答える 2

0

問題は、gles10が頂点ごとのライティングのみを実行することでした。これを正しく機能させるには、ピクセル単位照明を実装する必要があります。

于 2012-04-14T10:47:43.700 に答える
0

glLightf(GL_POSITION)固定パイプラインでは、ライトの位置は、と呼ばれるときにマトリックススタックの最上位によって変換されることに注意してください。

したがって、ワールド座標でライトの位置を定義する場合は、スタックの一番上にViewProjectionマトリックスがすでに存在している必要があります。

これはよくある間違いです。多くの人は、カメラ/投影マトリックスを設定する前に、ワールド座標でライトの位置を定義するため、実際には画面空間の座標で定義されます。

于 2012-04-13T18:27:42.840 に答える