我正在使用一些OpenGL,并且似乎无法让一些代码正常工作。我知道如何使用OpenGL调整场景的环境光,但我似乎无法获得局部光线,比如匹配只会照亮周围的直接区域,或者聚光灯才能工作。这是我的照明代码,它只包含环境光和聚光灯:
private float[] lightPosition0;
public float[] light_ambient0 = {0.4f, 0.4f, 0.4f, 0.0f};
private float[] light_diffuse0 = {0.0f, 0.0f, 0.0f, 0.0f};
private float[] light_specular0 = {0.0f, 0.0f, 0.0f, 0.0f};
private float[] light_ambient1 = {0.0f, 1.0f, 0.0f, 0.0f};
private float[] light_specular1 = {1.0f, 1.0f, 1.0f, 1.0f};
private float[] light_specref1 = {1.0f, 1.0f, 1.0f, 1.0f};
private float[] light_spot_direction = {0.0f, 1.0f, 0.0f, 0.0f};
@SubscribeEvent()
public void onWorldRender(RenderWorldEvent.Pre event)
{
render();
}
private void render()
{
//glPushMatrix();
glEnable(GL_LIGHTING);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
glEnable(GL_CULL_FACE);
lightPosition0 = new float[]{(float)thePlayer.getPlayerCoordinates().posX + 2, (float)thePlayer.getPlayerCoordinates().posY + 2, (float)thePlayer.getPlayerCoordinates().posZ + 2, 1.0f}; // not sure what the last value does
// LIGHT 0
glLight(GL_LIGHT0, GL_POSITION, BufferTools.asFlippedFloatBuffer(lightPosition0));
glLight(GL_LIGHT0, GL_AMBIENT, BufferTools.asFlippedFloatBuffer(light_ambient0));
glLight(GL_LIGHT0, GL_DIFFUSE, BufferTools.asFlippedFloatBuffer(light_diffuse0));
glLight(GL_LIGHT0, GL_SPECULAR, BufferTools.asFlippedFloatBuffer(light_specular0));
// Light 1
glLight(GL_LIGHT1, GL_DIFFUSE, BufferTools.asFlippedFloatBuffer(light_ambient1));
glLight(GL_LIGHT1, GL_SPECULAR, BufferTools.asFlippedFloatBuffer(light_specular1));
glLight(GL_LIGHT1, GL_POSITION, BufferTools.asFlippedFloatBuffer(lightPosition0));
glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 60.0f);
glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 100.0f);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
//glPopMatrix();
}
我试图让一个聚光灯指向玩家前面的几个单位。此外,我不知道我是否应该使用GL_LIGHT_MODEL_LOCAL_VIEWER或GL_LIGHT_MODEL_AMBIENT,或者为什么我的代码不起作用。我不喜欢使用固定的管道而不使用着色器,如果它更容易做到这一点,我很乐意这样做。
我不确定我是如何做一个无限发光的自发光。我确定它有一个GL方法,但我似乎无法弄明白。
我渲染这些灯光的世界是由相同大小的立方体组成的,如果这是重要的信息。