JOGL - Oświetlenie

W tym rozdziale wyjaśniono, jak zastosować efekt oświetlenia do obiektu za pomocą JOGL.

Aby ustawić oświetlenie, najpierw włącz oświetlenie za pomocą glEnable()metoda. Następnie zastosuj oświetlenie obiektów za pomocąglLightfv(int light, int pname, float[] params, int params_offset) metoda GLLightingFuncberło. Ta metoda wymaga czterech parametrów.

W poniższej tabeli opisano parametry gllightfv() metoda.

Sr.No. Nazwa i opis parametru
1

Light

Określa światło. Liczba świateł zależy od implementacji, ale obsługiwanych jest co najmniej osiem świateł. Przyjmuje dziesięć wartości, parametry te są omówione w osobnej tabeli o nazwie Parametry źródła światła podanej poniżej.

2

Pname

Określa parametr źródła światła o pojedynczej wartości. W przypadku źródła światła istnieje dziesięć parametrów omówionych poniżej.

3

Params

Określa wskaźnik do wartości lub wartości ustawionych w parametrze pname światła źródła światła .

4

Light source parameter

Możesz użyć dowolnego z poniższych parametrów źródła światła.

Parametry źródła światła

Sr.No. Parametr i opis
1

GL_AMBIENT

Zawiera parametry określające natężenie światła otoczenia.

2

GL_DIFFUSE

Zawiera parametry określające rozproszone natężenie światła.

3

GL_SPECULAR

Zawiera parametry określające zwierciadlane natężenie światła.

4

GL_POSITION

Zawiera cztery wartości całkowite lub zmiennoprzecinkowe, które określają położenie światła w jednorodnych współrzędnych obiektu.

5

GL_SPOT_DIRECTION

Zawiera parametry określające kierunek światła w jednorodnych współrzędnych obiektu.

6

GL_SPOT_EXPONENT

Jego parametry określają rozkład natężenia światła.

7

GL_SPOT_CUTOFF

Pojedynczy parametr określa maksymalny kąt rozproszenia światła.

8

GL_CONSTANT_ATTENUATION or GL_LINEAR_ATTENUATION or GL_QUADRATIC_ATTENUATION

Możesz użyć dowolnego z tych współczynników tłumienia, które są reprezentowane przez pojedynczą wartość.

Oświetlenie jest włączane lub wyłączane za pomocą glEnable() i glDisable () z argumentem GL_LIGHTING.

Poniższy szablon dotyczy oświetlenia -

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);

Stosowanie światła do obracającego się wielokąta

Wykonaj podane czynności, aby zastosować światło do obracającego się wielokąta.

Obróć wielokąt za pomocą metody 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);

Przejdźmy przez program, aby zastosować światło do obracającego się wielokąta -

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

Jeśli kompilujesz i wykonujesz powyższy program, generuje on następujące dane wyjściowe. Tutaj możesz obserwować różne migawki obracającego się wielokąta z oświetleniem.