用JNI做OpenGL的开发,采用ES3进行开发,注意在app的build.gradle中,需要配置minSdkVersion的版本,因为低版本的android sdk是不支持ES3的,我这里配置的是
minSdkVersion 21
targetSdkVersion 28
按照OpenGL的画三角形的经典教程,配好JNI调用,可以画出经典的红色三角形,其中红色的配置,在glsl中配置,glsl需要放到android的assets中,类似于图片需要放到res一样。我的glsl的配置如下:
#version 300 es
precision mediump float;
out vec4 fragColor;
void main()
{
//RGB all 0 is black and all 1 is white
fragColor = vec4(0.0, 0.0, 1.0, 0.0);
}
其中vec4的前三个元素分别对应于R、G、B,这里表示的是蓝色。
画矩形的代码,我放到render里面,代码如下:
JNIEXPORT void JNICALL
Java_com_example_hello_RendererJNI_glesRender(JNIEnv *env, jobject instance) {
GLfloat vVertices[] = { //x , y ,z, 0 is middle. 1 is high,right, -1 is low left
-0.5f,-0.5f,0.0f,
0.5f,-0.5f,0.0f,
0.5f,0.5f,0.0f,
// -0.5f,-0.5f,0.0f,
//0.5f,0.5f,0.0f,
-0.5f,0.5f,0.0f,
};
// Set the viewport
glViewport ( 0, 0, g_width, g_height );
// Clear the color buffer
glClear ( GL_COLOR_BUFFER_BIT );
// Use the program object
glUseProgram ( g_programObject );
// Load the vertex data
glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, vVertices );
glEnableVertexAttribArray ( 0 );
glDrawArrays ( GL_LINE_LOOP, 0, 4);
}
其中
(1)glVertexAttribPointer的第二个参数,3是固定值,表示坐标系是x,y,z三个方向,不用动。
(2)glDrawArrays中的第一个参数,表示绘制的方式,可供选择如下:
#define GL_LINES 0x0001
#define GL_LINE_LOOP 0x0002
#define GL_LINE_STRIP 0x0003
#define GL_TRIANGLES 0x0004
#define GL_TRIANGLE_STRIP 0x0005
#define GL_TRIANGLE_FAN 0x0006
GL_LINES表示v1v2连线,v3v4连线,画出的是2根线;
GL_LINE_LOOP 表示v1v2连线,v2v3连线,v3v4连线,v4v1连线,画出的是一个正方形框;
GL_LINE_STRIP 表示v1v2连线,v2v3连线,v3v4连线,画出的是3根线,不闭合的正方形框;
GL_TRIANGLES表示v1v2v3三角形,v4v5v6三角形,如果只配置4个点,只能画出一个三角形;
GL_TRIANGLE_STRIP表示v1v2v3三角形,v2v3v4三角形,画出的是2个有交叉重叠的实心三角形;
GL_TRIANGLE_FAN 表示v1v2v3三角形,v1v3v4三角形,画出是一个实心的正方形,注意是没有v1v2v4和v2v3v4三角形的。
(3)glDrawArrays的最后一个参数,我设置为4表示4个点。