开发手册 欢迎您!
软件开发者资料库

JOGL - Lighting

JOGL Lighting - 使用这个初学者的教程,简单易学地学习JOGL,包括从简介,概述,安装,基本模板,带有AWT的画布,Swing,GLJPanel类,图形形状,对象转换,着色,缩放等基础到高级知识。旋转,照明,3D图形,附录。

本章介绍如何使用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

如果你编译和执行上面的程序,它会生成以下输出.在这里,您可以观察带有光照的旋转多边形的各种快照.

Polygon Lighting