前面的例子顯示的正方形都是白色,看其來不是很吸引人,本篇介紹如何給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重定義如下:
public void draw(GL10 gl) { gl.glColor4f(0.5f, 0.5f, 1.0f, 1.0f); super.draw(gl);}
將OpenGLRenderer的square的類型改為FlatColoredSquare。
private FlatColoredSquare square=new FlatColoredSquare();
編譯運行,正方形顏色變成了藍色:
Smooth
coloring (平滑顏色過渡)
當給每個頂點定義一個顏色時,OpenGL自動為不同頂點顏色之間產生中間過渡顏色(漸層色)。
在項目中添加一個SmoothColoredSquare 類,作為Square子類,為每個頂點定義一個顏色值。
// 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};
顏色定義的順序和頂點的順序是一致的。為了提高效能,和頂點座標一樣,我們也把顏色數組放到Buffer中:
// float has 4 bytes, colors (RGBA) * 4 bytesByteBuffer cbb = ByteBuffer.allocateDirect(colors.length * 4);cbb.order(ByteOrder.nativeOrder());colorBuffer = cbb.asFloatBuffer();colorBuffer.put(colors);colorBuffer.position(0);
最後修改draw方法,如下:
public void draw(GL10 gl) {gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);// Enable the color array buffer to be//used during rendering.gl.glEnableClientState(GL10.GL_COLOR_ARRAY);// Point out the where the color buffer is.gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);super.draw(gl);// Disable the color buffer.gl.glDisableClientState(GL10.GL_COLOR_ARRAY);}
將OpenGLRenderer中的Square類型改成SmoothColoredSquare,編譯運行結果如下:
本地範例程式碼下載