网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
09月19日漏签0天
c4droid吧 关注:42,789贴子:262,846
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 26回复贴,共1页
<<返回c4droid吧
>0< 加载中...

如何使用c4droid启用opengl es 2.0

  • 只看楼主
  • 收藏

  • 回复
  • 叜駣
  • 小小白菜
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
现在我们来研究如何借助egl,在native activity中启用opengl es 2.0 的功能,阅读本文的前提是阅读并理解了native activity 教程:http://tieba.baidu.com/p/2650541001


  • 叜駣
  • 小小白菜
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在先前的例子中,我们创建过onAppCmd回调函数,其中最重要的事件类型是APP_CMD_INIT_WINDOW:
“如果app->onAppCmd回调函数接收到的event_type的值为APP_CMD_INIT_WINDOW,我们就要打开一个可用于opengl渲染的窗口,而native activity开窗用的是egl api,我们可以把egl看成是glut或glfw之类的api,开窗过程如下:
attribs[11] = {EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8, EGL_DEPTH_SIZE, 8, EGL_NONE}
display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglInitialize(...);
eglChooseConfig(...);
eglGetConfigAttrib(...);
ANativeWindow_setBuffersGeometry(...);
sureface = eglCreateWindowSurface(...);
context=eglCreateWindowContext(...);
eglMakeCurrent(...);


2025-09-19 22:13:32
广告
不感兴趣
开通SVIP免广告
  • 叜駣
  • 小小白菜
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
但是,2楼手段创建的是opengl es 1.0 版本窗口,我们知道opengl es 1.0 采用的是fixed pipeline进行渲染,而非glsl渲染,而且矩阵运算方面也采用的是内置式,很不灵活,
opengl es 2.0则很好的解决了这一问题,开启了opengl es 2.0,可以通过自己写shader实现阴影,反射,折射,环境光遮罩等效果,让画面更逼真。
所以我们要在接收APP_CMD_INIT_WINDOW事件后,创建一个opengl es 2.0的渲染窗口,需要注意的是,opengl es版本选择单一的,创建了opengl es 2.0的窗口后,opengl es 1.0部分指令将失效。


  • 叜駣
  • 小小白菜
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
那么开始对代码进行改动,首先我们要在attribs数组中添加2个元素,表明我们要使用opengl es 2.0 的渲染类型,它们是:
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT
其次我们要创建一个上下文属性,让它告诉egl我们要使用的上下文版本是2.0,我们将其命名为attribs_context,则有:
const EGLint attribs_context[] = {
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_NONE
};
这样一来,我们只需要把属性带入相关指令中即可


  • 叜駣
  • 小小白菜
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
参照 egl.h头文件
我们将attribs作为eglChooseConfig中的2号参数
将attribs_context作为eglCreateContext中的4号参数
opengl es 2.0的配置部分就结束了


  • 叜駣
  • 小小白菜
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
但opengl es 2.0 的函数,例如glCreateShader, 是不是马上可以用了呢?
答案是否定的。我们必须注意到,opengl es 2.0的配置是在回调函数中完成的,而并不是在入口函数android_main中完成的,而想要初始化opengl es 2.0,就必须初始化窗口,想要初始化窗口,又先要用 先前编写的refresh 刷新函数,拉取并处理APP_CMD_INIT_WINDOW事件,但我们如何才能得知APP_CMD_INIT_WINDOW事件被处理了呢?
我们可以采用全局变量做记录


  • 叜駣
  • 小小白菜
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
创建一个全局变量,将其命名为 window_status,也就是窗口状态,初始值为0,表示窗口未初始化, 在APP_CMD_INIT_WINDOW事件处理的最后部分,我们添加:window_status = 1
这样一来,在刷新 函数执行过程中,如果遇到窗口初始化事件,opengl es的初始化完成的同时,窗口状态也发生了变化。此时,就可以确保所有的opengl es 2的函数都能正常使用了。
而为了在程序刚开始执行时就达到这一效果,我们可以在android_main 刚开始时,马上建立一个循环:
while(window_status != 1)
refresh();
这样一来,程序就会一直等待opengl es 2.0 初始化,直到完成
于是所有 opengl es 2.0 的函数都能正常使用了


  • gameloftyou
  • 外星人
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不错,mark


2025-09-19 22:07:32
广告
不感兴趣
开通SVIP免广告
  • 乌云小羊
  • 反人类
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
SDL程序意外终止 难道Native Activity不支持MTK


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 26回复贴,共1页
<<返回c4droid吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示