OpenGL ES eglCreatePbufferSurface() 和 eglCreateWindowSurface() 的对比和使用

一、介绍

相同点:

eglCreatePbufferSurfaceeglCreateWindowSurface 都是 OpenGL ES 中用于创建不同类型的EGL表面的函数,以便在OpenGL ES中进行渲染。

不同点:

选择使用哪种表面类型取决于你的需求。如果你只是需要在内存中进行离屏渲染,而不需要将结果显示在屏幕上,那么 eglCreatePbufferSurface 可能更适合。

如果你需要在窗口系统的窗口上显示OpenGL渲染的内容,那么 eglCreateWindowSurface 是更常见的选择。

二、eglCreatePbufferSurface

eglCreatePbufferSurface 用于创建一个离屏渲染表面,也称为Pbuffer表面。Pbuffer表面是一个虚拟的离屏缓冲区,可以在其中进行渲染操作,而不直接与屏幕交互。通常,它用于离屏渲染、渲染到纹理等场景。

1. 函数定义

///< @param [in] dpy EGL显示连接
///< @param [in] config EGL配置
///< @param [in] attrib_list 属性列表,用于指定Pbuffer的一些属性,可以为NULL
///< @return 返回EGL表面
EGLSurface eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);

2. 使用示例

// 初始化EGL
eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglInitialize(eglDisplay, 0, 0);
// 配置EGL
EGLConfig config;
EGLint numConfigs;
EGLint configAttribs[] = {EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT_KHR,EGL_RED_SIZE, 8,EGL_GREEN_SIZE, 8,EGL_BLUE_SIZE, 8,EGL_NONE
};
eglChooseConfig(eglDisplay, configAttribs, &config, 1, &numConfigs);
// 创建EGL窗口表面(可以是Pbuffer等)
EGLint attribList[] = {EGL_RENDER_BUFFER, EGL_BACK_BUFFER, EGL_NONE};
eglSurface = eglCreatePbufferSurface(eglDisplay, config, attribList);
// 创建EGL上下文
EGLint contextAttribs[] = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE};
eglContext = eglCreateContext(eglDisplay, config, EGL_NO_CONTEXT, contextAttribs);
// 关联上下文
eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);// 渲染操作...// 交换缓冲区
eglSwapBuffers(eglDisplay, eglSurface);// 销毁 EGLSurface
eglDestroySurface(eglDisplay, eglSurface);
// 销毁 EGLContext
eglDestroyContext(eglDisplay, eglContext);
// 终止 EGL
eglTerminate(eglDisplay);

三、eglCreateWindowSurface

eglCreateWindowSurface 用于创建一个与屏幕窗口相关的EGL表面。这个表面通常与设备的窗口系统交互,使得OpenGL ES渲染的内容能够显示在屏幕上。

1. 函数定义

///< @param [in] dpy EGL显示连接
///< @param [in] config EGL配置
///< @param [in] win 与窗口系统相关的本地窗口类型。在Android中,通常是ANativeWindow*类型
///< @param [in] attrib_list 属性列表,用于指定Pbuffer的一些属性,可以为NULL
///< @return 返回EGL表面
EGLSurface eglCreateWindowSurface(EGLDisplay dpy,EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list);

2. 使用示例

注意:

如果你需要渲染到屏幕上,那么建议直接使用封装好的 GLSurfaceView 类,它已经把复杂的 EGL 管理,线程管理等做好了,直接使用即可。

下面的示例参考演示我们自己应该如何使用 eglCreateWindowSurface。

JNI代码

#include <EGL/egl.h>
#include <GLES3/gl3.h>
#include <android/native_window_jni.h>EGLDisplay eglDisplay;
EGLSurface eglSurface;
EGLContext eglContext;JNIEXPORT void JNICALL
Java_com_afei_opengldemo_MySurfaceView_glDraw(JNIEnv *env, jclass clazz, jobject surface) {// 初始化EGLeglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);if (eglDisplay == EGL_NO_DISPLAY) {// Unable to open connection to local windowing systemreturn;}EGLint majorVersion;EGLint minorVersion;if (!eglInitialize(eglDisplay, &majorVersion, &minorVersion)) {// Unable to initialize EGL. Handle and recoverreturn;}// 配置EGLEGLConfig config;EGLint numConfigs;EGLint configAttribs[] = {EGL_RENDERABLE_TYPE, EGL_OPENGL_ES3_BIT,EGL_RED_SIZE, 8,EGL_GREEN_SIZE, 8,EGL_BLUE_SIZE, 8,EGL_DEPTH_SIZE, 1,EGL_NONE};if (!eglChooseConfig(eglDisplay, configAttribs, &config, 1, &numConfigs)) {return;}// 创建EGL窗口表面(可以是Pbuffer等)EGLint attribList[] = {EGL_RENDER_BUFFER, EGL_BACK_BUFFER, EGL_NONE};// 这里我们需要在Java层传递一个Surface对象供我们显示ANativeWindow *window = ANativeWindow_fromSurface(env, surface);eglSurface = eglCreateWindowSurface(eglDisplay, config, window, attribList);if (eglSurface == EGL_NO_SURFACE) {EGLint error = eglGetError();switch (error) {case EGL_BAD_MATCH:// Check window and EGLConfig attributes to determine// compatibility, or verify that the EGLConfig// supports rendering to a window,break;case EGL_BAD_CONFIG:// Verify that provided EGLConfig is validbreak;case EGL_BAD_NATIVE_WINDOW:// Verify that provided EGLNativeWindow is validbreak;case EGL_BAD_ALLOC:// Not enough resources available. Handle and recoverbreak;}return;}// 创建EGL上下文EGLint contextAttribs[] = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE};eglContext = eglCreateContext(eglDisplay, config, EGL_NO_CONTEXT, contextAttribs);if (eglContext == EGL_NO_CONTEXT) {EGLint error = eglGetError();if (error == EGL_BAD_CONFIG) {// Handle error and recoverreturn;}}// 关联上下文eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext);// 初始化OpenGL和渲染操作...// 交换缓冲区eglSwapBuffers(eglDisplay, eglSurface);// 销毁 EGLSurfaceeglDestroySurface(eglDisplay, eglSurface);// 销毁 EGLContexteglDestroyContext(eglDisplay, eglContext);// 终止 EGLeglTerminate(eglDisplay);
}

Java调用代码

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {private SurfaceHolder mSurfaceHolder;public MyView(Context context) {super(context);mSurfaceHolder = getHolder();mSurfaceHolder.addCallback(this);}@Overridepublic void surfaceCreated(@NonNull SurfaceHolder holder) {// 初始化操作等glDraw(holder.getSurface());}@Overridepublic void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(@NonNull SurfaceHolder holder) {// 释放操作...}public native static void glDraw(Surface surface);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lombok详解

目录 前言:注解速查1.Lombok概念2.安装Lombok3. 使用Lombok3.1 😊@Data3.2 @Getter@Setter3.3 @NonNull3.4 @Synchronized3.5 @ToString:自动生成toString()方法3.6 @Cleanup3.7 @EqualsAndHashCode前言:注解速查 @NonNull : 用在成员方法或者构造方法的参数前面,会自动产…

chrom谷歌浏览器删除表单填写记录

鼠标光标移动到删除的信息 shiftdel就可以删除了

基于Python的图书管理系统的设计与实现

点我完整下载&#xff1a;基于Python的图书管理系统的设计与实现.docx 基于Python的图书管理系统的设计与实现 Design and Implementation of a Book Management System based on Python 目录 目录 2 摘要 3 关键词 3 第一章 引言 4 1.1 研究背景 4 1.2 研究目的 5 1.3 研究意义…

Redis 集群搭建 哨兵模式搭建

文章目录 Redis version 6.0.5 集群搭建下载文件环境安装解压编译配置文件启动关闭密码设置 Redis version 6.0.5 集群搭建 下载文件 下载 命令 url 可找官网 复制 wget http://download.redis.io/releases/redis-6.0.5.tar.gz环境安装 yum install gcc-c yum install cpp …

【矩阵】240.搜索二维矩阵II

题目 跟剑指中题目相同。 class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m matrix.length, n matrix[0].length;int i m - 1, j 0;while (i > 0 && j < n) {if (matrix[i][j] target) {return true;} else if (matrix[i]…

Java多线程技术二:线程间通信——ThreadLocal的使用

1 概述 变量值的共享可以使用public static 的声明方式&#xff0c;所有的线程都是用同一个public static变量&#xff0c;那如果想实现每一个线程都有自己的变量该如何解决呢&#xff1f;JDK提供的ThreadLocal就派上用场了。 ThreadLocal类主要的作用就是将数据放入当前线程对…

FreeRTOS下的“Hello World”

什么是实时操作系统&#xff08;RTOS&#xff09; 实时操作系统&#xff08;RTOS&#xff09;是一种专为实时应用程序设计的操作系统。实时应用程序需要在特定时间内做出预测的响应&#xff0c;因此RTOS专注于提供对时间约束的强调&#xff0c;以确保系统能够满足实时性能要求…

web前端开发HTML/css用户登录界面

代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-equi…

react学习--Redux的使用

Redux 的核心思想是通过一个单一的状态树来管理应用的状态&#xff0c;状态的修改通过纯函数&#xff08;reducers&#xff09;来进行&#xff0c;从而使状态变化可追踪和可预测。 1、安装 Redux&#xff1a; 在项目中安装 Redux 库和 React-Redux&#xff08;用于 React 绑定…

神经网络常用归一化和正则化方法解析(一)

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

Diary11-Word文字

Word文字 一.标尺与标记 1.标尺 1.1标尺的打开方式 标尺&#xff1a;视图->标尺(选中即可) 1.2标尺的相关操作 左边的倒三角&#xff1a;【首行缩进】->第一行与左边的间距 左边的正三角&#xff1a;【悬挂缩进】->除了第一行之外的行与左边的间距 右边的正三角…

Win环境中安装Jenkins指南

目录 安装Java环境 下载并安装Jenkins Jenkins版本 启动Jenkins 如何删除Jenkins 安装Java环境 访问 Oracle官方网站 下载并安装JDK 安装完成后&#xff0c;设置系统环境变量 JAVA_HOME 到你的 JDK 安装路径&#xff0c;并将 %JAVA_HOME%\bin 添加到系统 PATH 中。 下载…

Apollo新版本Beta技术沙龙参会感受:未来的自动驾驶之旅

Apollo新版本Beta技术沙龙参会感受&#xff1a;未来的自动驾驶之旅 &#x1f697;&#x1f4a1; 文章目录 Apollo新版本Beta技术沙龙参会感受&#xff1a;未来的自动驾驶之旅 &#x1f697;&#x1f4a1;摘要引言正文&#x1f4cd; 参会流程介绍&#x1f31f; 参会收获&#x1…

「Verilog学习笔记」任意小数分频

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1nsmodule div_M_N(input wire clk_in,input wire rst,output wire clk_out );parameter M_N 8d87; parameter c89 8d24; // 8/9时钟切换点parameter di…

封装时间轴组件 timeline

要求时间轴的点展示进度百分比&#xff0c;线也根据进度不同展示不同长度的颜色 实现效果&#xff1a; 使用的组件库是vant的circle 子组件&#xff1a; <template><div class"m-timeline-area" :style"width: ${width}px"><div class&qu…

python读取txt,csv, 等不同格式的文件——(待完善)

python 读取txt文件 1.python读取txt文件&#xff08;多种方法&#xff09;

#名词区别篇:事件流事件委托addEventListener白屏时间首屏时间

事件流 事件捕获 —从外到内 到达目标 事件冒泡—从内到外 事件委托 定义&#xff1a;当有大量子元素触发事件时&#xff0c;将事件监听器绑定在父元素进行监听&#xff0c;此时数百个事件监听器变成一个监听器。 e.currentTarget 与 e.target 有何区别 Event 接口的只读…

前端利用JS获取最近1、3、5、n年的开始时间和结束时间

1.获取最近1年的开始时间和结束时间 function getLastYearStartAndEnd() {const currentDate new Date();const currentYear currentDate.getFullYear();const currentMonth currentDate.getMonth() 1;const lastYearStart new Date(currentYear - 1, currentMonth, 1);c…

聊聊 Jetpack Compose 的 “状态订阅自动刷新” -- 你真的了解重组吗?

Jekpack Compose “状态订阅&自动刷新” 系列&#xff1a; 【 聊聊 Jetpack Compose 的 “状态订阅&自动刷新” - - MutableState/mutableStateOf 】 【 聊聊 Jetpack Compose 的 “状态订阅&自动刷新” - - remember 和重组作用域 】 【 聊聊 Jetpack Compose 的 …

Spring Cloud 配置 Druid(二)

不废话&#xff0c;直接上代码&#xff0c; Nacos搭建的微服务&#xff0c;可以看Spring Cloud 配置 Nacos&#xff08;一&#xff09;-CSDN博客 一&#xff0c;pom文件 spring-cloud-starter-alibaba-nacos-discovery 和 spring-cloud-starter-openfeign 都是基于spring-cl…