如何在openGL中制作一个光球?

时间:2009-12-28 04:09:37

标签: java c++ opengl lighting

我正在尝试制作一个光球(像太阳一样),但我似乎根本无法看到它。我会给你一些代码snipets。它在Java LWJGL中,所以它可能看起来有点不同。

private float lightAmbient[] = { 0.0f, 1.0f, 1.0f, 1.0f };  // Ambient Light Values ( NEW )
    private float lightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };      // Diffuse Light Values ( NEW )
    private float lightPosition[] = { 0.0f, 0.0f, -5.0f, 1.0f }; // Light Position ( NEW )
    float lightSpecular[] = { 0f, 0f, 0.5f, 1.0f };  // highlight

ByteBuffer temp = ByteBuffer.allocateDirect(16);
        temp.order(ByteOrder.nativeOrder());
        GL11.glLight(GL11.GL_LIGHT1, GL11.GL_AMBIENT, (FloatBuffer)temp.asFloatBuffer().put(lightAmbient).flip());              // Setup The Ambient Light
        GL11.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, (FloatBuffer)temp.asFloatBuffer().put(lightDiffuse).flip());              // Setup The Diffuse Light
        GL11.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION,(FloatBuffer)temp.asFloatBuffer().put(lightPosition).flip());         // Position The Light
        GL11.glLight(GL11.GL_LIGHT1, GL11.GL_SPECULAR,(FloatBuffer)temp.asFloatBuffer().put(lightSpecular).flip());         // Position The Light

        GL11.glEnable(GL11.GL_LIGHT1); 

我还需要做些什么来使灯光可见?

3 个答案:

答案 0 :(得分:7)

灯光永远不可见。

但是,它们对其他对象的材料的影响是。因此,场景中的所有对象都设置了适当的材质属性非常重要。

您可能会对mentions all the common mistakes在尝试照亮场景时所做的这篇文章感兴趣。

alt text

您需要查找glColorMaterial函数,因为它们是设置材质属性的最简单方法。

答案 1 :(得分:2)

就像弗兰克所说,灯光是不可见的,它们仅用作渲染系统(硬件/软件)用来计算几何体最终颜色的光照方程的输入。

如果你想让某些东西看起来像一盏灯,你需要模仿你在看到明亮光源时所看到的效果。对于太阳来说,最引人注目的效果之一是光照。

有关生成轻量级的信息,请阅读此OpenGL Bloom Tutorial,这里有一些sample code在Java中使用GLSL生成bloom效果。

答案 2 :(得分:2)

根据您是否需要盛开式效果(如果是这样,请查看Josh Perry的答案)或者只是一个看似发光的非暗物体对象,您可能需要考虑这种简单的方法。

  • 在没有实际“太阳”网格的情况下渲染场景,但在“太阳”的中心有一个点光源。
  • 禁用GL照明。
  • 渲染球体或使用billboard在适当的位置渲染太阳图像。
  • 在显示下一帧之前重新启用GL Lighting。

由于您已禁用光照,太阳将呈现为“全亮”,不会执行阴影或光照计算。