OpenGL ES With Adreno(2)

一、简介

在为android平台开发时,必须使用EGL API创建OpenGL ES上下文。对于Adreno SDK中提供的示例应用程序,这是通过公共框架代码完成的,该代码在各个示例应用程序之间共享。初始化过程由CFrmAppContainer::InitializeEgl方法处理,在SDK\Development\Samples\Framework\Android\FrmApplication_Platform.cpp中实现,如果返回true则表示初始化成功,并且在OpenGL ES呈现上下文已绑定到调用线程。

二、实例简介

1、配置屏幕外帧缓冲区:(屏幕外帧缓冲区是在CreateFBO中构造的)
glGenTextures( 1, &g_hTextureHandle );
glBindTexture( GL_TEXTURE_2D_ARRAY, g_hTextureHandle );
glTexParameteri( GL_TEXTURE_2D_ARRAY,
GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER,GL_LINEAR ); glTexImage3D( GL_TEXTURE_2D_ARRAY, 0, nInternalFormat, nWidth, nHeight, g_nLayers, 0,
nFormat, nType, NULL );
上面是初始化二维数组纹理的代码。它有9层,因为它是常数g_nlayers的值 。
glGenRenderbuffers( 1, &(*ppFBO)->m_hRenderBuffer );
glBindRenderbuffer( GL_RENDERBUFFER, (*ppFBO)->m_hRenderBuffer );
glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, nWidth,nHeight );
在这里,它创建了一个单独的renderbuffer来保存24位精度的深度数据。
glFramebufferTextureLayer( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,g_hTextureHandle, 0, 0);
glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
GL_RENDERBUFFER, (*ppFBO)->m_hRenderBuffer );
配置完成。

2、屏幕外渲染
屏幕外渲染过程由渲染函数的第一部分完成:
for(int i=0; i<g_nLayers; i++) {
BeginFBO( g_pOffscreenFBO, i );
glClearColor( 0.0f, 0.5f, 0.0f, 1.0f );
RenderScene( fTime+i*0.1f );
EndFBO( g_pOffscreenFBO );
}
块循环覆盖所有二维数组纹理层。对于每个层,beginfbo用于配置帧缓冲区对象,其操作如下:
glBindFramebuffer( GL_FRAMEBUFFER, pFBO->m_hFrameBuffer );
glFramebufferTextureLayer( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,g_hTextureHandle, 0, layer);
glViewport( 0, 0, pFBO->m_nWidth, pFBO->m_nHeight );
将当前图层附加为颜色附加零。还要确保视口分辨率与纹理分辨率保持同步。如果不这样做,则棱锥体将不适合渲染目标,或者仅绘制渲染目标的一部分。
完成此操作后,render将调用renderscene,renderscene负责发送渲染棱锥体所需的命令。
glBindFramebuffer( GL_FRAMEBUFFER, 0 );
glViewport( 0, 0, g_nWindowWidth, g_nWindowHeight );
最后,在EndFBO中,绑定回默认的帧缓冲区,并将视区分辨率重置为窗口的尺寸。

3、合成最终图像
合成过程由render函数的剩余部分实现:
FLOAT offsets[9][4] =
{
{ 0.0f, 0.0f, 1.0f/3.0f, 1.0f/3.0f },
{ 1.0f/3.0f, 0.0f, 2.0f/3.0f, 1.0f/3.0f },
{ 2.0f/3.0f, 0.0f, 1.0f, 1.0f/3.0f },
{ 0.0f, 1.0f/3.0f, 1.0f/3.0f, 2.0f/3.0f },
{ 1.0f/3.0f, 1.0f/3.0f, 2.0f/3.0f, 2.0f/3.0f },
{ 2.0f/3.0f, 1.0f/3.0f, 1.0f, 2.0f/3.0f },
{ 0.0f, 2.0f/3.0f, 1.0f/3.0f, 1.0f },
{ 1.0f/3.0f, 2.0f/3.0f, 2.0f/3.0f, 1.0f },
{ 2.0f/3.0f, 2.0f/3.0f, 1.0f, 1.0f },
};
首先是一个数组,定义要放置棱锥图的区域。定义了九个矩形。
glBindFramebuffer( GL_DRAW_FRAMEBUFFER, 0 );
glBindFramebuffer( GL_READ_FRAMEBUFFER, g_pOffscreenFBO->m_hFrameBuffer );
在进入将进行合成的循环之前准备帧缓冲区绑定
for(int i=0; i<g_nLayers; i++)
{
glFramebufferTextureLayer( GL_READ_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0, g_hTextureHandle, 0, i);
glBlitFramebuffer( 0, 0, g_pOffscreenFBO->m_nWidth, g_pOffscreenFBO->m_nHeight, INT32(g_nWindowWidthoffsets[i][0]),INT32(g_nWindowHeightoffsets[i][1]),
INT32(g_nWindowWidthoffsets[i][2]),INT32(g_nWindowHeightoffsets[i][3]),
GL_COLOR_BUFFER_BIT, GL_LINEAR );
}
对于二维数组纹理的每一层,必须执行两项操作才能将图像数据复制到后缓冲区:
1) 将此层配置为读取帧缓冲区的颜色附件零;这将是blit操作的源
2) 使用glblitframebuffer在数组的矩形坐标定义的位置将一个金字塔图像从读取帧缓冲区Blit到后缓冲区
循环完成并返回render函数后,最终图像现在完全合成在后缓冲区中。现在可以将后缓冲区与前缓冲区交换,以便场景在屏幕上可见。

三、总结

本篇文章主要介绍了OpenGL示例应用程序,并对各个步骤进行了简要介绍。大家有问题可在下方留言或者私信探讨。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值