我正在尝试使用以下代码在我的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时,灯光也会消失。我唯一能改变的是光的颜色。
我做错了什么?
答案 0 :(得分:0)
请注意,在固定管道中,在调用glLightf(GL_POSITION)
时,光的位置会被矩阵堆栈的顶部转换。
因此,如果要在世界坐标中定义灯光的位置,则必须已在堆叠顶部放置ViewProjection矩阵。
这是一个常见的错误,许多人在设置相机/投影矩阵之前定义了灯在世界坐标中的位置,因此它实际上是在屏幕空间坐标中定义的。
答案 1 :(得分:0)
问题是gles10只进行每顶点照明。必须实现每像素照明才能使其正常工作。