opengles 的給圖形添加顏色很簡單,在上篇文章的基礎上改動幾處便可。java
頂點着色器須要聲明一個接收顏色數據的輸入變量 aColor ,以及一個輸出變量 vColor ,並在 main() 方法中,將 aColor 賦值給 vColor,用之後續將顏色輸出到片斷着色器。spa
private static final String vertextShaderSource =
"#version 300 es\n"
+ "layout (location = 0) in vec4 vPosition;\n"
//接收顏色數據的輸入變量
+ "layout (location = 1) in vec4 aColor;\n"
//輸出變量
+ "out vec4 vColor;\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = vPosition;\n"
//給輸出變量賦值
+ " vColor = aColor;\n"
+ "}\n";
複製代碼
片斷着色器須要聲明一個接收顏色數據的輸入變量 vColor,並賦值給 fragColor。code
private static final String fragmentShaderSource =
"#version 300 es \n"
+ "precision mediump float; \n"
//接收顏色數據的輸入變量
+ "in vec4 vColor; \n"
+ "out vec4 fragColor; \n"
+ "void main() \n"
+ "{ \n"
//將顏色數據輸出
+ " fragColor = vColor; \n"
+ "} \n";
複製代碼
顏色數據的準備操做和頂點數據的操做同樣。內存
//頂點顏色
private static final float[] verticeColors = {
0.0f, 1.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f
};
//將頂點顏色數據拷貝映射到 native 內存中,以便opengl可以訪問
verticeColorsBuffer = ByteBuffer
.allocateDirect(verticeColors.length * BYTES_PER_FLOAT)
.order(ByteOrder.nativeOrder())
.asFloatBuffer();
verticeColorsBuffer
.put(verticeColors)
.position(0);
複製代碼
繪製的時候將顏色數據綁定到相應的屬性位置,具體操做和頂點數據同樣。ci
//獲取 vColor 屬性位置
int aColor = GLES30.glGetAttribLocation(program, "aColor");
//加載頂點顏色數據到 vColor 屬性位置
GLES30.glEnableVertexAttribArray(aColor);
GLES30.glVertexAttribPointer(aColor, 4, GLES30.GL_FLOAT, false, 0, verticeColorsBuffer);
複製代碼
本文梳理了顏色添加的基本流程,給繪製的三角形添加了簡單的顏色。string