梳理Opengl ES 3.0 介绍宏观着眼

OpenGL ES(OpenGL for Embedded Systems,嵌入式系统OpenGL)是面向嵌入式设备的OpenGL API,在移动设备和嵌入式设备上应用广泛。OpenGL ES 3.0是最新发布的版本,提供了更强大的功能和更好的性能。

一、功能介绍

1. Shader语言更新

OpenGL ES 3.0增加了GLSL ES 3.0着色语言,与OpenGL 4.3相似。GLSL ES 3.0提供新的特性,以支持更高级别的图形特效。对于开发者而言,这使得编写高级着色器变得更容易。GLSL ES 3.0还支持复杂的裁剪功能,允许通过扫描状态区域来检查是否应跳过在屏幕上绘制的特定像素。

2. 多重的RenderTarget

这是OpenGL ES 3.0新的重要特性之一,可以将一个图像绘制到多个RenderTargets中,实现更高质量的图像渲染、特效和后期处理。

3. 抗锯齿

OpenGL ES 3.0增加了对多重采样的支持,使得更平滑的边缘和更清晰的图像变成可能。这项新功能对开发者表示非常方便,不和高屏幕分辨率以及细节级别带来很大的影响。开启抗锯齿的时候需要在程序中设置一些参数,可以参考OpenGL官方文档。

4. 高级图像处理

OpenGL ES 3.0新增了一些高级的实时图像处理工具,包括3D纹理和引入了许多新的纹理格式,如纹理压缩和纹理格式转换,支持32位浮点纹理。这些功能可以帮助开发者更好地控制着色器,提高图像质量和性能。

5. PBO/Pixel Buffer Objects

Pixel Buffer Objects(PBO)可以在GPU和CPU之间传递大量的数据。OpenGL ES 3.0新增了支持PBO,使得图像处理能够更快捷地在远程GPU中进行。

二、使用方法

OpenGL ES 3.0主要是基于OpenGL ES 2.0的,但还有一些新的API和扩展。下面是一些使用OpenGL ES 3.0的基本步骤:

1. 初始化OpenGL ES 3.0环境

在开始操作OpenGL ES 3.0之前,需要首先初始化OpenGL ES 3.0环境。可以使用以下代码片段来初始化:

```

EGLDisplay display;

EGLContext context;

EGLSurface surface;

int width, height;

display = eglGetDisplay(EGL_DEFAULT_DISPLAY);

eglInitialize(display, 0, 0);

EGLConfig config;

EGLint numConfigs;

EGLint format;

EGLint vid;

static const EGLint attribs[] = {

EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR,

EGL_DEPTH_SIZE, 8,

EGL_NONE

};

eglChooseConfig(display, attribs, &config, 1, &numConfigs);

eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &vid);

ANativeWindow_setBuffersGeometry(window, 0, 0, vid);

surface = eglCreateWindowSurface(display, config, window, NULL);

context = eglCreateContext(display, config, NULL, NULL);

eglMakeCurrent(display, surface, surface, context);

eglQuerySurface(display, surface, EGL_WIDTH, &width);

eglQuerySurface(display, surface, EGL_HEIGHT, &height);

```

2. 生成着色器

OpenGL ES 3.0的着色器使用GLSL ES 3.0着色语言。例如,下面这个代码片段会生成一个简单的着色器:

```

char* vertexShaderSource =

"uniform mat4 u_MVPMatrix;"

"attribute vec4 a_Position;"

"attribute vec4 a_Color;"

"varying vec4 v_Color;"

"void main()"

"{"

" v_Color = a_Color;"

" gl_Position = u_MVPMatrix * a_Position;"

"}";

char* fragmentShaderSource =

"#ifdef GL_ES\n"

"precision mediump float;\n"

"#endif\n"

"varying vec4 v_Color;"

"void main()"

"{"

" gl_FragColor = v_Color;"

"}";

```

3. 创建图元

可以使用OpenGL ES 3.0中的以下API来创建图元:

```

glGenBuffers();

glBindBuffer();

glBufferData();

glVertexAttribPointer();

glEnableVertexAttribArray();

```

4. 渲染

可以使用以下代码片段来渲染图像:

```

glClearColor(0.5f, 0.5f, 0.5f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glUseProgram(program);

// 绘制

eglSwapBuffers(display, surface);

```

三、案例说明

以下是一个简单的OpenGL ES 3.0案例:

```

#include

#include

GLuint VAO;

GLuint VBO;

GLuint shader;

GLuint vertShader;

GLuint fragShader;

static void printShaderInfoLog(GLuint shader) {

GLint success;

GLchar infoLog[1024];

glGetShaderiv(shader, GL_COMPILE_STATUS, &success);

if (!success) {

glGetShaderInfoLog(shader, 1024, NULL, infoLog);

printf("ShaderCompileFail\n:%s\n", infoLog);

}

}

void init() {

static const char* vertexShader = R"(

#version 300 es

in vec3 aPos;

void main() {

gl_Position = vec4(aPos, 1.0);

}

)";

static const char* fragmentShader = R"(

#version 300 es

out mediump vec4 fragColor;

void main() {

fragColor = vec4(0.3, 0.5, 0.7, 1.0);

}

)";

vertShader = glCreateShader(GL_VERTEX_SHADER);

glShaderSource(vertShader, 1, &vertexShader, nullptr);

glCompileShader(vertShader);

printShaderInfoLog(vertShader);

fragShader = glCreateShader(GL_FRAGMENT_SHADER);

glShaderSource(fragShader, 1, &fragmentShader, nullptr);

glCompileShader(fragShader);

printShaderInfoLog(fragShader);

shader = glCreateProgram();

glAttachShader(shader, vertShader);

glAttachShader(shader, fragShader);

glLinkProgram(shader);

GLfloat vertices[] = {

-0.5f, -0.5f, 0.0f,

0.5f, -0.5f, 0.0f,

0.0f, 0.5f, 0.0f

};

glGenVertexArrays(1, &VAO);

glBindVertexArray(VAO);

glGenBuffers(1, &VBO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (void*) 0);

glEnableVertexAttribArray(0);

glBindVertexArray(0);

}

void render() {

glClearColor(0.8f, 0.8f, 0.8f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glUseProgram(shader);

glBindVertexArray(VAO);

glDrawArrays(GL_TRIANGLES, 0, 3);

glBindVertexArray(0);

glUseProgram(0);

}

int main() {

init();

render();

return 0;

}

```

在这个案例中,我们通过OpenGL ES 3.0创建了一个三角形,并使用着色器为每个像素着色。在案例中,我们使用了以下API:glGenBuffers,glBindBuffer,glBufferData,glVertexAttribPointer和glEnableVertexAttribArray。实际上,我们并没有使用OpenGL ES 3.0的所有功能,但这个案例可以帮助您入门OpenGL ES 3.0的基本使用。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(85) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部