我和我的工作人员刚刚将我们的游戏从java2d移植到LWJGL,并希望现在添加照明。 我们想要添加的内容:
我们已经搜索了很长一段时间,但有点迷失,因为我们不知道从哪里开始。 我们已经看到了alpha映射方法,但无法真正实现它。
如果有人能给我一个答案,我会很高兴。
谢谢!
答案 0 :(得分:2)
创造灯光可能比人们想象的要容易!以下代码将创建灯光并启用灯光,但可以使用不同的参数,您也可以更改和使用GL_SPECULAR
等内容。
FloatBuffer ambient = BufferUtils.createFloatBuffer(4);
ambient.put(new float[] { 0.05f, 0.05f, 0.05f, 1f, });
ambient.flip();
FloatBuffer position = BufferUtils.createFloatBuffer(4);
position.put(new float[] { 0f, 0f, 0f, 1f, });
position.flip();
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightModel(GL_LIGHT_MODEL_AMBIENT, ambient);
glLight(GL_LIGHT0, GL_POSITION, position);
请记住,您需要使用和计算法线,因为光线是使用它们计算的。
如果您不使用纹理并希望将光应用于简单的颜色,则可以在初始化OpenGL状态的位置添加以下内容。
glEnable(GL_COLOR_MATERIAL);
此外,如果某些部分您不想受到像UI这样的照明的影响,那么在渲染用户界面之前,您需要调用glDisable(GL_LIGHTING);
,然后在用户界面之后再次调用glEnable(GL_LIGHTING);
你希望之后启用照明。
如果您没有静态导入课程,那么只是为了通知您glEnable(GL_LIGHTING);
将GL11.glEnable(GL11.GL_LIGHTING);
像我刚刚向您展示的其他内容一样。
另请注意,OpenGL只包含从GL_LIGHT0
到GL_LIGHT7
的0个灯光,但可以通过不同方式轻松创建更多灯光。
重要如果您认为使用OpenGL灯会产生阴影,那么此代码会让您失望,如果我没记错的话,创建阴影是OpenGL灯和一些高级FBO工作的组合。
如果您想要可移动照明,则每次移动灯光时都需要更新glLight(GL_LIGHT0, GL_POSITION, position);
。
这是一个小型的灯光类型教程,我发现只是通过搜索" opengl lighting",该教程虽然是用C ++编写的,但无论你使用哪种语言,OpenGL函数几乎都是一样的使用,只有一些很容易发现和改变的微小变化。 http://www.swiftless.com/tutorials/opengl/lighting_types.html