JOGL - Beleuchtung

In diesem Kapitel erfahren Sie, wie Sie mit JOGL einen Lichteffekt auf ein Objekt anwenden.

Um die Beleuchtung einzustellen, aktivieren Sie zunächst die Beleuchtung mit der glEnable()Methode. Wenden Sie dann die Beleuchtung für die Objekte an, indem Sie dieglLightfv(int light, int pname, float[] params, int params_offset) Methode von GLLightingFuncSchnittstelle. Diese Methode akzeptiert vier Parameter.

Die folgende Tabelle beschreibt die Parameter von gllightfv() Methode.

Sr.Nr. Parametername und Beschreibung
1

Light

Gibt ein Licht an. Die Anzahl der Lichter hängt von der Implementierung ab, es werden jedoch mindestens acht Lichter unterstützt. Es werden zehn Werte akzeptiert. Diese Parameter werden in einer separaten Tabelle mit dem Namen "Lichtquellenparameter" erläutert.

2

Pname

Gibt einen einwertigen Lichtquellenparameter an. Für die Lichtquelle gibt es zehn Parameter, wie unten erläutert.

3

Params

Gibt einen Zeiger auf den Wert oder die Werte an, die auf den Parameter pname des Lichtquellenlichts gesetzt sind .

4

Light source parameter

Sie können einen der unten angegebenen Lichtquellenparameter verwenden.

Lichtquellenparameter

Sr.Nr. Parameter und Beschreibung
1

GL_AMBIENT

Es enthält die Parameter, die die Umgebungsintensität des Lichts angeben.

2

GL_DIFFUSE

Es enthält die Parameter, die die diffuse Intensität des Lichts angeben.

3

GL_SPECULAR

Es enthält die Parameter, die die Spiegelintensität des Lichts angeben.

4

GL_POSITION

Es enthält vier Ganzzahl- oder Gleitkommawerte, die die Position des Lichts in homogenen Objektkoordinaten angeben.

5

GL_SPOT_DIRECTION

Es enthält Parameter, die die Lichtrichtung in homogenen Objektkoordinaten angeben.

6

GL_SPOT_EXPONENT

Seine Parameter geben die Intensitätsverteilung des Lichts an.

7

GL_SPOT_CUTOFF

Der einzelne Parameter gibt den maximalen Ausbreitungswinkel des Lichts an.

8

GL_CONSTANT_ATTENUATION or GL_LINEAR_ATTENUATION or GL_QUADRATIC_ATTENUATION

Sie können jeden dieser Dämpfungsfaktoren verwenden, der durch einen einzelnen Wert dargestellt wird.

Die Beleuchtung wird mit aktiviert oder deaktiviert glEnable() und glDisable () Methoden mit dem Argument GL_LIGHTING.

Die folgende Vorlage ist für die Beleuchtung angegeben -

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

Anwenden von Licht auf ein rotierendes Polygon

Befolgen Sie die angegebenen Schritte, um Licht auf ein rotierendes Polygon anzuwenden.

Drehen Sie das Polygon mit der Methode 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);

Lassen Sie uns das Programm durchgehen, um Licht auf ein rotierendes Polygon anzuwenden -

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

Wenn Sie das obige Programm kompilieren und ausführen, wird die folgende Ausgabe generiert. Hier können Sie verschiedene Schnappschüsse eines rotierenden Polygons mit Beleuchtung betrachten.