JOGL - 照明

本章向您介绍如何使用 JOGL 将照明效果应用于对象。

要设置照明,首先使用 glEnable() 方法启用照明。然后使用 GLLightingFunc 接口的 glLightfv(int light, int pname, float[] params, int params_offset) 方法为对象应用照明。此方法需要四个参数。

下表描述了 gllightfv() 方法的参数。

Sr.No. 参数名称和说明
1

Light

指定光源。光源数量取决于实现,但至少支持八个光源。它接受十个值,这些参数在下面给出的名为"光源参数"的单独表格中讨论。

2

Pname

指定单值光源参数。对于光源,有十个参数,如下所述。

3

Params

指定指向设置为光源 light 的参数 pname 的值的指针。

4

光源参数

您可以使用下面给出的任何光源参数。

光源参数

Sr.No. 参数和说明
1

GL_AMBIENT

包含指定光的环境强度的参数。

2

GL_DIFFUSE

包含指定光的漫反射强度的参数光。

3

GL_SPECULAR

它包含指定光的镜面强度的参数。

4

GL_POSITION

它包含四个整数或浮点值,用于指定光在同质对象坐标中的位置。

5

GL_SPOT_DIRECTION

它包含指定光在同质对象中方向的参数坐标。

6

GL_SPOT_EXPONENT

其参数指定光的强度分布。

7

GL_SPOT_CUTOFF

其单个参数指定光的最大扩散角度。

8

GL_CONSTANT_ATTENUATION 或 GL_LINEAR_ATTENUATION 或 GL_QUADRATIC_ATTENUATION

您可以使用这些衰减因子中的任何一个,它由单个表示值。

使用 glEnable()glDisable () 方法以及参数 GL_LIGHTING 启用或禁用照明。

以下模板用于照明 −

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

float[] ambientLight = { 0.1f, 0.f, 0.f,0f }; // 弱红色环境光
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, ambientLight, 0);

float[] difficileLight = { 1f,2f,1f,0f }; // 多色漫反射
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, difficileLight, 0);

将光应用于旋转多边形

按照给定的步骤将光应用于旋转多边形。

使用 glRotate() 方法旋转多边形

gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);

// 清除屏幕和深度缓冲区
gl.glLoadIdentity();

// 重置视图
gl.glRotatef(rpoly, 0.0f, 1.0f, 0.0f);

让我们通过程序将光应用到旋转多边形上 −

import javax.media.opengl.GL2; 
import javax.media.opengl.GLAutoDrawable; 
import javax.media.opengl.GLCapabilities; 
import javax.media.opengl.GLEventListener; 
import javax.media.opengl.GLProfile; 
import javax.media.opengl.awt.GLCanvas; 

import javax.swing.JFrame; 

import com.jogamp.opengl.util.FPSAnimator; 
 
public class PolygonLighting implements GLEventListener { 
   private float rpoly;
	
   @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( rpoly, 0.0f, 1.0f, 0.0f );
        
        gl.glBegin( GL2.GL_POLYGON );
        
        gl.glVertex3f( 0f,0.5f,0f );
        gl.glVertex3f( -0.5f,0.2f,0f );
        gl.glVertex3f( -0.5f,-0.2f,0f );
        gl.glVertex3f( 0f,-0.5f,0f );
        gl.glVertex3f( 0f,0.5f,0f );
        gl.glVertex3f( 0.5f,0.2f,0f );
        gl.glVertex3f( 0.5f,-0.2f,0f );
        gl.glVertex3f( 0f,-0.5f,0f );
        
        gl.glEnd();
        
        gl.glFlush();
        
        rpoly += 0.2f; //分配角度
        
        gl.glEnable( GL2.GL_LIGHTING );
        gl.glEnable( GL2.GL_LIGHT0 );
        gl.glEnable( GL2.GL_NORMALIZE );
        
        // 弱红色环境光
        float[] ambientLight = { 0.1f, 0.f, 0.f,0f };
        gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, ambient-Light, 0);
        
        // 多色漫反射
        float[] difficileLight = { 1f,2f,1f,0f };
        gl.glLightfv( GL2.GL_LIGHT0, GL2.GL_DIFFUSE, difficile-Light, 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 ) { 
   
        //获取 GL2 配置文件的功能对象
        final GLProfile profile = GLProfile.get( GLProfile.GL2 );
        GLCapabilities capabilities = new GLCapabilities( profile);
        
        // 画布
        final GLCanvas glcanvas = new GLCanvas( capabilities );
        PolygonLighting polylighting = new PolygonLighting();
        glcanvas.addGLEventListener( polygonlighting );
        glcanvas.setSize( 400, 400 );
        
        //创建框架
        final JFrame frame = new JFrame (" Polygon lighting ");
        
        //向其添加画布
        frame.getContentPane().add( glcanvas );
        frame.setSize( frame.getContentPane().getPreferredSize());
        frame.setVisible( true );
        
        //实例化并启动动画器
        final FPSAnimator animator = new FPSAnimator(glcanvas, 300,true );
        animator.start();                    
      
   } //end of main 
	
} //end of class 

如果您编译并执行上述程序,它将生成以下输出。在这里,您可以观察到带有照明的旋转多边形的各种快照。

Polygon Lighting