opengles 的給圖形添加顏色很簡單,在上篇文章的基礎上改動幾處便可。java
頂點着色器須要聲明一個接收顏色數據的輸入變量 aColor ,以及一個輸出變量 vColor ,並在 main() 方法中,將 aColor 賦值給 vColor,用之後續將顏色輸出到片斷着色器。markdown
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。spa
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"; 複製代碼
顏色數據的準備操做和頂點數據的操做同樣。code
//頂點顏色 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); 複製代碼
繪製的時候將顏色數據綁定到相應的屬性位置,具體操做和頂點數據同樣。orm
//獲取 vColor 屬性位置 int aColor = GLES30.glGetAttribLocation(program, "aColor"); //加載頂點顏色數據到 vColor 屬性位置 GLES30.glEnableVertexAttribArray(aColor); GLES30.glVertexAttribPointer(aColor, 4, GLES30.GL_FLOAT, false, 0, verticeColorsBuffer); 複製代碼
本文梳理了顏色添加的基本流程,給繪製的三角形添加了簡單的顏色。內存