JOGL - Ánh sáng
Chương này giải thích cho bạn cách áp dụng hiệu ứng ánh sáng cho một đối tượng bằng JOGL.
Để thiết lập ánh sáng, ban đầu hãy bật đèn bằng cách sử dụng glEnable()phương pháp. Sau đó, áp dụng ánh sáng cho các đối tượng, sử dụngglLightfv(int light, int pname, float[] params, int params_offset) phương pháp của GLLightingFuncgiao diện. Phương thức này có bốn tham số.
Bảng sau đây mô tả các thông số của gllightfv() phương pháp.
Sr.No. | Tên và mô tả thông số |
---|---|
1 | Light Chỉ định một ánh sáng. Số lượng đèn tùy thuộc vào việc triển khai, nhưng ít nhất tám đèn được hỗ trợ. Nó chấp nhận mười giá trị, những tham số đó được thảo luận trong một bảng riêng biệt có tên Tham số nguồn sáng được đưa ra bên dưới. |
2 | Pname Chỉ định một tham số nguồn sáng có giá trị duy nhất. Đối với nguồn sáng, có mười thông số như được thảo luận dưới đây. |
3 | Params Chỉ định một con trỏ đến giá trị hoặc giá trị được thiết lập để các tham số pname của nguồn ánh sáng ánh sáng . |
4 | Light source parameter Bạn có thể sử dụng bất kỳ thông số nguồn sáng nào dưới đây. |
Thông số nguồn sáng
Sr.No. | Thông số và mô tả |
---|---|
1 | GL_AMBIENT Nó chứa các thông số chỉ định cường độ ánh sáng xung quanh. |
2 | GL_DIFFUSE Nó chứa các thông số chỉ định cường độ khuếch tán của ánh sáng. |
3 | GL_SPECULAR Nó chứa các thông số chỉ định cường độ đặc biệt của ánh sáng. |
4 | GL_POSITION Nó chứa bốn giá trị số nguyên hoặc dấu phẩy động xác định vị trí của ánh sáng trong tọa độ vật thể đồng nhất. |
5 | GL_SPOT_DIRECTION Nó chứa các tham số chỉ định hướng của ánh sáng trong các tọa độ vật thể đồng nhất. |
6 | GL_SPOT_EXPONENT Các thông số của nó xác định sự phân bố cường độ của ánh sáng. |
7 | GL_SPOT_CUTOFF Tham số đơn này chỉ định góc lan truyền tối đa của ánh sáng. |
số 8 | GL_CONSTANT_ATTENUATION or GL_LINEAR_ATTENUATION or GL_QUADRATIC_ATTENUATION Bạn có thể sử dụng bất kỳ hệ số suy giảm nào trong số này, được biểu thị bằng một giá trị duy nhất. |
Ánh sáng được bật hoặc tắt bằng cách sử dụng glEnable() và glDisable () các phương thức với đối số GL_LIGHTING.
Mẫu sau được đưa ra để chiếu sáng -
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);
Áp dụng ánh sáng cho một đa giác xoay
Làm theo các bước đã cho để áp dụng ánh sáng cho một đa giác xoay.
Xoay đa giác bằng phương thức 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);
Chúng ta hãy xem qua chương trình để áp dụng ánh sáng cho một đa giác xoay -
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
Nếu bạn biên dịch và thực thi chương trình trên, nó sẽ tạo ra kết quả sau. Tại đây, bạn có thể quan sát các ảnh chụp nhanh khác nhau của một đa giác xoay với ánh sáng.