//创建编译加载
GLuint LoadShader(int type, char *shaderCode);
//链接统一程序
GLuint linkProgram(GLuint vertexShader, GLuint fragmentShader);
//用于求数组长度
template
GLsizei getArrayLen(T &array) {
return (sizeof(array) / sizeof(array[0]));
}
//float 四个字节
const GLint BYTES_PER_FLOAT = 4;
//xyz坐标
const GLint COORDS_PER_VERTEX = 3;
//RGBA通道
const GLint COORDS_PER_COLOR = 4;
//点的偏移量
const GLint vertexStride = COORDS_PER_VERTEX * BYTES_PER_FLOAT;
//颜色偏移量
const GLint colorStride = COORDS_PER_COLOR * BYTES_PER_FLOAT;
//声明顶点着色器
GLuint vertexShader;
//声明片元着色器
GLuint fragmentShader;
//声明着色器管理程序
GLuint mProgram;
//声明缓冲区对象
GLuint VBO[2];
//分别保存一个VBO
GLuint positionBufferHandle;
GLuint colorBufferHandle;
//声明句柄
GLint mMatrixHandle;
GLint mPositionHandle;
GLint mColorHandle;
//定义点坐标
float vertexPoints[] = {
0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
};
//定义颜色数据
float colors[] = {
1.0f, 0.0f, 1.0f, 0.0f,
1.0f, 1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 1.0f, 0.0f,
};
//点的数量
const int vertexCount = getArrayLen(vertexPoints) / COORDS_PER_VERTEX;
//顶点着色器代码
char vertexShaderCode[] = “uniform mat4 vMatrix;”
"attribute vec4 vPosition;"
"attribute vec4 vColor;"
"varying vec4 aColor;"
"void main()"
"{"
" gl_Position = vMatrix * vPosition;"
" aColor = vColor;"
" gl_PointSize = 10.0;"
"}";
//片段着色器代码
char fragmentShaderCode[] = “precision mediump float;”
"varying vec4 aColor;"
"void main()"
"{"
" gl_FragColor = aColor;"
"}";
JNIEXPORT void JNICALL init(JNIEnv *env, jobject obj) {
}
//书写本地方法的具体逻辑
/**初始化
-
@param env
-
@param obj
*/
JNIEXPORT void JNICALL surfaceCreated(JNIEnv *env, jobject obj) {
//设置背景颜色为黑色
glClearColor(0, 0, 0, 0);
//创建顶点着色器
vertexShader = LoadShader(GL_VERTEX_SHADER, vertexShaderCode);
//创建片元着色器
fragmentShader = LoadShader(GL_FRAGMENT_SHADER, fragmentShaderCode);
//将顶点着色器和片元着色器交给统一程序管理
mProgram = linkProgram(vertexShader, fragmentShader);
//准备数据
glGenBuffers(getArrayLen(VBO), VBO);
positionBufferHandle = VBO[0];
colorBufferHandle = VBO[1];
glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
glBufferData(GL_ARRAY_BUFFER, getArrayLen(vertexPoints) * BYTES_PER_FLOAT, vertexPoints, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
glBufferData(GL_ARRAY_BUFFER, getArrayLen(colors) * BYTES_PER_FLOAT, colors, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
/**图形尺寸
-
@param env
-
@param obj
-
@param width
-
@param height
*/
glm::mat4 mProjectionMatrix;
glm::mat4 mViewMatrix;
glm::mat4 mMVPMatrix;
float mMVPMatrixArray[16];
JNIEXPORT void JNICALL surfaceChanged(JNIEnv *env, jobject obj, jint width, jint height) {
//设置视口
glViewport(0, 0, width, height);
//宽高比
float ratio = (float) width / height;
//设置正交矩阵
mProjectionMatrix = glm::ortho(-ratio, ratio, -1.0f, 1.0f, 3.0f,
7.0f); //ratio 一般表示视口的宽高比,width/height
//相机位置
mViewMatrix = glm::lookAt(glm::vec3(0, 3, -3), // 相机位置
glm::vec3(0, 0, 0), // 观察点坐标
glm::vec3(0, 0, 1));
//矩阵合并
mMVPMatrix = mProjectionMatrix * mViewMatrix;
//矩阵转换成数组
int m = 0;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++) {
mMVPMatrixArray[m] = mMVPMatrix[i][j];
m++;
}
}
/**渲染绘制
-
@param env
-
@param obj
*/
JNIEXPORT void JNICALL drawFrame(JNIEnv *env, jobject obj) {
//清除颜色缓冲区
glClear(GL_COLOR_BUFFER_BIT);
//使用统一的管理程序
glUseProgram(mProgram);
//图形尺寸
mMatrixHandle = glGetUniformLocation(mProgram,"vMatrix");
glUniformMatrix4fv(mMatrixHandle,1, false, mMVPMatrixArray);
//句柄
mPositionHandle = glGetAttribLocation(mProgram,"vPosition");
mColorHandle = glGetAttribLocation(mProgram,"vColor");
//设置顶点属性指针
glBindBuffer(GL_ARRAY_BUFFER,positionBufferHandle);
glEnableVertexAttribArray(mPositionHandle);
glVertexAttribPointer(mPositionHandle,COORDS_PER_VERTEX,GL_FLOAT,GL_FALSE,vertexStride,0);
//设置颜色属性指针
glBindBuffer(GL_ARRAY_BUFFER,colorBufferHandle);
glEnableVertexAttribArray(mColorHandle);
glVertexAttribPointer(mColorHandle,COORDS_PER_COLOR,GL_FLOAT,GL_FALSE,colorStride,0);
glBindBuffer(GL_ARRAY_BUFFER,0);
//绘制图形
glLineWidth(10.0f);
glDrawArrays(GL_LINE_LOOP, 0, vertexCount);
}
/**加载着色器
*/
JNIEXPORT GLuint LoadShader(int type, char *shaderCode) {
//创建一个着色器
GLuint shader = glCreateShader(type);
if (shader != 0) {
//加载到着色器
glShaderSource(shader, 1, &shaderCode, NULL);
//编译着色器
glCompileShader(shader);
//检测状态
GLint compileStatus;
glGetShaderiv(shader, GL_COMPILE_STATUS, &compileStatus);
if (compileStatus == 0) {
//声明log长度变量
GLint infoLen = 0;
//获取长度并赋值
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
if (infoLen > 1) {
//创建成功小于等于1
char *infoLog = static_cast<char *>(malloc(sizeof(char) * infoLen));
glGetShaderInfoLog(shader, infoLen, NULL, infoLog);
printf("SHADER ERROR!");
free(infoLog);
}
//创建失败
glDeleteShader(shader);
return 0;
}
return shader;
} else {
//创建失败
return 0;
}
}
/**链接着色器
*/
JNIEXPORT GLuint linkProgram(GLuint vertexShader, GLuint fragmentShader) {
GLuint program = glCreateProgram();
if (program != 0) {
//将顶点着色器加入到程序
glAttachShader(program, vertexShader);
//将片元着色器加入到程序中
glAttachShader(program, fragmentShader);
//链接着色器程序
glLinkProgram(program);
//检测状态
GLint linkStatus;
glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
if (linkStatus == 0) {
GLint infoLen = 0;
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLen);
if (infoLen > 1) {
char *infoLog = static_cast<char *>(malloc(sizeof(char) * infoLen));
glGetProgramInfoLog(program, infoLen, NULL, infoLog);
cout << "PROGRAM ERROR!" << endl;
free(infoLog);
}
glDeleteProgram(program);
return 0;
}
return program;
} else {
//创建失败
return 0;
}
}
/** 动态注册
-
@param env
-
@return
*/
//本地方法声明和具体逻辑连接
JNINativeMethod methods[] = {
{"init", "()V", (void *) init},
{"surfaceCreated", "()V", (void *) surfaceCreated},
{"surfaceChanged", "(II)V", (void *) surfaceChanged},
{"drawFrame", "()V", (void *) drawFrame}
};
/** 动态注册
-
@param env
-
@return
*/
jint registerNativeMethod(JNIEnv *env) {
//到本地方法存在的类找出其方法声明
jclass cl = env->FindClass("com/example/openglndk/WaveRenderer");
if ((env->RegisterNatives(cl, methods, sizeof(methods) / sizeof(methods[0]))) < 0) {
return -1;
}
return 0;
}
/** 加载默认回调
-
@param vm
-
@param reserved
-
@return
*/
jint JNI_OnLoad(JavaVM *vm, void *reserved) {
JNIEnv *env = NULL;
if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {
return -1;
}
//注册方法
if (registerNativeMethod(env) != JNI_OK) {
return -1;
}
return JNI_VERSION_1_6;
}
[]( )使用VBO和VAO绘制点、直线、彩色三角形
------------------------------------------------------------------------------------
* 在`VAO`处理所有`VBO`的数据。
//创建VAO对象
glGenVertexArrays(1,&VAO);
glBindVertexArray(VAO);
//创建VBO对象
glGenBuffers(getArrayLen(VBO), VBO);
positionBufferHandle = VBO[0];
colorBufferHandle = VBO[1];
//传入数据
glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
glBufferData(GL_ARRAY_BUFFER, getArrayLen(vertexPoints) * BYTES_PER_FLOAT, vertexPoints, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
glBufferData(GL_ARRAY_BUFFER, getArrayLen(colors) * BYTES_PER_FLOAT, colors, GL_STATIC_DRAW);
//解除绑定
glBindBuffer(GL_ARRAY_BUFFER, 0);
//句柄
mPositionHandle = glGetAttribLocation(mProgram,"vPosition");
mColorHandle = glGetAttribLocation(mProgram,"vColor");
//设置顶点属性指针
glBindBuffer(GL_ARRAY_BUFFER,positionBufferHandle);
glEnableVertexAttribArray(mPositionHandle);
glVertexAttribPointer(mPositionHandle,COORDS_PER_VERTEX,GL_FLOAT,GL_FALSE,vertexStride,0);
//设置颜色属性指针
glBindBuffer(GL_ARRAY_BUFFER,colorBufferHandle);
glEnableVertexAttribArray(mColorHandle);
glVertexAttribPointer(mColorHandle,COORDS_PER_COLOR,GL_FLOAT,GL_FALSE,colorStride,0);
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindVertexArray(0);
* 绘制图形。
glBindVertexArray(VAO);
//绘制图形
glLineWidth(10.0f);
glDrawArrays(GL_LINE_LOOP, 0, vertexCount);
glBindVertexArray(0);
* `.cpp文件`
//
// Created by lvjunkai on 2022/2/21.
//
#include <EGL/egl.h>
#include <GLES3/gl3.h>
#include <jni.h>
#include <malloc.h>
#include
#include <glm/gtc/matrix_transform.hpp>
#include <glm/glm.hpp>
using namespace std;
//声明自定义函数
//创建编译加载
GLuint LoadShader(int type, char *shaderCode);
//链接统一程序
GLuint linkProgram(GLuint vertexShader, GLuint fragmentShader);
//用于求数组长度
template
GLsizei getArrayLen(T &array) {
return (sizeof(array) / sizeof(array[0]));
}
//float 四个字节
const GLint BYTES_PER_FLOAT = 4;
//xyz坐标
const GLint COORDS_PER_VERTEX = 3;
//RGBA通道
const GLint COORDS_PER_COLOR = 4;
//点的偏移量
const GLint vertexStride = COORDS_PER_VERTEX * BYTES_PER_FLOAT;
//颜色偏移量
const GLint colorStride = COORDS_PER_COLOR * BYTES_PER_FLOAT;
//声明顶点着色器
GLuint vertexShader;
//声明片元着色器
GLuint fragmentShader;
//声明着色器管理程序
GLuint mProgram;
//声明缓冲区对象
GLuint VBO[2], VAO;
//分别保存一个VBO
GLuint positionBufferHandle;
GLuint colorBufferHandle;
//声明句柄
GLint mMatrixHandle;
GLint mPositionHandle;
GLint mColorHandle;
//定义点坐标
float vertexPoints[] = {
0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
};
//定义颜色数据
float colors[] = {
1.0f, 0.0f, 1.0f, 0.0f,
1.0f, 1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 1.0f, 0.0f,
};
//点的数量
const int vertexCount = getArrayLen(vertexPoints) / COORDS_PER_VERTEX;
//顶点着色器代码
char vertexShaderCode[] = “uniform mat4 vMatrix;”
"attribute vec4 vPosition;"
"attribute vec4 vColor;"
"varying vec4 aColor;"
"void main()"
"{"
" gl_Position = vMatrix * vPosition;"
" aColor = vColor;"
" gl_PointSize = 10.0;"
"}";
//片段着色器代码
char fragmentShaderCode[] = “precision mediump float;”
"varying vec4 aColor;"
"void main()"
"{"
" gl_FragColor = aColor;"
"}";
JNIEXPORT void JNICALL init(JNIEnv *env, jobject obj) {
}
//书写本地方法的具体逻辑
/**初始化
-
@param env
-
@param obj
*/
JNIEXPORT void JNICALL surfaceCreated(JNIEnv *env, jobject obj) {
//设置背景颜色为黑色
glClearColor(0, 0, 0, 0);
//创建顶点着色器
vertexShader = LoadShader(GL_VERTEX_SHADER, vertexShaderCode);
//创建片元着色器
fragmentShader = LoadShader(GL_FRAGMENT_SHADER, fragmentShaderCode);
//将顶点着色器和片元着色器交给统一程序管理
mProgram = linkProgram(vertexShader, fragmentShader);
//准备数据
//创建VAO对象
glGenVertexArrays(1,&VAO);
glBindVertexArray(VAO);
//创建VBO对象
glGenBuffers(getArrayLen(VBO), VBO);
positionBufferHandle = VBO[0];
colorBufferHandle = VBO[1];
//传入数据
glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
glBufferData(GL_ARRAY_BUFFER, getArrayLen(vertexPoints) * BYTES_PER_FLOAT, vertexPoints, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
glBufferData(GL_ARRAY_BUFFER, getArrayLen(colors) * BYTES_PER_FLOAT, colors, GL_STATIC_DRAW);
//解除绑定
glBindBuffer(GL_ARRAY_BUFFER, 0);
//句柄
mPositionHandle = glGetAttribLocation(mProgram,"vPosition");
mColorHandle = glGetAttribLocation(mProgram,"vColor");
//设置顶点属性指针
glBindBuffer(GL_ARRAY_BUFFER,positionBufferHandle);
glEnableVertexAttribArray(mPositionHandle);
glVertexAttribPointer(mPositionHandle,COORDS_PER_VERTEX,GL_FLOAT,GL_FALSE,vertexStride,0);
//设置颜色属性指针
glBindBuffer(GL_ARRAY_BUFFER,colorBufferHandle);
glEnableVertexAttribArray(mColorHandle);
glVertexAttribPointer(mColorHandle,COORDS_PER_COLOR,GL_FLOAT,GL_FALSE,colorStride,0);
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindVertexArray(0);
}
/**图形尺寸
-
@param env
-
@param obj
-
@param width
-
@param height
*/
glm::mat4 mProjectionMatrix;
glm::mat4 mViewMatrix;
glm::mat4 mMVPMatrix;
float mMVPMatrixArray[16];
JNIEXPORT void JNICALL surfaceChanged(JNIEnv *env, jobject obj, jint width, jint height) {
//设置视口
glViewport(0, 0, width, height);
//宽高比
float ratio = (float) width / height;
//设置正交矩阵
mProjectionMatrix = glm::ortho(-ratio, ratio, -1.0f, 1.0f, 3.0f,
7.0f); //ratio 一般表示视口的宽高比,width/height
//相机位置
mViewMatrix = glm::lookAt(glm::vec3(0, 3, -3), // 相机位置
glm::vec3(0, 0, 0), // 观察点坐标
glm::vec3(0, 0, 1));
//矩阵合并
mMVPMatrix = mProjectionMatrix * mViewMatrix;
//矩阵转换成数组
int m = 0;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++) {
mMVPMatrixArray[m] = mMVPMatrix[i][j];
m++;
}
}
/**渲染绘制
-
@param env
-
@param obj
*/
JNIEXPORT void JNICALL drawFrame(JNIEnv *env, jobject obj) {
//清除颜色缓冲区
glClear(GL_COLOR_BUFFER_BIT);
//使用统一的管理程序
glUseProgram(mProgram);
//图形尺寸
mMatrixHandle = glGetUniformLocation(mProgram,"vMatrix");
glUniformMatrix4fv(mMatrixHandle,1, false, mMVPMatrixArray);
glBindVertexArray(VAO);
//绘制图形
glLineWidth(10.0f);
glDrawArrays(GL_LINE_LOOP, 0, vertexCount);
glBindVertexArray(0);
}
/**加载着色器
*/
JNIEXPORT GLuint LoadShader(int type, char *shaderCode) {
//创建一个着色器
GLuint shader = glCreateShader(type);
if (shader != 0) {
//加载到着色器
glShaderSource(shader, 1, &shaderCode, NULL);
//编译着色器
glCompileShader(shader);
//检测状态
GLint compileStatus;
glGetShaderiv(shader, GL_COMPILE_STATUS, &compileStatus);
if (compileStatus == 0) {
//声明log长度变量
GLint infoLen = 0;
//获取长度并赋值
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
if (infoLen > 1) {
//创建成功小于等于1
char *infoLog = static_cast<char *>(malloc(sizeof(char) * infoLen));
glGetShaderInfoLog(shader, infoLen, NULL, infoLog);
printf("SHADER ERROR!");
free(infoLog);
}
//创建失败
glDeleteShader(shader);
return 0;
}
return shader;
} else {
//创建失败
return 0;
}
}
/**链接着色器
*/
JNIEXPORT GLuint linkProgram(GLuint vertexShader, GLuint fragmentShader) {
GLuint program = glCreateProgram();
if (program != 0) {
//将顶点着色器加入到程序
glAttachShader(program, vertexShader);
//将片元着色器加入到程序中
glAttachShader(program, fragmentShader);
//链接着色器程序
glLinkProgram(program);
//检测状态
GLint linkStatus;
glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
if (linkStatus == 0) {
GLint infoLen = 0;
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLen);
if (infoLen > 1) {
char *infoLog = static_cast<char *>(malloc(sizeof(char) * infoLen));
glGetProgramInfoLog(program, infoLen, NULL, infoLog);
cout << "PROGRAM ERROR!" << endl;
free(infoLog);
}
glDeleteProgram(program);
return 0;
}
return program;
} else {
//创建失败
return 0;
}
}
/** 动态注册
-
@param env
-
@return
*/
//本地方法声明和具体逻辑连接
JNINativeMethod methods[] = {
{"init", "()V", (void *) init},
{"surfaceCreated", "()V", (void *) surfaceCreated},
{"surfaceChanged", "(II)V", (void *) surfaceChanged},
{"drawFrame", "()V", (void *) drawFrame}
};
/** 动态注册
-
@param env
-
@return
*/
jint registerNativeMethod(JNIEnv *env) {
//到本地方法存在的类找出其方法声明
jclass cl = env->FindClass("com/example/openglndk/WaveRenderer");
if ((env->RegisterNatives(cl, methods, sizeof(methods) / sizeof(methods[0]))) < 0) {
return -1;
}
return 0;
}
/** 加载默认回调
-
@param vm
-
@param reserved
-
@return
*/
jint JNI_OnLoad(JavaVM *vm, void *reserved) {
JNIEnv *env = NULL;
if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {
return -1;
}
//注册方法
if (registerNativeMethod(env) != JNI_OK) {
return -1;
}
return JNI_VERSION_1_6;
}
[]( )使用VBO、VAO和EBO绘制彩色正方形
-----------------------------------------------------------------------------------
* 加入索引数据。
//定义索引数据
short index[] = {
0, 1, 2,
0, 2, 3,
};
* 在`VAO`中操作`VBO`和`EBO`。
//准备数据
//创建VAO对象
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
//创建VBO,EBO对象
glGenBuffers(getArrayLen(VBO), VBO);
positionBufferHandle = VBO[0];
colorBufferHandle = VBO[1];
glGenBuffers(1, &EBO);
//传入数据
glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
glBufferData(GL_ARRAY_BUFFER, getArrayLen(vertexPoints) * BYTES_PER_FLOAT, vertexPoints,
GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
glBufferData(GL_ARRAY_BUFFER, getArrayLen(colors) * BYTES_PER_FLOAT, colors, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, getArrayLen(index) * BYTES_PER_SHORT, index,
GL_STATIC_DRAW);
//解除绑定
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
//句柄
mPositionHandle = glGetAttribLocation(mProgram, "vPosition");
mColorHandle = glGetAttribLocation(mProgram, "vColor");
//设置顶点属性指针
glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
glEnableVertexAttribArray(mPositionHandle);
glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GL_FLOAT, GL_FALSE, vertexStride, 0);
//设置颜色属性指针
glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
glEnableVertexAttribArray(mColorHandle);
glVertexAttribPointer(mColorHandle, COORDS_PER_COLOR, GL_FLOAT, GL_FALSE, colorStride, 0);
//设置索引指针
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
* 绘制图形。
glBindVertexArray(VAO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
//绘制图形
glLineWidth(10.0f);
glDrawElements(GL_LINE_LOOP, getArrayLen(index), GL_UNSIGNED_SHORT, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArray(0);
* `.cpp文件`
//
// Created by lvjunkai on 2022/2/21.
//
#include <EGL/egl.h>
#include <GLES3/gl3.h>
#include <jni.h>
#include <malloc.h>
#include
#include <glm/gtc/matrix_transform.hpp>
#include <glm/glm.hpp>
using namespace std;
//声明自定义函数
//创建编译加载
GLuint LoadShader(int type, char *shaderCode);
//链接统一程序
GLuint linkProgram(GLuint vertexShader, GLuint fragmentShader);
//用于求数组长度
template
GLsizei getArrayLen(T &array) {
return (sizeof(array) / sizeof(array[0]));
}
//float 四个字节
const GLint BYTES_PER_FLOAT = 4;
//short 两个字节
const GLint BYTES_PER_SHORT = 2;
//xyz坐标
const GLint COORDS_PER_VERTEX = 3;
//RGBA通道
const GLint COORDS_PER_COLOR = 4;
//点的偏移量
const GLint vertexStride = COORDS_PER_VERTEX * BYTES_PER_FLOAT;
//颜色偏移量
const GLint colorStride = COORDS_PER_COLOR * BYTES_PER_FLOAT;
//声明顶点着色器
GLuint vertexShader;
//声明片元着色器
GLuint fragmentShader;
//声明着色器管理程序
GLuint mProgram;
//声明缓冲区对象
GLuint VBO[2], VAO, EBO;
//分别保存一个VBO
GLuint positionBufferHandle;
GLuint colorBufferHandle;
//声明句柄
GLint mMatrixHandle;
GLint mPositionHandle;
GLint mColorHandle;
//定义点坐标
float vertexPoints[] = {
-0.5f, 0.5f, 0.0f, //左上
-0.5f, -0.5f, 0.0f, //左下
0.5f, -0.5f, 0.0f, //右下
0.5f, 0.5f, 0.0f, //右上
};
//定义颜色数据
float colors[] = {
1.0f, 0.0f, 1.0f, 0.0f,
1.0f, 1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 1.0f, 0.0f,
0.1f, 0.7f, 1.0f, 0.0f,
};
//定义索引数据
short index[] = {
0, 1, 2,
0, 2, 3,
};
//顶点着色器代码
char vertexShaderCode[] = “uniform mat4 vMatrix;”
"attribute vec4 vPosition;"
"attribute vec4 vColor;"
"varying vec4 aColor;"
"void main()"
"{"
" gl_Position = vMatrix * vPosition;"
" aColor = vColor;"
" gl_PointSize = 10.0;"
"}";
//片段着色器代码
char fragmentShaderCode[] = “precision mediump float;”
"varying vec4 aColor;"
"void main()"
"{"
" gl_FragColor = aColor;"
"}";
JNIEXPORT void JNICALL init(JNIEnv *env, jobject obj) {
}
//书写本地方法的具体逻辑
/**初始化
-
@param env
-
@param obj
*/
JNIEXPORT void JNICALL surfaceCreated(JNIEnv *env, jobject obj) {
//设置背景颜色为黑色
glClearColor(0, 0, 0, 0);
//创建顶点着色器
vertexShader = LoadShader(GL_VERTEX_SHADER, vertexShaderCode);
//创建片元着色器
fragmentShader = LoadShader(GL_FRAGMENT_SHADER, fragmentShaderCode);
//将顶点着色器和片元着色器交给统一程序管理
mProgram = linkProgram(vertexShader, fragmentShader);
//准备数据
//创建VAO对象
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
//创建VBO,EBO对象
glGenBuffers(getArrayLen(VBO), VBO);
positionBufferHandle = VBO[0];
colorBufferHandle = VBO[1];
glGenBuffers(1, &EBO);
//传入数据
glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
glBufferData(GL_ARRAY_BUFFER, getArrayLen(vertexPoints) * BYTES_PER_FLOAT, vertexPoints,
GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
glBufferData(GL_ARRAY_BUFFER, getArrayLen(colors) * BYTES_PER_FLOAT, colors, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, getArrayLen(index) * BYTES_PER_SHORT, index,
GL_STATIC_DRAW);
//解除绑定
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
//句柄
mPositionHandle = glGetAttribLocation(mProgram, "vPosition");
mColorHandle = glGetAttribLocation(mProgram, "vColor");
//设置顶点属性指针
glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
glEnableVertexAttribArray(mPositionHandle);
glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GL_FLOAT, GL_FALSE, vertexStride, 0);
//设置颜色属性指针
glBindBuffer(GL_ARRAY_BUFFER, colorBufferHandle);
glEnableVertexAttribArray(mColorHandle);
glVertexAttribPointer(mColorHandle, COORDS_PER_COLOR, GL_FLOAT, GL_FALSE, colorStride, 0);
//设置索引指针
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
/**图形尺寸
-
@param env
-
@param obj
-
@param width
-
@param height
*/
glm::mat4 mProjectionMatrix;
glm::mat4 mViewMatrix;
glm::mat4 mMVPMatrix;
float mMVPMatrixArray[16];
JNIEXPORT void JNICALL surfaceChanged(JNIEnv *env, jobject obj, jint width, jint height) {
//设置视口
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
题外话
我们见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。
其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。
不断奔跑,你就知道学习的意义所在!
注意:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
dBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
/**图形尺寸
-
@param env
-
@param obj
-
@param width
-
@param height
*/
glm::mat4 mProjectionMatrix;
glm::mat4 mViewMatrix;
glm::mat4 mMVPMatrix;
float mMVPMatrixArray[16];
JNIEXPORT void JNICALL surfaceChanged(JNIEnv *env, jobject obj, jint width, jint height) {
//设置视口
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-gLbDsUbd-1712881102150)]
[外链图片转存中…(img-RfSz3EQ6-1712881102150)]
[外链图片转存中…(img-MTeP4Wfr-1712881102151)]
[外链图片转存中…(img-UjJ2xqNL-1712881102151)]
[外链图片转存中…(img-T4kcr2tD-1712881102152)]
[外链图片转存中…(img-QOIPHKN5-1712881102152)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-VtIuHFa2-1712881102152)]
题外话
我们见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。
其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。
不断奔跑,你就知道学习的意义所在!
注意:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-WKwkOIhL-1712881102153)]文章来源:https://www.toymoban.com/news/detail-850826.html
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-8rkXnYSk-1712881102153)]文章来源地址https://www.toymoban.com/news/detail-850826.html
到了这里,关于【OpenGL ES】缓存——缓冲区对象【I的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!