- JOGL 圖形形狀
- JOGL - 繪圖基礎
- JOGL - 使用 GL_Lines 繪圖
- JOGL - 預定義形狀
- JOGL 3D 圖形
- JOGL - 3D 基礎
- JOGL - 3D 三角形
- JOGL - 3D 立方體
- JOGL - 附錄
- JOGL 有用資源
- JOGL - 快速指南
- JOGL - 有用資源
- JOGL - 討論
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
如果編譯並執行上述程式,它將生成以下輸出。在這裡,您可以觀察到帶有光照的旋轉多邊形的各種快照。