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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章