LWJGL 2d照明(Java)

LWJGL 2d照明(Java),java,lwjgl,lighting,light,Java,Lwjgl,Lighting,Light,我和我的团队刚刚将我们的游戏从java2d移植到LWJGL,现在想添加灯光。 我们想补充的是: 发光且可移动的项目/实体 静态照明 我们已经在谷歌上搜索了很长一段时间,但是我们有点迷路了,因为我们不知道从哪里开始。 我们已经看到了alpha映射方法,但无法真正让它发挥作用 如果有人能给我一个答案,我会很高兴的 谢谢 创建灯光可能比想象的要容易!下面的代码将创建灯光并启用照明,尽管可以使用不同的参数,但您也可以更改和使用类似于GL_SPECULAR等的内容 FloatBuffer ambien

我和我的团队刚刚将我们的游戏从java2d移植到LWJGL,现在想添加灯光。 我们想补充的是:

  • 发光且可移动的项目/实体
  • 静态照明
我们已经在谷歌上搜索了很长一段时间,但是我们有点迷路了,因为我们不知道从哪里开始。 我们已经看到了alpha映射方法,但无法真正让它发挥作用

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


谢谢

创建灯光可能比想象的要容易!下面的代码将创建灯光并启用照明,尽管可以使用不同的参数,但您也可以更改和使用类似于
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_照明)然后调用
glEnable(GL_LIGHTING)操作

记得 如果您不静态导入类,那么只需通知您
glEnable(GL_LIGHTING)将是
GL11.glEnable(GL11.glu照明)
还要记住,OpenGL仅包含从
GL_LIGHT0
GL_LIGHT7
的0个灯光,尽管可以通过不同的方式轻松创建更多灯光

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

额外的 如果需要移动照明,只需更新
glLight(GL\u LIGHT0、GL\u位置、位置)每次移动灯光时


这是一个小的照明类型教程,我发现仅仅通过搜索“OpenGL照明”,虽然教程是用C++编写的,但是OpenGL函数几乎是相同的,不管你使用哪种语言,只有一些微小的变化,这些变化很容易发现和改变。p> 创建灯光可能比想象的要容易!下面的代码将创建灯光并启用照明,尽管可以使用不同的参数,但您也可以更改和使用类似于

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_照明)然后调用
glEnable(GL_LIGHTING)操作

记得 如果您不静态导入类,那么只需通知您
glEnable(GL_LIGHTING)将是
GL11.glEnable(GL11.glu照明)
还要记住,OpenGL仅包含从
GL_LIGHT0
GL_LIGHT7
的0个灯光,尽管可以通过不同的方式轻松创建更多灯光

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

额外的 如果需要移动照明,只需更新
glLight(GL\u LIGHT0、GL\u位置、位置)每次移动灯光时


这是一个小的照明类型教程,我发现仅仅通过搜索“OpenGL照明”,虽然教程是用C++编写的,但是OpenGL函数几乎是相同的,不管你使用哪种语言,只有一些微小的变化,这些变化很容易发现和改变。p> 首先,谢谢你的精彩和详细的回答,但我认为我在尝试应用你的帮助时犯了一些错误。原因我得到了以下错误:线程“main”java.nio.BufferOverflowException在java.nio.DirectFloatBufferU.put(未知源)在java.nio.FloatBuffer.put(未知源)在game.game.initGL(game.java:152)在game.game.mainLoop(game.java:117)在Start.main(Start.java:19)中出现异常,正如我从错误中看到的那样,您使用的大小比您试图放入缓冲区的大小小。我的意思是,如果你有一个大小为4的FloatBuffer,你最多只能添加4个Float。因此,如果您尝试添加第五个,那么将抛出该错误。所以我觉得你的尺寸比你想放的要小。因为某些原因它不起作用。。。你能看看这个截图吗?哦,看看你的代码,第一个你说ambient.put,下一个你说ambient.put,第二个也需要是position.put,如果这是渲染循环,那么你不需要在那里放置灯光(你可以)但是最好将它放在你初始化OpenGL和开始状态的地方。这有点修复了它,但产生了另一个错误:对不起,如果我有点难教,但是我们已经连续编写了4-5天了,在大约5个小时前将我们的游戏移植到lwjgl…首先,谢谢你的精彩和详细的回答,但我想我在尝试应用你的帮助时做错了什么。原因我得到了以下错误:线程“main”java.nio.BufferOverflowException在java.nio.DirectFloatBufferU.put(未知源)在java.nio.FloatBuffer.put(未知源)在game.game.initGL(game.java:152)在game.game.mainLoop(game.java:117)在Start.main(Start.java:19)中出现异常,正如我从错误中看到的那样,您使用的是比您尝试的更小的尺寸