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();
}
}
输出结果如下: