之前的都是單色的三角形禁筏,這次來點不一樣的味道滥朱,給每個頂點設(shè)置不同的顏色鞍历。
這里有三個步驟
1.定義頂點著色器
2.定義片段著色器
3.定義頂點和顏色數(shù)組乌询,設(shè)置數(shù)組指針
頂點著色器
#version 300 es
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
out vec3 ourColor;
void main() {
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
ourColor=aColor;
}
顏色不一樣 所以顏色要外面?zhèn)鬟M來呀打,要多加一個顏色變量
顏色著色器
#version 300 es
precision mediump float;
out vec4 FragColor;
in vec3 ourColor;
void main()
{
FragColor = vec4(ourColor, 1.0f);
}
定義頂點和顏色數(shù)組矢赁,設(shè)置數(shù)組指針
private var vertices = floatArrayOf(
// 位置 // 顏色
0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // 右下
-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // 左下
0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f // 頂部
)
//設(shè)置頂點數(shù)組指針
GLES30.glVertexAttribPointer(
//shader中 layout(location = 0)的值
0,
//頂點屬性的大小。頂點屬性是一個vec3贬丛,它由3個值組成撩银,所以大小是3
3,
//數(shù)據(jù)的類型
GLES30.GL_FLOAT,
//GL_TRUE,數(shù)據(jù)被標準化豺憔,所有數(shù)據(jù)都會被映射到0(對于有符號型signed數(shù)據(jù)是-1)到1之間额获。我們把它設(shè)置為GL_FALSE
false,
//步長,它告訴我們在連續(xù)的頂點屬性組之間的間隔 也就是繪制一個頂點要多少數(shù)據(jù) 字節(jié)單位
6 * DataUtil.sizeof(GLES30.GL_FLOAT),
//數(shù)據(jù)偏移量 這里頂點從0開始
0
)
GLES30.glEnableVertexAttribArray(0)
//設(shè)置頂點數(shù)組指針
GLES30.glVertexAttribPointer(
//shader中 layout(location = 0)的值
1,
//頂點屬性的大小恭应。頂點屬性是一個vec3抄邀,它由3個值組成,所以大小是3
3,
//數(shù)據(jù)的類型
GLES30.GL_FLOAT,
//GL_TRUE昼榛,數(shù)據(jù)被標準化境肾,所有數(shù)據(jù)都會被映射到0(對于有符號型signed數(shù)據(jù)是-1)到1之間。我們把它設(shè)置為GL_FALSE
false,
//步長胆屿,它告訴我們在連續(xù)的頂點屬性組之間的間隔 也就是繪制一個頂點要多少數(shù)據(jù) 字節(jié)單位
6 * DataUtil.sizeof(GLES30.GL_FLOAT),
//數(shù)據(jù)偏移量 前面有頂點 所以這里要偏移定點數(shù)據(jù) 三個定點*每個頂點的大小
3 * DataUtil.sizeof(GLES30.GL_FLOAT)
)
//激活第二個(location=1)不然顏色不會顯示
GLES30.glEnableVertexAttribArray(1)
上面就是主要步驟
三星形有了奥喻,改下四邊形也是可以的
代碼
package com.weihu.video.opengl.draw
import android.opengl.GLES30
import android.opengl.GLSurfaceView
import com.weihu.video.MyApp
import com.weihu.video.opengl.DataUtil
import com.weihu.video.opengl.Shader
import javax.microedition.khronos.egl.EGLConfig
import javax.microedition.khronos.opengles.GL10
/**
* created by hupihuai on 2019/2/20
*/
class ColorRectangleRender : GLSurfaceView.Renderer {
private val vao = IntArray(1)
private val vbo = IntArray(1)
private val ebo = IntArray(1)
private var esShader = Shader()
private var vertices = floatArrayOf(
0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // 右上角
0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // 右下角
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, // 左下角
-0.5f, 0.5f, 0.0f, 0.5f, 0.5f, 0.5f // 左上角
)
private var indices = shortArrayOf(
0, 1, 3, // 第一個三角形
1, 2, 3 // 第二個三角形
)
override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
GLES30.glClearColor(0.2f, 0.3f, 0.3f, 1.0f)
//vao
GLES30.glGenVertexArrays(1, vao, 0)
GLES30.glBindVertexArray(vao[0])
//vbo
GLES30.glGenBuffers(1, vbo, 0)
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, vbo[0])
val vertexBuffer = DataUtil.createByteBuffer(vertices)
//復(fù)制數(shù)據(jù)到opengl
GLES30.glBufferData(
//頂點緩沖對象當前綁定到GL_ARRAY_BUFFER目標上
GLES30.GL_ARRAY_BUFFER,
//指定傳輸數(shù)據(jù)的大小(以字節(jié)為單位)
vertices.size * DataUtil.sizeof(GLES30.GL_FLOAT),
//發(fā)送的實際數(shù)據(jù)
vertexBuffer,
//GL_STATIC_DRAW :數(shù)據(jù)不會或幾乎不會改變。
//GL_DYNAMIC_DRAW:數(shù)據(jù)會被改變很多非迹。
//GL_STREAM_DRAW :數(shù)據(jù)每次繪制時都會改變
GLES30.GL_STATIC_DRAW
)
//設(shè)置頂點數(shù)組指針
GLES30.glVertexAttribPointer(
//shader中 layout(location = 0)的值
0,
//頂點屬性的大小衫嵌。頂點屬性是一個vec3,它由3個值組成彻秆,所以大小是3
3,
//數(shù)據(jù)的類型
GLES30.GL_FLOAT,
//GL_TRUE楔绞,數(shù)據(jù)被標準化结闸,所有數(shù)據(jù)都會被映射到0(對于有符號型signed數(shù)據(jù)是-1)到1之間。我們把它設(shè)置為GL_FALSE
false,
//步長酒朵,它告訴我們在連續(xù)的頂點屬性組之間的間隔 字節(jié)單位
6 * DataUtil.sizeof(GLES30.GL_FLOAT),
//數(shù)據(jù)偏移量 這里只有頂點 位置數(shù)據(jù)在數(shù)組的開頭桦锄,所以這里是0
0
)
GLES30.glEnableVertexAttribArray(0)
//設(shè)置顏色數(shù)組指針
GLES30.glVertexAttribPointer(
//shader中 layout(location = 0)的值
1,
//頂點屬性的大小。頂點屬性是一個vec3蔫耽,它由3個值組成结耀,所以大小是3
3,
//數(shù)據(jù)的類型
GLES30.GL_FLOAT,
//GL_TRUE,數(shù)據(jù)被標準化匙铡,所有數(shù)據(jù)都會被映射到0(對于有符號型signed數(shù)據(jù)是-1)到1之間图甜。我們把它設(shè)置為GL_FALSE
false,
//步長,它告訴我們在連續(xù)的頂點屬性組之間的間隔 字節(jié)單位
6 * DataUtil.sizeof(GLES30.GL_FLOAT),
//數(shù)據(jù)偏移量 編譯前面
3 * DataUtil.sizeof(GLES30.GL_FLOAT)
)
GLES30.glEnableVertexAttribArray(1)
//vbo end
//ebo start
GLES30.glGenBuffers(1, ebo, 0)
GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, ebo[0])
val indexBuffer = DataUtil.createByteBuffer(indices)
//復(fù)制數(shù)據(jù)到opengl
GLES30.glBufferData(
//頂點緩沖對象當前綁定到GL_ELEMENT_ARRAY_BUFFER目標上
GLES30.GL_ELEMENT_ARRAY_BUFFER,
//指定傳輸數(shù)據(jù)的大小(以字節(jié)為單位)
indices.size * DataUtil.sizeof(GLES30.GL_SHORT),
//發(fā)送的實際數(shù)據(jù)
indexBuffer,
//GL_STATIC_DRAW :數(shù)據(jù)不會或幾乎不會改變鳖眼。
//GL_DYNAMIC_DRAW:數(shù)據(jù)會被改變很多黑毅。
//GL_STREAM_DRAW :數(shù)據(jù)每次繪制時都會改變
GLES30.GL_STATIC_DRAW
)
//ebo end
//vao end
//shader
esShader.loadProgramFromAsset(MyApp.context, "color_triangle_vert.glsl", "color_triangle_frag.glsl")
}
override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {
GLES30.glViewport(0, 0, width, height)
}
override fun onDrawFrame(gl: GL10?) {
GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT)
esShader.use()
GLES30.glBindVertexArray(vao[0])
GLES30.glDrawElements(
//圖元的類型
GLES30.GL_TRIANGLES,
//定點個數(shù)
6,
//定點數(shù)據(jù)類型
GLES30.GL_UNSIGNED_SHORT,
//頂點偏移量
0
)
}
}
好了 不同頂點不同顏色就完成了