JOGL - 照明
本章向您介绍如何使用 JOGL 将照明效果应用于对象。
要设置照明,首先使用 glEnable() 方法启用照明。然后使用 GLLightingFunc 接口的 glLightfv(int light, int pname, float[] params, int params_offset) 方法为对象应用照明。此方法需要四个参数。
下表描述了 gllightfv() 方法的参数。
Sr.No. | 参数名称和说明 |
---|---|
1 | Light 指定光源。光源数量取决于实现,但至少支持八个光源。它接受十个值,这些参数在下面给出的名为"光源参数"的单独表格中讨论。 |
2 | Pname 指定单值光源参数。对于光源,有十个参数,如下所述。 |
3 | Params 指定指向设置为光源 light 的参数 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 }; // 弱红色环境光 gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, ambientLight, 0); float[] difficileLight = { 1f,2f,1f,0f }; // 多色漫反射 gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_DIFFUSE, difficileLight, 0);
将光应用于旋转多边形
按照给定的步骤将光应用于旋转多边形。
使用 glRotate() 方法旋转多边形
gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓冲区 gl.glLoadIdentity(); // 重置视图 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); //应用红色 // 清除屏幕和深度缓冲区 gl.glClear( GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT ); gl.glLoadIdentity(); // 重置视图 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; //分配角度 gl.glEnable( GL2.GL_LIGHTING ); gl.glEnable( GL2.GL_LIGHT0 ); gl.glEnable( GL2.GL_NORMALIZE ); // 弱红色环境光 float[] ambientLight = { 0.1f, 0.f, 0.f,0f }; gl.glLightfv(GL2.GL_LIGHT0, GL2.GL_AMBIENT, ambient-Light, 0); // 多色漫反射 float[] difficileLight = { 1f,2f,1f,0f }; gl.glLightfv( GL2.GL_LIGHT0, GL2.GL_DIFFUSE, difficile-Light, 0 ); } @Override public void dispose( GLAutoDrawable arg0 ) { //method body } @Override public void init( GLAutoDrawable arg0 ) { // 方法主体 } @Override public void reshape( GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4 ) { // 方法主体 } public static void main( String[] args ) { //获取 GL2 配置文件的功能对象 final GLProfile profile = GLProfile.get( GLProfile.GL2 ); GLCapabilities capabilities = new GLCapabilities( profile); // 画布 final GLCanvas glcanvas = new GLCanvas( capabilities ); PolygonLighting polylighting = new PolygonLighting(); glcanvas.addGLEventListener( polygonlighting ); glcanvas.setSize( 400, 400 ); //创建框架 final JFrame frame = new JFrame (" Polygon lighting "); //向其添加画布 frame.getContentPane().add( glcanvas ); frame.setSize( frame.getContentPane().getPreferredSize()); frame.setVisible( true ); //实例化并启动动画器 final FPSAnimator animator = new FPSAnimator(glcanvas, 300,true ); animator.start(); } //end of main } //end of class
如果您编译并执行上述程序,它将生成以下输出。在这里,您可以观察到带有照明的旋转多边形的各种快照。
