0

我和我的团队刚刚将我们的游戏从 java2d 移植到 LWJGL,现在想添加光照。我们确切想要添加的内容:

  • 发光且可移动的物品/实体。
  • 静态照明

我们已经用谷歌搜索了很长一段时间,但有点迷失,因为我们不知道从哪里开始。我们已经看到了 alpha 映射方法,但无法真正让它发挥作用。

如果有人能给我一个答案,我会很高兴。

谢谢!

4

1 回答 1

3

创建灯光可能比人们想象的要容易!下面的代码将创建一个灯光并启用灯光,尽管可以使用不同的参数,您也可以更改和使用诸如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 等光照的影响,那么在渲染 UI 之前调用glDisable(GL_LIGHTING);,然后在 UIglEnable(GL_LIGHTING);之后再次调用,如果您希望之后启用光照。

记住

如果您不静态导入类,那么只是为了通知您,glEnable(GL_LIGHTING);GL11.glEnable(GL11.GL_LIGHTING);就像我刚刚向您展示的其他所有内容一样。

还要记住,OpenGL 只包含从GL_LIGHT0到 的0 个灯光GL_LIGHT7,尽管可以通过不同的方式轻松创建更多灯光。

重要的是,如果您认为使用 OpenGL 灯会产生阴影,那么这段代码会让您失望,如果我没记错的话,创建阴影是 OpenGL 灯和一些高级 FBO 工作的组合。

额外的

如果您想要可移动的照明,您只需在glLight(GL_LIGHT0, GL_POSITION, position);每次移动灯光时更新。

这是一个Lighting Types的小教程,我是通过搜索“opengl lighting”找到的,教程虽然是用C++编写的,但是无论你使用哪种语言,OpenGL的功能几乎都是一样的,只是一些很小的变化,很容易发现和改变。http://www.swiftless.com/tutorials/opengl/lighting_types.html

于 2013-08-08T09:25:50.570 回答