【OpenGL ES】缓存——缓冲区对象【I

这篇具有很好参考价值的文章主要介绍了【OpenGL ES】缓存——缓冲区对象【I。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

//创建编译加载

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移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
【OpenGL ES】缓存——缓冲区对象【I,2024年程序员学习,缓存
【OpenGL ES】缓存——缓冲区对象【I,2024年程序员学习,缓存
【OpenGL ES】缓存——缓冲区对象【I,2024年程序员学习,缓存
【OpenGL ES】缓存——缓冲区对象【I,2024年程序员学习,缓存
【OpenGL ES】缓存——缓冲区对象【I,2024年程序员学习,缓存
【OpenGL ES】缓存——缓冲区对象【I,2024年程序员学习,缓存
【OpenGL ES】缓存——缓冲区对象【I,2024年程序员学习,缓存

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
【OpenGL ES】缓存——缓冲区对象【I,2024年程序员学习,缓存

题外话

我们见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

注意:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

【OpenGL ES】缓存——缓冲区对象【I,2024年程序员学习,缓存

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
【OpenGL ES】缓存——缓冲区对象【I,2024年程序员学习,缓存
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)]
【OpenGL ES】缓存——缓冲区对象【I,2024年程序员学习,缓存

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-VtIuHFa2-1712881102152)]

题外话

我们见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

注意:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-WKwkOIhL-1712881102153)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-8rkXnYSk-1712881102153)]文章来源地址https://www.toymoban.com/news/detail-850826.html

到了这里,关于【OpenGL ES】缓存——缓冲区对象【I的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机体系结构基础知识介绍之缓存性能的十大进阶优化之关键词优先和提前重启以减少失误处罚、合并写入缓冲区以减少惩罚(五)

    处理器通常一次只需要缓存块中的一个字(word)。不要等待整个块被加载,而是在请求的字到达后就立即发送给处理器,并让处理器继续执行,同时填充块中的其他字。这两种具体的策略是: 优先(Critical word first)——从内存中先请求缺失的字,并在它到达后立即发

    2024年02月13日
    浏览(50)
  • 8.缓冲区管理

    双缓冲区:TC+M 假设初始状态缓冲区1满,缓冲区2空,工作区为空。 刚开始缓冲区2为空,所以设备可以向缓冲区2中冲入数据耗时T,另一方面刚开始缓冲区1中是满的,所以刚开始就可以把缓冲区1中的数据传送到工作区中,M时刻工作区被充满,CPU就开始处理数据耗时C,处理完

    2024年02月11日
    浏览(42)
  • Redis 缓冲区

    缓冲区的应用场景 : 客户端与服务器端的通信时,暂存客户端发送的命令数据,或暂存服务器端返给客户端的数据结果 主从节点间进行数据同步时,暂存主节点接收的写命令和数据 缓冲区 : 避免客户端和服务器端的请求发送和处理速度不匹配 服务器给每个连接的客户端都准

    2024年02月07日
    浏览(69)
  • 理解缓冲区

    对于这样的代码,首先可以肯定的是 printf 语句先于 sleep 执行,既然如此那么就应该是先打印语句然后进行休眠,下面看看结果: 但这里却是先休眠以后再打印语句,这是因为存在一个叫缓冲区的东西,当我们要向外设写入数据(让显示器显示就是向显示器写入数据)时会将

    2023年04月25日
    浏览(72)
  • 【Linux】理解缓冲区

    我们发现 printf 和 fwrite (库函数)都输出了2次,而 write 只输出了一次(系统调用)。为什么呢?肯定和fork有关! C接口的函数被打印了两次系统接口前后只是打印了一次:和fork函数有关,fork会创建子进程。在创建子进程的时候,数据会被处理成两份,父子进程发生写时拷

    2024年01月23日
    浏览(54)
  • 【Linux】文件缓冲区

    提到文件缓冲区这个概念我们好像并不陌生,但是我们对于这个概念好像又是模糊的存在脑海中,之间我们在介绍c语言文件操作已经简单的提过这个概念,今天我们不妨深入理解什么是文件缓冲区 通过自己实现库中的一些文件操作函数更加深入的理解文件缓冲区 自定义实现

    2024年02月10日
    浏览(58)
  • C/C++缓冲区

    什么是缓冲区? 程序和磁盘文件之间不能直接交换数据,必须通过内存中一个被称为文件缓冲区的区域来中转。ANSIC标准规定,系统会自动为每个正在使用的文件在内存中开辟一个缓冲区,缓冲区的大小随机器而异。 缓冲区有什么作用? 假设我们在家中休息看电视吃零食,

    2024年02月15日
    浏览(50)
  • SEED-缓冲区溢出攻击

    实验环境:SEED-Ubuntu20.04虚拟机 a) 缓冲区溢出原理 **缓冲区溢出攻击原理:**利用溢出的数据改变源程序的控制流,如覆盖返回地址 b) 分析生成badfile文件的exploit.py程序 Shellcode部分 字节数组末尾处填入shellcode c) 编译目标服务器上具有缓冲区溢出漏洞的stack.c程序,并将其缓冲

    2024年02月07日
    浏览(45)
  • 【Linux】深入理解缓冲区

    目录 什么是缓冲区 为什么要有缓冲区 缓冲区刷新策略 缓冲区在哪里  手动设计一个用户层缓冲区 缓冲区本质上一块内存区域,用来保存临时数据。 缓冲区在各种计算任务中都广泛应用,包括输入/输出操作、网络通信、图像处理、音频处理等。 这块内存区域是由 谁提供的

    2024年02月15日
    浏览(64)
  • 【linux】重定向+缓冲区

    自我名言 : 只有努力,才能追逐梦想,只有努力,才不会欺骗自己。 喜欢的点赞,收藏,关注一下把! close(1),为什么没有打印新建文件fd呢? printf(“%dn”,fd); printf会把内容打印到stdout文件中。 但是close(1)关闭标准输出stdout—显示器,int fd=open();新打开的文件fd是1。 st

    2024年02月08日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包