كيفية توليد ضوضاء بيرلين على iPhone
-
24-09-2019 - |
سؤال
أرغب في إنشاء ضجيج Perlin المتحركة على iPhone ، لذلك يمكنني في النهاية القيام بشيء مثل هذا: http://dl.dropbox.com/u/1977230/example.png
لقد نظرت ونظرت ، لكن لا يمكنني العثور على أي شيء مشابه أو طريقة لعرض ضوضاء بيرلين بالفعل.
قيل لي أن أنظر إلى OpenGL ES ، ولكن حتى البحث عن مثال على ضوضاء Perlin أو تأثير الحمم/البلازما لا يؤدي إلى أي شيء.
أود حقًا أن أقدر بعض المساعدة في هذا.
شكرا يا رفاق ، أندريه
المحلول
حسنا ، أول دراسة خوارزمية ضوضاء بيرلين نفسها. http://en.wikipedia.org/wiki/perlin_noise يبدو مجرد أفضل مكان للإقلاع.
بمجرد حصولك على بيانات RGBA لهذا التأثير الخاص بك ، يبدأ الشيء السيئ.
هناك خياران أساسا.
إنشاء فئة فرعية UIVIEW وتجاوز طريقة السحب: (CGRECT). يستخدم تحويل بيانات RGB إلى صورة نقطية في Cocoa Objective-C ++ بحكمة لإنشاء cgimage من بياناتك ورسم تلك الصورة إلى السياق الحالي في السحب.
CGContextDrawImage(UIGraphicsGetCurrentContext(), <#CGRect rect#>, <#CGImageRef image#>);
إذا كانت هذه صورة ثابتة ، فأنت بخير. إذا كان ذلك متحركًا ، فقد لا يكون هذا هو الحل الأفضل.
تعرف على OpenGL ES على iPhone. مثال OpenGL ES الخاص بـ iPhone SDK هو نقطة انطلاق ممتازة. دراسة رسم الخرائط الملمس. بمجرد أن تكون على دراية بـ Glteximage2D ، استخدم ذلك لتحميل صورتك.
يمكن تمديد المثال بسهولة مع ما يلي:
لها تعريف هذه:
GLuint spriteTexture; GLubyte *spriteData; // the perlin noise will be here size_t width, height;
ثم في طريقة init Esrenderer ، قم بإنشاء مساحة للملمس:
- (id) init { .... width = 512; // make sure the texture size is the power of 2 height = 512; glGenTextures(1, &spriteTexture); glBindTexture(GL_TEXTURE_2D, spriteTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData); //free(spriteData); // free this if not used any more glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY);
في حالة تحديث الضوضاء بشكل دوري ، قم بتحديث الملمس في طريقة العرض
- (void) render { ..... glBindTexture(GL_TEXTURE_2D, spriteTexture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);
آه ، أفتقد الفيديو القديم الجيد في أيام A000 $ :)
نصائح أخرى
لقد بدأت مشروع مفتوح المصدر على Github يمكنك استخدامه لتوليد ضوضاء Perlin. وهو يدعم كامل الأبعاد (X ، Y ، Z ، T) جيل بيرلين. ويتضمن أيضًا مشروعًا يحتوي على تطبيق Sandbox للعب بأفكار الملمس. http://czgarrett.com/code/2011/05/18/perlin-noise-generator-for-ios.html
الآن هناك وظيفة ضوضاء Perlin أخرى لـ GLSL Shader لا تتطلب قوام بحث: https://github.com/ashima/webgl-noise/tree/master/src. هذا يجب أن يعمل على أجهزة iPhone.