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/
发表评论 取消回复