GLFM عبارة عن واجهة برمجة تطبيقات C لتطوير تطبيقات الأجهزة المحمولة باستخدام OpenGL ES. إنه مستوحى إلى حد كبير من GLFW.
يعمل GLFM على أنظمة التشغيل iOS 9 وtvOS 9 وAndroid 4.1 (API 16) وWebGL 1.0 (عبر Emscripten).
بالإضافة إلى ذلك، توفر GLFM الدعم المعدني على نظامي iOS وtvOS.
دائرة الرقابة الداخلية | tvOS | أندرويد | ويب | |
---|---|---|---|---|
برنامج OpenGL ES 2، برنامج OpenGL ES 3 | ✔️ | ✔️ | ✔️ | ✔️ |
معدن | ✔️ | ✔️ | لا يوجد | لا يوجد |
شبكية العين / ارتفاع DPI | ✔️ | ✔️ | ✔️ | ✔️ |
اتجاه الجهاز | ✔️ | لا يوجد | ✔️ | |
أحداث اللمس | ✔️ | ✔️ | ✔️ | ✔️ |
أحداث تحريك الماوس | ✔️ 1 | ✔️ | ||
أحداث عجلة الفأرة | ✔️ | |||
نمط مؤشر الماوس | ✔️ 1 | ✔️ | ||
أحداث الرمز الرئيسي | ✔️ 2 | ✔️ | ✔️ | ✔️ |
الأحداث المتكررة الرئيسية | ✔️ | ✔️ | ||
أحداث إدخال الأحرف | ✔️ | ✔️ 3 | ✔️ | ✔️ |
لوحة المفاتيح الافتراضية | ✔️ | ✔️ | ||
أحداث رؤية لوحة المفاتيح الافتراضية | ✔️ | ✔️ | ||
مقياس التسارع، مقياس المغناطيسية، الجيروسكوب، دوران الجهاز | ✔️ | لا يوجد | ✔️ | |
ردود الفعل اللمسية | ✔️ 4 | لا يوجد | ✔️ | |
الحافظة | ✔️ | لا يوجد | ✔️ | ✔️ |
إدخالات Chrome ("منطقة آمنة") | ✔️ 5 | ✔️ | ✔️ | |
تم تغيير أحداث Chrome المُدخلة | ✔️ 5 | ✔️ | ✔️ | |
أحداث التركيز | ✔️ | ✔️ | ✔️ | ✔️ |
تغيير حجم الأحداث | ✔️ | ✔️ | ✔️ | ✔️ |
أحداث تحذير الذاكرة | ✔️ | ✔️ | ✔️ | |
أحداث فقدان سياق OpenGL (تدمير السطح) | ✔️ | ✔️ | ✔️ | ✔️ |
1. آيباد فقط. يتطلب iOS 13.4 أو أحدث
2. يتطلب iOS/tvOS 13.4 أو أحدث
3. يتطلب tvOS 13.4 أو أحدث
4. يتطلب iOS 13 أو أحدث
5. يتطلب iOS/tvOS 11 أو أحدث
بالإضافة إلى ذلك، هناك دعم أولي لنظام التشغيل macOS مع OpenGL 3.2. يعد إصدار macOS مفيدًا لأغراض التطوير، ولكنه لا يمثل جودة الإصدار. لا توجد وظيفة لتعيين حجم النافذة، على سبيل المثال.
GLFM محدود النطاق، ولم يتم تصميمه لتوفير كل ما هو مطلوب للتطبيق. على سبيل المثال، لا توفر GLFM (ولن تقدم أبدًا) ما يلي:
بدلاً من ذلك، يمكن استخدام GLFM مع مكتبات أخرى عبر الأنظمة الأساسية توفر ما يحتاجه التطبيق.
يتم توفير ملف CMakeLists.txt
للراحة، على الرغم من أن CMake غير مطلوب.
بدون كميك:
include
و src
) إلى مشروعك.void glfmMain(GLFMDisplay *display)
في ملف C/C++. بالنسبة لبنيات الإصدار، قم بتعريف NDEBUG
لإزالة بيانات التسجيل غير الضرورية. يتم تعريف NDEBUG
تلقائيًا لإصدارات الإصدار في Android Studio، ولكن ليس في Xcode.
يقوم هذا المثال بتهيئة العرض في glfmMain()
ورسم مثلث في onDraw()
. مثال أكثر تفصيلا متاح هنا.
#include "glfm.h"
static GLint program = 0 ;
static GLuint vertexBuffer = 0 ;
static GLuint vertexArray = 0 ;
static void onDraw ( GLFMDisplay * display );
static void onSurfaceDestroyed ( GLFMDisplay * display );
void glfmMain ( GLFMDisplay * display ) {
glfmSetDisplayConfig ( display ,
GLFMRenderingAPIOpenGLES2 ,
GLFMColorFormatRGBA8888 ,
GLFMDepthFormatNone ,
GLFMStencilFormatNone ,
GLFMMultisampleNone );
glfmSetRenderFunc ( display , onDraw );
glfmSetSurfaceDestroyedFunc ( display , onSurfaceDestroyed );
}
static void onSurfaceDestroyed ( GLFMDisplay * display ) {
// When the surface is destroyed, all existing GL resources are no longer valid.
program = 0 ;
vertexBuffer = 0 ;
vertexArray = 0 ;
}
static GLuint compileShader ( const GLenum type , const GLchar * shaderString , GLint shaderLength ) {
GLuint shader = glCreateShader ( type );
glShaderSource ( shader , 1 , & shaderString , & shaderLength );
glCompileShader ( shader );
return shader ;
}
static void onDraw ( GLFMDisplay * display ) {
if ( program == 0 ) {
const GLchar vertexShader [] =
"#version 100n"
"attribute highp vec4 position;n"
"void main() {n"
" gl_Position = position;n"
"}" ;
const GLchar fragmentShader [] =
"#version 100n"
"void main() {n"
" gl_FragColor = vec4(0.85, 0.80, 0.75, 1.0);n"
"}" ;
program = glCreateProgram ();
GLuint vertShader = compileShader ( GL_VERTEX_SHADER , vertexShader , sizeof ( vertexShader ) - 1 );
GLuint fragShader = compileShader ( GL_FRAGMENT_SHADER , fragmentShader , sizeof ( fragmentShader ) - 1 );
glAttachShader ( program , vertShader );
glAttachShader ( program , fragShader );
glLinkProgram ( program );
glDeleteShader ( vertShader );
glDeleteShader ( fragShader );
}
if ( vertexBuffer == 0 ) {
const GLfloat vertices [] = {
0.0 , 0.5 , 0.0 ,
-0.5 , -0.5 , 0.0 ,
0.5 , -0.5 , 0.0 ,
};
glGenBuffers ( 1 , & vertexBuffer );
glBindBuffer ( GL_ARRAY_BUFFER , vertexBuffer );
glBufferData ( GL_ARRAY_BUFFER , sizeof ( vertices ), vertices , GL_STATIC_DRAW );
}
int width , height ;
glfmGetDisplaySize ( display , & width , & height );
glViewport ( 0 , 0 , width , height );
glClearColor ( 0.08f , 0.07f , 0.07f , 1.0f );
glClear ( GL_COLOR_BUFFER_BIT );
#if defined( GL_VERSION_3_0 ) && GL_VERSION_3_0
if ( vertexArray == 0 ) {
glGenVertexArrays ( 1 , & vertexArray );
}
glBindVertexArray ( vertexArray );
#endif
glUseProgram ( program );
glBindBuffer ( GL_ARRAY_BUFFER , vertexBuffer );
glEnableVertexAttribArray ( 0 );
glVertexAttribPointer ( 0 , 3 , GL_FLOAT , GL_FALSE , 0 , 0 );
glDrawArrays ( GL_TRIANGLES , 0 , 3 );
glfmSwapBuffers ( display );
}
انظر glfm.h
استخدم cmake
لإنشاء مشروع Xcode:
cmake -D GLFM_BUILD_EXAMPLES=ON -B build/apple -G Xcode
open build/apple/GLFM.xcodeproj
في Xcode، قم بالتبديل إلى الهدف glfm_touch
وقم بتشغيله على جهاز محاكاة أو جهاز.
استخدم emcmake
لتعيين المتغيرات البيئية لـ cmake
، ثم قم ببناء:
emcmake cmake -D GLFM_BUILD_EXAMPLES=ON -B build/emscripten && cmake --build build/emscripten
ثم قم بالتشغيل محليًا:
emrun build/emscripten/examples
أو قم بتشغيل مثال محدد:
emrun build/emscripten/examples/glfm_touch.html
لا يوجد منشئ CMake لمشاريع Android Studio، ولكن يمكنك تضمين CMakeLists.txt
في مشروع جديد أو موجود.
[path/to/glfm]/build/android
ثم اضغط على "إنهاء".AndroidManifest.xml
، أضف
الرئيسي كما يلي: xml version = " 1.0 " encoding = " utf-8 " ?>
< manifest xmlns : android = " http://schemas.android.com/apk/res/android " >
< uses-feature android : glEsVersion = " 0x00020000 " android : required = " true " />
< application
android : allowBackup = " true "
android : icon = " @mipmap/ic_launcher "
android : label = " @string/app_name "
android : supportsRtl = " true " >
< activity android : name = " android.app.NativeActivity "
android : exported = " true "
android : configChanges = " orientation|screenLayout|screenSize|keyboardHidden|keyboard " >
< meta-data
android : name = " android.app.lib_name "
android : value = " glfm_touch " />
< intent-filter >
< action android : name = " android.intent.action.MAIN " />
< category android : name = " android.intent.category.LAUNCHER " />
intent-filter >
activity >
application >
manifest >
app/build.gradle
، أضف القسمين externalNativeBuild
و sourceSets.main
كما يلي: apply plugin : ' com.android.application '
android {
compileSdkVersion 34
ndkVersion ' 23.2.8568313 ' // Last version to support API 16, 17, 18
defaultConfig {
applicationId " com.brackeen.glfmexample "
minSdkVersion 16
targetSdkVersion 34
versionCode 1
versionName " 1.0 "
// Add externalNativeBuild in defaultConfig (1/2)
externalNativeBuild {
cmake {
arguments " -DGLFM_BUILD_EXAMPLES=ON "
}
}
}
// Add sourceSets.main and externalNativeBuild (2/2)
sourceSets . main {
assets . srcDirs = [ " ../../../examples/assets " ]
}
externalNativeBuild {
cmake {
path " ../../../CMakeLists.txt "
}
}
namespace ' com.brackeen.glfmexample '
}
glfmMain
أو من وظائف رد الاتصال). ما هو IDE الذي يجب أن أستخدمه؟ لماذا لا يوجد تنفيذ لسطح المكتب؟ استخدم Xcode أو Android Studio. بالنسبة لسطح المكتب، استخدم GLFW مع IDE الذي تختاره.
إذا كنت تفضل عدم استخدام محاكيات الهاتف المحمول للتطوير اليومي، فالحل الجيد هو استخدام GLFW بدلاً من ذلك، ثم نقل تطبيقك لاحقًا إلى GLFM. لن يتم نقل جميع مكالمات OpenGL إلى OpenGL ES بشكل مثالي، ولكن لتحقيق أقصى قدر من قابلية نقل OpenGL، استخدم OpenGL 3.2 Core Profile على سطح المكتب وOpenGL ES 2.0 على الهاتف المحمول.
لماذا تعتبر نقطة الدخول glfmMain()
وليست main()
؟
وإلا فلن يعمل على نظام iOS. لتهيئة بيئة Objective-C، يجب على الدالة main()
إنشاء تجمع إصدار تلقائي واستدعاء الدالة UIApplicationMain()
، والتي لا تُرجع أبدًا . على نظام التشغيل iOS، لا يستدعي GLFM glfmMain()
إلا بعد تهيئة UIApplicationDelegate
و UIViewController
.
لماذا يعتمد GLFM على الأحداث؟ لماذا تتولى GLFM إدارة الحلقة الرئيسية؟
وإلا فلن يعمل على نظام التشغيل iOS (انظر أعلاه) أو على HTML5، الذي يعتمد على الأحداث.