当前位置: 首页 > 教程 > JOGL >

JOGL 灯光效果

精华
小牛编辑
131浏览
2023-03-14

使用JOGL,您可以通过编码为任何类型的对象提供各种灯光效果。这种效果使物体在视觉上更好。

JOGL 灯光效果的光源

以下是一些重要的光源:

  • Ambient Lightning:它总是赋予物体特定的颜色。
  • Diffuse Lightning:它从不同角度将光散射到物体上。
  • Specular Lightning:它模拟物体上的亮点

JOGL 灯光效果 重要方法

这些是用于为物体提供灯光效果的一些重要方法:

  • glEnable() :调用此方法为具有所需参数的对象启用 light 属性,如下所示:
gl.glEnable( GL2.GL_LIGHTING );  
  • glDisable() -此方法禁用灯光。默认情况下,该属性是禁用的。
  • glLightFV() -这是 GLLightingfunc 接口的一个方法,包含四个光源参数。这些参数是: -
    • Light :它指定一种光。
    • Pname: 它指定光源参数。
    • Param : 用于指定在 pname 参数中传递的值。
    • Source parameter : 传递所需的光源参数。
float[] ambientLight = {0f, 0f, 1f,0f };    
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, ambientLight, 0);    
  
float[] specularLight = {1f, 0f, 0f,0f };    
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_SPECULAR, specularLight, 0);    
  
  
float[] diffuseLight = { 1f,0f,0f,0f };    
gl.glLightfv( GL2.GL_LIGHT0, GL2.GL_DIFFUSE, diffuseLight, 0 );  

JOGL 灯光效果 示例

在这个例子中,我们将像之前所做的那样旋转一个三角形。随着每次旋转,您会注意到三角形的颜色也会发生变化。

package cn.xnip;

import com.jogamp.opengl.util.FPSAnimator;

import javax.media.opengl.*;
import javax.media.opengl.awt.GLCanvas;
import javax.swing.*;

public class JLight implements GLEventListener {
    private float rotation;

    @Override
    public void display(GLAutoDrawable drawable) {

        final GL2 gl = drawable.getGL().getGL2();
        gl.glColor3f(1f, 0f, 0f);
        gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
        gl.glLoadIdentity();
        gl.glRotatef(rotation, 1.0f, 1.0f, 0.0f);

        gl.glBegin(GL2.GL_TRIANGLES);

        gl.glVertex2d(0, 0.5);

        gl.glVertex2d(-0.5, -0.5);

        gl.glVertex2d(0.5, -0.5);

        gl.glEnd();

        gl.glFlush();
        //Angle  
        rotation += 0.6f;

        gl.glEnable(GL2.GL_LIGHTING);
        gl.glEnable(GL2.GL_LIGHT0);
        gl.glEnable(GL2.GL_DEPTH_TEST);

        float[] ambientLight = {0f, 0f, 1f, 0f};
        gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, ambientLight, 0);

        float[] specularLight = {1f, 0f, 0f, 0f};
        gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_SPECULAR, specularLight, 0);


        float[] diffuseLight = {1f, 0f, 0f, 0f};
        gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, diffuseLight, 0);
    }

    @Override
    public void dispose(GLAutoDrawable arg0) {
        //method body    
    }

    @Override
    public void init(GLAutoDrawable arg0) {

    }

    @Override
    public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {

    }

    public static void main(String[] args) {

        final GLProfile gp = GLProfile.get(GLProfile.GL2);
        GLCapabilities cap = new GLCapabilities(gp);

        final GLCanvas gc = new GLCanvas(cap);
        JLight tr = new JLight();
        gc.addGLEventListener(tr);
        gc.setSize(400, 400);

        final JFrame frame = new JFrame("xnip.cn:JOGL Lighting");
        frame.add(gc);
        frame.setSize(500, 400);
        frame.setVisible(true);

        final FPSAnimator animator = new FPSAnimator(gc, 400, true);
        animator.start();
    }
}  

输出结果如下: