OpenGL 系列文章目录


文章目录



前言

本系列文章用于记录OpenGL的学习过程



一、着色器

顶点着色器

#version 300 es
precision mediump float;
layout(location = 0) in vec4 a_position;
layout(location = 1) in vec2 a_textureCoordinate;
out vec2 v_textureCoordinate;
void main() {
v_textureCoordinate = a_textureCoordinate;
gl_Position = a_position;
}

​vec4 a_position​​: 用于接收kotlin端传入的顶点位置
​vec2 a_textureCoordinate​​:接收kotlin端传入的纹理的顶点位置
​v_textureCoordinate​​:将传入的纹理顶点位置输出给片段着色器

直接指定​​a_position​​的​​location​​为0,这样可以操作​​location0​​来操作​​a_position​​,不需要像2.0那样先获取​​a_position​​的位置。

片段着色器

#version 300 es    
precision mediump float;
precision mediump sampler2D;
layout(location = 0) out vec4 fragColor;
layout(location = 0) uniform sampler2D u_texture;
in vec2 v_textureCoordinate;
void main() {
fragColor = texture(u_texture, v_textureCoordinate);
}

​in vec2 v_textureCoordinate​​ :从顶点着色器中接收纹理的顶点位置
​out vec4 fragColor​​:定义输出颜色变量
​u_texture​​:传入的纹理数据

将内置的​​gl_FragColor​​改写为输出变量。

二、设置顶点数据

由于GL画三角形是最高效的,因此使用两个三角形拼成矩形

private val vertexData = floatArrayOf(-1f,-1f,
-1f,1f,
1f,1f,

-1f,-1f,
1f,1f,
1f,-1f)

激活位置0顶点的顶点数据

GLES30.glEnableVertexAttribArray(0)

第一个参数为​​postion​​,第二个参数指定部件个数为2,即三角形的个数

GLES30.glVertexAttribPointer(0, 2, GLES30.GL_FLOAT, false,0, vertexDataBuffer)

三、代码

本文使用示例代码中的​​ShaderFragment​