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);

一般来说,该点正在工作,但我不能移动它,也不能改变方向和截止。当我更改位置向量时,它会保持在同一位置或完全消失。方向和截止也是如此。它总是以 45 度角向左/向上发光。当我将 GL_AMBIENT 更改为 GL_DIFFUSE 或 GL_SPECULAR 时,灯光也会消失。我唯一能改变的是光的颜色。

我究竟做错了什么?

4

2 回答 2

0

请注意,在固定管道中,灯光的位置由调用时矩阵堆栈的顶部进行变换glLightf(GL_POSITION)

因此,如果您想在世界坐标中定义灯光的位置,您必须已经在堆栈顶部有 ViewProjection 矩阵。

这是一个常见的错误,许多人在设置相机/投影矩阵之前在世界坐标中定义了灯光的位置,因此它实际上是在屏幕空间坐标中定义的。

于 2012-04-13T18:27:42.840 回答
0

问题是gles10只做逐顶点光照。必须实现每像素照明才能正常工作。

于 2012-04-14T10:47:43.700 回答