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

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); 

我还需要做什么才能让灯光可见?

3个回答

7

灯光本身是看不见的。

然而,它们对其他物体的材质产生影响。因此,场景中的所有物体都需要设置适当的材质属性。

您可能会对这篇文章感兴趣,它提到了照明场景时常犯的错误

alt text

如果您想设置材质属性,最简单的方法是查找glColorMaterial函数。


2
像Frank所说的那样,灯光是看不见的,它们只是作为渲染系统(硬件/软件)使用的照明方程的输入,以计算几何体的最终颜色。
如果您想让某些东西看起来像灯光,您需要模仿在观察亮光源时习惯看到的效果之一,即光晕。
有关生成光晕的信息,请阅读此OpenGL Bloom教程,这里是使用GLSL在Java中生成光晕效果的示例代码

2
根据你想要的是完全绽放的效果(如果是的话,请看Josh Perry的回答)还是只是一个不暗的物体,看起来像是发光的,你可能想考虑这种简单的方法。
  • 渲染场景时不使用实际的“太阳”网格,而是在“太阳”中心使用一个点光源。
  • 禁用GL照明。
  • 渲染一个球体或使用广告牌在适当的位置渲染太阳的图像。
  • 在显示下一帧之前重新启用GL照明。
因为你已经禁用了照明,所以太阳会被呈现为“全亮”的状态,没有进行任何阴影或照明计算。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接