当前位置: 首页 > 文档资料 > JOGL 中文教程 >

照明(Lighting)

优质
小牛编辑
120浏览
2023-12-01

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

要设置光照,最初使用glEnable()方法启用光照。 然后使用GLLightingFunc接口的GLLightingFunc glLightfv(int light, int pname, float[] params, int params_offset)方法为GLLightingFunc 。 该方法有四个参数。

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

Sr.No.参数名称和描述
1

Light

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

2

Pname

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

3

Params

指定指向一个或多个值的指针,该值设置为光源light的参数pname

4

Light source parameter

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

光源参数

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 or GL_LINEAR_ATTENUATION or GL_QUADRATIC_ATTENUATION

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

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

以下模板用于照明 -

gl.glEnable(GL2.GL_LIGHTING); 
gl.glEnable(GL2.GL_LIGHT0);  
gl.glEnable(GL2.GL_NORMALIZE); 
float[] ambientLight = { 0.1f, 0.f, 0.f,0f };  // weak RED ambient 
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, ambientLight, 0); 
float[] diffuseLight = { 1f,2f,1f,0f };  // multicolor diffuse 
gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, diffuseLight, 0); 

将光应用于旋转多边形

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

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

gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); 
// Clear The Screen And The Depth Buffer  
gl.glLoadIdentity();  
// Reset The View  
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); //applying red
      // Clear The Screen And The Depth Buffer 
      gl.glClear( GL2.GL_COLOR_BUFFER_BIT |  
      GL2.GL_DEPTH_BUFFER_BIT );   
      gl.glLoadIdentity();       // Reset The View    
      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;  //assigning the angle 
      gl.glEnable( GL2.GL_LIGHTING );  
      gl.glEnable( GL2.GL_LIGHT0 );  
      gl.glEnable( GL2.GL_NORMALIZE );  
      // weak RED ambient 
      float[] ambientLight = { 0.1f, 0.f, 0.f,0f };  
      gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, ambient-Light, 0);  
      // multicolor diffuse 
      float[] diffuseLight = { 1f,2f,1f,0f };  
      gl.glLightfv( GL2.GL_LIGHT0, GL2.GL_DIFFUSE, diffuse-Light, 0 ); 
   }  
   @Override 
   public void dispose( GLAutoDrawable arg0 ) { 
      //method body  
   } 
   @Override 
   public void init( GLAutoDrawable arg0 ) { 
      // method body     
   } 
   @Override 
   public void reshape( GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4 ) { 
      // method body 
   } 
   public static void main( String[] args ) { 
      //getting the capabilities object of GL2 profile 
      final GLProfile profile = GLProfile.get( GLProfile.GL2 ); 
      GLCapabilities capabilities = new GLCapabilities( profile);
      // The canvas  
      final GLCanvas glcanvas = new GLCanvas( capabilities ); 
      PolygonLighting polygonlighting = new PolygonLighting(); 
      glcanvas.addGLEventListener( polygonlighting ); 
      glcanvas.setSize( 400, 400 ); 
      //creating frame 
      final JFrame frame = new JFrame (" Polygon lighting ");  
      //adding canvas to it 
      frame.getContentPane().add( glcanvas ); 
      frame.setSize( frame.getContentPane().getPreferredSize()); 
      frame.setVisible( true );  
      //Instantiating and Initiating Animator 
      final FPSAnimator animator = new FPSAnimator(glcanvas, 300,true ); 
      animator.start();                     
   } //end of main 
} //end of class 

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

多边形照明