Jogl-lighting

提供:Dev Guides
移動先:案内検索

JOGL-照明

この章では、JOGLを使用してオブジェクトに照明効果を適用する方法について説明します。

照明を設定するには、最初に* glEnable()メソッドを使用して照明を有効にします。 次に、 *GLLightingFunc インターフェイスの* glLightfv(int light、int pname、float [] params、int params_offset)*メソッドを使用して、オブジェクトに照明を適用します。 このメソッドは4つのパラメーターを取ります。

次の表に、* gllightfv()*メソッドのパラメーターを示します。

Sr.No. Parameter Name and Description
1

Light

ライトを指定します。 ライトの数は実装によって異なりますが、少なくとも8つのライトがサポートされます。 10個の値を受け入れます。これらのパラメーターは、以下に示す「光源パラメーター」という名前の別の表で説明されています。

2

Pname

単一値の光源パラメーターを指定します。 光源については、以下で説明する10個のパラメーターがあります。

3

Params

光源_light_のパラメーター_pname_に設定されている値へのポインターを指定します。

4

Light source parameter

以下に示す任意の光源パラメーターを使用できます。

光源パラメーター

次の表は、光源パラメータを示しています-

Sr.No. Parameter and Description
1

GL_AMBIENT

これには、光の周囲の強度を指定するパラメーターが含まれています。

2

GL_DIFFUSE

これには、光の拡散強度を指定するパラメーターが含まれています。

3

GL_SPECULAR

これには、光の鏡面反射強度を指定するパラメーターが含まれています。

4

GL_POSITION

同種のオブジェクト座標でのライトの位置を指定する4つの整数値または浮動小数点値が含まれます。

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

上記のプログラムをコンパイルして実行すると、次の出力が生成されます。 ここでは、回転ポリゴンのさまざまなスナップショットを照明で観察できます。

ポリゴン照明