6

我正在尝试制作一个光球(像太阳一样),但我似乎根本无法让它可见。我会给你一些我拥有的代码片段。它在 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); 

我还需要做什么才能使光线可见?

4

3 回答 3

7

灯永远不可见。

但是,它们对其他物体的材质的影响是。因此,场景中的所有对象都具有适当的材质属性集,这一点很重要。

您可能会对这篇文章感兴趣,该文章提到了尝试照亮场景时所犯的所有常见错误。

替代文字

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

于 2009-12-28T04:15:09.983 回答
2

根据您是否想要完全绽放风格的效果(如果是这样,请查看 Josh Perry 的回答)或者只是一个似乎发光的非黑暗物体对象,您可能需要考虑这种简单的方法。

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

因为您已禁用照明,所以太阳将被渲染为“全亮”,而不会执行任何阴影或照明计算。

于 2009-12-28T11:13:37.563 回答
2

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

如果你想让某物看起来像一盏灯,你需要模仿你在看明亮光源时看到的效果。对于太阳来说,最明显的影响之一是光晕。

有关生成光晕的信息,请阅读此OpenGL Bloom 教程,这里是一些使用 GLSL 生成光晕效果的 Java示例代码。

于 2009-12-28T04:54:19.687 回答