平台相关函数的隔离

本文讨论了在游戏引擎开发中如何通过宏定义隔离不同平台(iOS, Android, Win32)的OpenGL函数差异。针对Android平台缺少GL_BGR等问题,采取预处理宏定义来解决,如定义glClearDepth为glClearDepthf,并引入相应的扩展函数声明。通过这种方式,实现了在不同平台上的代码兼容性。" 116603883,10538792,CentOS内核编译与签名机制详解,"['Linux内核', '系统安全', '驱动开发', 'CentOS', '内核配置']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平台相关函数的隔离
以为通过EGLView类隔离平台相关性,已经可以了,结果发现gl在三个平台居然定义也有差别。比如GL_BGR,android居然没有。好吧,我们的渲染类renderer里面要根据三个不同的平台选择编译代码。肿么破?
  
考虑了下,决定用宏隔开好了。在编译之前,还有一个预处理阶段。来看代码。
//////////////////////////////////////////////////////////////////////////
//PlatformConfig.h
//////////////////////////////////////////////////////////////////////////


#pragma once

#define PLATFORM_UNKNOWN            0
#define PLATFORM_IOS                1
#define PLATFORM_ANDROID            2
#define PLATFORM_WIN32              3


// Determine target platform by compile environment macro.
#define TARGET_PLATFORM             PLATFORM_UNKNOWN



// iphone
#if defined(TARGET_OS_IPHONE)
#undef  TARGET_PLATFORM
#define TARGET_PLATFORM         PLATFORM_IOS
#endif

// android
#if defined(ANDROID)
#undef  TARGET_PLATFORM
#define TARGET_PLATFORM         PLATFORM_ANDROID
#endif

// win32
#if defined(WIN32) && defined(_WINDOWS)
#undef  TARGET_PLATFORM
#define TARGET_PLATFORM         PLATFORM_WIN32
#endif

这样不同的平台,TARGET_PLATFORM的值会不一样。
再来看gl头文件的引用
//////////////////////////////////////////////////////////////////////////
//GLFix.h
//////////////////////////////////////////////////////////////////////////

#pragma once
#include "PlatformConfig.h"

#if (TARGET_PLATFORM == PLATFORM_WIN32)
#include "glew.h"
#endif

#if (TARGET_PLATFORM == PLATFORM_ANDROID)
#define	glClearDepth				glClearDepthf
#define glDeleteVertexArrays		glDeleteVertexArraysOES
#define glGenVertexArrays			glGenVertexArraysOES
#define glBindVertexArray			glBindVertexArrayOES
#define glMapBuffer					glMapBufferOES
#define glUnmapBuffer				glUnmapBufferOES

#define GL_DEPTH24_STENCIL8			GL_DEPTH24_STENCIL8_OES
#define GL_WRITE_ONLY				GL_WRITE_ONLY_OES

// GL_GLEXT_PROTOTYPES isn't defined in glplatform.h on android ndk r7 
// we manually define it here
#include <GLES2/gl2platform.h>
#ifndef GL_GLEXT_PROTOTYPES
#define GL_GLEXT_PROTOTYPES 1
#endif

// normal process
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
// gl2.h doesn't define GLchar on Android
typedef char GLchar;
// android defines GL_BGRA_EXT but not GL_BRGA
#ifndef GL_BGRA
#define GL_BGRA  0x80E1
#endif

#ifndef GL_BGR
#define GL_BGR 0x80E0
#endif

//declare here while define in EGLView_android.cpp
extern PFNGLGENVERTEXARRAYSOESPROC glGenVertexArraysOESEXT;
extern PFNGLBINDVERTEXARRAYOESPROC glBindVertexArrayOESEXT;
extern PFNGLDELETEVERTEXARRAYSOESPROC glDeleteVertexArraysOESEXT;

#define glGenVertexArraysOES glGenVertexArraysOESEXT
#define glBindVertexArrayOES glBindVertexArrayOESEXT
#define glDeleteVertexArraysOES glDeleteVertexArraysOESEXT

#endif

好了,搞定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值