JOGL-조명
이 장에서는 JOGL을 사용하여 오브젝트에 조명 효과를 적용하는 방법을 설명합니다.
조명을 설정하려면 처음에 glEnable()방법. 그런 다음 개체에 조명을 적용합니다.glLightfv(int light, int pname, float[] params, int params_offset) 의 방법 GLLightingFunc상호 작용. 이 메소드는 4 개의 매개 변수를 사용합니다.
다음 표는 gllightfv() 방법.
Sr. 아니. | 매개 변수 이름 및 설명 |
---|---|
1 | Light 조명을 지정합니다. 조명의 수는 구현에 따라 다르지만 최소 8 개의 조명이 지원됩니다. 10 개의 값을 허용하며, 이러한 매개 변수는 아래에 제공된 광원 매개 변수라는 별도의 표에서 설명합니다. |
2 | Pname 단일 값 광원 매개 변수를 지정합니다. 광원의 경우 아래에 설명 된대로 10 개의 매개 변수가 있습니다. |
삼 | Params 매개 변수에 설정된 값 또는 값에 대한 포인터를 지정 PNAME 광원의 빛 . |
4 | Light source parameter 아래에 제공된 광원 매개 변수를 사용할 수 있습니다. |
광원 매개 변수
Sr. 아니. | 매개 변수 및 설명 |
---|---|
1 | GL_AMBIENT 조명의 주변 강도를 지정하는 매개 변수가 포함되어 있습니다. |
2 | GL_DIFFUSE 라이트의 확산 강도를 지정하는 매개 변수가 포함됩니다. |
삼 | 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 단일 값으로 표시되는 이러한 감쇠 계수를 사용할 수 있습니다. |
조명은 다음을 사용하여 활성화 또는 비활성화합니다. 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
위 프로그램을 컴파일하고 실행하면 다음과 같은 출력이 생성됩니다. 여기에서 조명이있는 회전하는 다각형의 다양한 스냅 샷을 관찰 할 수 있습니다.