OpenGL中的一个重要的概念

1. OpenGL中的一个重要的概念:环绕。

2. 详细的介绍GL11.GL_TRIANGLE_FANGL11.GL_TRIANGLE_STRIP参数。

 

 

1. 环绕

我们知道画一个三角形有两种画法:顺时针和逆时针。如下图所示:


OpenGL中把顶点的指定次序以及方向的组合称为环绕(winding)。

因此,上图中左边的三角形被称为具有逆时针环绕方向,而右边的三角形被认为具有顺时针环绕方向。而在缺省情况下:OpenGL认为多边形具有正面逆时针方向的环绕。这意味着上图左侧的三角形是这个三角形的证明,右侧的三角形是那个三角形的背面。(是不是不能理解???哈哈,你肯定在二维平面里考虑问题了,换成三维平面,再试一试!)

    这个问题为什么非常重要呢?很快你将会看到,你常常希望为一个多边形的正面和背面分别设置不同的物理特性。你可以隐藏一个多边形的背面(这样可以减少渲染工作),或者给它设置一种不同的颜色和反射属性(这个不理解,期待以后的教程吧J)。在一个场景中,使所有的多边形保持环绕的一致,并使用正面多边形来绘制所有实心物体的外表是非常重要的。

当然了,如果你希望改变OpenGL的这个缺省行为,你可以调用下面这个函数:GL11.glFrontFace(GL11.GL_CW);GL_CW参数告诉OpenGL顺时针环绕的多边形将被认为是正面的。你可以使用GL11.GL_CCW参数将正面重新恢复为逆时针环绕。(不推荐更改默认行为,还是约定俗成的好,不然别人不好理解你的代码)。

2.GL11.GL_TRIANGLE_FAN

   在很多情况下面,我们要画多个三角形,但是这些三角形有围绕一个中心点,我们将如何画出呢?按照我们上期讲述的方法,那只有一个先指定一个三角形的顶点数据,然后画出这个三角形,再接着清除上述指定的顶点信息,再画一个三角形如此,一个一个的画,我们试想一下,对于中心顶点,我们要赋值多次,而且这样一次又一次的画三角形效率肯定很低。现在我们使用GL11.GL_TRIANGLE_FAN参数,画多个围绕一个中心点的三角形。代码如下:

package com.helloworld.fneg; 

 

import java.util.Random;

 

import com.badlogic.gdx.ApplicationListener;

import com.badlogic.gdx.backends.jogl.JoglApplication;

import com.badlogic.gdx.graphics.Color;

import com.badlogic.gdx.graphics.GL11;

import com.badlogic.gdx.graphics.Mesh;

import com.badlogic.gdx.graphics.VertexAttribute;

import com.badlogic.gdx.graphics.VertexAttributes.Usage;

 

/**

 *@Copyright:Copyright (c) 2008 - 2100 

 *@Company:Sagret

 *@Author:fengcunhan  [email protected]

 *@Package:com.helloworld.fneg

 *@FileName:Fan**.java

 *@Time:2011-1-13

 *@User:feng

 */

public class FanTriangle implements ApplicationListener {

    private Mesh dodecagonMesh;

    private float[] vertices;

    private short[] indexs;

    private Random random;

   

    @Override

    public void create() {

       // TODO Auto-generatedmethod stub 

       dodecagonMesh=new Mesh(true, 32,8, new VertexAttribute(Usage.Position, 3, "point"),newVertexAttribute(Usage.ColorPacked, 4, "color"));

       float bordLength=0.5f;

       float angleIncrease=(float)((60f/360f)*2.0f*3.14f);

       random=new Random();

       int i=0;

       vertices=new float[32];

      

       vertices[i++]=0;

       vertices[i++]=0;

       vertices[i++]=0;

       vertices[i++]=Color.toFloatBits(255, 0, 0,0);//设置中心点的颜色

      

       //设置六边形六个顶点的颜色

       for(float angle=0;angle<=(2.0f*3.14f);angle+=angleIncrease){

          

           float x=(float) (bordLength*Math.cos(angle));

           float y=(float) (bordLength*Math.sin(angle));

           float z=0;

           vertices[i++]=x;

           vertices[i++]=y;

           vertices[i++]=z;

           vertices[i++]=Color.toFloatBits(random.nextInt(255), random.nextInt(255), random.nextInt(255),0);

          

       }

       indexs=new short[]{0,1,2,3,4,5,6,7};

      

       dodecagonMesh.setVertices(vertices);

       dodecagonMesh.setIndices(indexs);

    }

 

    @Override

    public void resume() {

       // TODO Auto-generatedmethod stub 

 

    }

 

    @Override

    public void render() {

       // TODO Auto-generatedmethod stub 

//画出六边形

       dodecagonMesh.render(GL11.GL_TRIANGLE_FAN, 0, 8);

    }

 

    @Override

    public void resize(int width, int height) {

       // TODO Auto-generatedmethod stub 

 

    }

 

    @Override

    public void pause() {

       // TODO Auto-generatedmethod stub 

 

    }

 

    @Override

    public void dispose() {

       // TODO Auto-generatedmethod stub 

 

    }

 

    /** 

     * @param args 

     * @Description: 

     */

    public static void main(String[] args) {

       // TODO Auto-generatedmethod stub 

       new JoglApplication(new Fan**(), "Hello world", 480, 480, false);

    }

 

}

运行代码,我们得到如下图(大家得到的可能和我不一样,因为颜色是随机的):

用相同的代码,使用GL11.GL_TRIANGLE_STRIP参数,得到的是如下图形:

那么使用GL11.GL_TRIANGLE_STRIP参数,将如何得到一个六边形呢?这个大家自己去完成吧!希望大家能在回复里面贴出来。

转载出处:http://space.189works.com/space-uid-10009991.html


你可能感兴趣的:(OpenGL中的一个重要的概念)