本章介绍如何使用JOGL将光照效果应用于对象.
要设置光照,最初使用 glEnable()方法启用光照.然后使用 GLLightingFunc 接口的 glLightfv(int light,int pname,float [] params,int params_offset)方法为对象应用光照.此方法有四个参数.
下表描述了 gllightfv()方法的参数.
Sr.No. | 参数名称和描述 |
---|---|
1 | 光 指定一个光.灯的数量取决于实现,但至少支持八个灯.它接受10个值,这些参数在下面给出的名为Light Source Parameters的单独表中讨论. |
2 | Pname 指定单值光源参数.对于光源,有十个参数,如下所述. |
3 | 参数 指定一个或多个值的指针,该值设置为参数 pname 光源光. |
4 | 光源参数 您可以使用下面给出的任何光源参数. |
光源参数
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 您可以使用任何这些衰减因子,它们由单个值表示. |
启用照明或使用 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
如果你编译和执行上面的程序,它会生成以下输出.在这里,您可以观察带有光照的旋转多边形的各种快照.