12/08/2011

Android OpenGL ES : 上色

本篇介紹如何給Mesh(網格)添加顏色。 OpenGL ES使用顏色是我們熟知的RGBA模式(紅,綠,藍,透明度)。顏色的定義通常使用Hex格式0xFF00FF 或十進制格式(255,0,255), 在OpenGL 中卻是使用0…1之間的浮點數表示。 0為0,1相當於255(0xFF)。最簡單的上色方法叫做頂點著色(Vertxt coloring),可以使用單色,也可以定義顏色漸變或者使用材質(類同於二維圖形中各種Brush類型)。


Flat coloring(單色)
是通知OpenGL使用單一的顏色來渲染,OpenGL將一直使用指定的顏色來渲染直到你指定其它的顏色。
指定顏色的方法為
public abstract void glColor4f(float red, float green, float blue, float alpha)。
缺省的red,green,blue為1,代表白色。這也是為什麼前面顯示的正方形都是白色的緣故。
我們創建一個新的類為FlatColoredSquare,作為Sequare的子類,將它的draw重定義如下:

package org.itrc.MyOpenGLESTutorial;
import javax.microedition.khronos.opengles.GL10;
public class FlatColoredSquare extends Square {
   
    public FlatColoredSquare()
    {
        super();
    }
   
    public void draw(GL10 gl){
        gl.glColor4f(0.3f, 0.2f, 1.0f, 1.0f);
        super.draw(gl);
    }
}


Smooth coloring (平滑顏色過渡)
當給每個頂點定義一個顏色時,OpenGL自動為不同頂點顏色之間生成中間過渡顏色(漸變色)。在項目中添加一個SmoothColoredSquare 類,作為Square子類,為每個頂點定義一個顏色值,就是說頂點定義 紅、綠、藍、粉紅,其他的區域會用漸變色填補。其中顏色定義的順序和頂點的順序是一致的。為了提高性能,和頂點坐標一樣,我們也把顏色數組放到Buffer中

// The colors mapped to the vertices.
float[] colors = {
 1f, 0f, 0f, 1f, // vertex 0 red
 0f, 1f, 0f, 1f, // vertex 1 green
 0f, 0f, 1f, 1f, // vertex 2 blue
 1f, 0f, 1f, 1f, // vertex 3 magenta
};

     ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length * 4); 
     cbb.order(ByteOrder.nativeOrder()); 
     colorBuffer = cbb.asFloatBuffer(); 
     colorBuffer.put(colors); 
     colorBuffer.position(0);    
}

複寫draw,加入顏色
// 在渲染期間啟用顏色緩衝區 
gl.glEnableClientState(GL10.GL_COLOR_ARRAY); 
// 指定顏色緩衝區。 
gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);

執行結果如下:

image

沒有留言:

張貼留言

請留言~一起討論吧~