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

Posted

技术标签:

【中文标题】如何在openGL中制作一个光球?【英文标题】:How can I make a ball of light in openGL? 【发布时间】:2009-12-28 04:09:37 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

灯永远不可见。

但是,它们对其他对象的材质的影响是。因此,场景中的所有对象都必须设置适当的材质属性。

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

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

【讨论】:

【参考方案2】:

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

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

有关生成光晕的信息,请阅读此OpenGL Bloom Tutorial,这里是一些使用 GLSL 生成光晕效果的 Java 中的 sample code。

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于如何在openGL中制作一个光球?的主要内容,如果未能解决你的问题,请参考以下文章

如何在openGL中制作一步一步的显示动画?

如何在 iOS 中制作 OpenGL ES 帧缓冲区的副本?

C ++ OpenGL:如何在圆柱体上制作第二个圆圈?

如何在 OpenGL 中绘制 3D 矢量?

如何使用 OpenGL 制作渐变到黑色的效果?

如何使用 xcode 制作简单的 OpenGl C++ 程序