Учебники

JOGL — Освещение

В этой главе объясняется, как применить эффект освещения к объекту с помощью JOGL.

Чтобы установить освещение, сначала включите освещение, используя метод glEnable () . Затем примените освещение для объектов, используя метод glLightfv (int light, int pname, float [] params, int params_offset) интерфейса GLLightingFunc . Этот метод принимает четыре параметра.

В следующей таблице описаны параметры метода gllightfv () .

Sr.No. Имя параметра и описание
1

Свет

Определяет свет. Количество источников света зависит от реализации, но поддерживается как минимум восемь источников света. Он принимает десять значений, эти параметры обсуждаются в отдельной таблице с именем Параметры источника света, приведенной ниже.

2

PNAME

Определяет однозначный параметр источника света. Для источника света есть десять параметров, которые обсуждаются ниже.

3

Params

Указывает указатель на значение или значения, которые установлены для параметра pname источника света .

4

Параметр источника света

Вы можете использовать любой из параметров источника света, указанных ниже.

Свет

Определяет свет. Количество источников света зависит от реализации, но поддерживается как минимум восемь источников света. Он принимает десять значений, эти параметры обсуждаются в отдельной таблице с именем Параметры источника света, приведенной ниже.

PNAME

Определяет однозначный параметр источника света. Для источника света есть десять параметров, которые обсуждаются ниже.

Params

Указывает указатель на значение или значения, которые установлены для параметра pname источника света .

Параметр источника света

Вы можете использовать любой из параметров источника света, указанных ниже.

Параметры источника света

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

Вы можете использовать любой из этих факторов ослабления, который представлен одним значением.

GL_AMBIENT

Он содержит параметры, которые определяют интенсивность освещения.

GL_DIFFUSE

Он содержит параметры, которые определяют диффузную интенсивность света.

GL_SPECULAR

Он содержит параметры, которые определяют зеркальную интенсивность света.

gl_Position

Он содержит четыре целочисленных значения или значения с плавающей запятой, которые определяют положение источника света в однородных координатах объекта.

GL_SPOT_DIRECTION

Он содержит параметры, которые определяют направление света в однородных координатах объекта.

GL_SPOT_EXPONENT

Его параметры определяют распределение интенсивности света.

GL_SPOT_CUTOFF

Единственный параметр этого определяет максимальный угол рассеивания света.

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 

Если вы скомпилируете и выполните вышеуказанную программу, она выдаст следующий вывод. Здесь вы можете наблюдать различные снимки вращающегося многоугольника с подсветкой.