JOGL - 光照



本章解釋如何使用 JOGL 為物件應用光照效果。

要設定光照,首先使用 `glEnable()` 方法啟用光照。然後使用 `GLLightingFunc` 介面的 `glLightfv(int light, int pname, float[] params, int params_offset)` 方法為物件應用光照。此方法接受四個引數。

下表描述了 `gllightfv()` 方法的引數。

序號 引數名稱和描述
1

光源 (Light)

指定一個光源。光源的數量取決於實現,但至少支援八個光源。它接受十個值,這些引數在下面給出的名為“光源引數”的單獨表格中討論。

2

引數名稱 (Pname)

指定單個值的光源引數。對於光源,有十個引數,如下所述。

3

引數值 (Params)

指定指向光源 `light` 的引數 `pname` 設定的值或值的指標。

4

光源引數

您可以使用下面給出的任何光源引數。

光源引數

序號 引數和描述
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 };  // 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 

如果編譯並執行上述程式,它將生成以下輸出。在這裡,您可以觀察到帶有光照的旋轉多邊形的各種快照。

Polygon Lighting
廣告