我想在 iPhone 上创建一个动画柏林噪音,所以我最终可以做这样的事情:http: //dl.dropbox.com/u/1977230/example.png
我看了又看,但找不到任何类似的东西或实际显示 Perlin Noise 的方法。
我被告知要查看 OpenGL ES,但即使搜索 Perlin 噪声或熔岩/等离子效果的示例也不会产生任何结果。
我真的很感激这方面的一些帮助。
谢谢大家, 安德烈
我想在 iPhone 上创建一个动画柏林噪音,所以我最终可以做这样的事情:http: //dl.dropbox.com/u/1977230/example.png
我看了又看,但找不到任何类似的东西或实际显示 Perlin Noise 的方法。
我被告知要查看 OpenGL ES,但即使搜索 Perlin 噪声或熔岩/等离子效果的示例也不会产生任何结果。
我真的很感激这方面的一些帮助。
谢谢大家, 安德烈
好吧,首先研究一下 Perlin Noise 算法本身。http://en.wikipedia.org/wiki/Perlin_noise看起来是起飞的最佳地点。
一旦你有了这个效果的 RGBA 数据,讨厌的事情就开始了。
基本上有两种选择。
创建一个 UIView 子类并覆盖 draw:(CGRect) 方法。明智地使用将 RGB 数据转换为 Objective-C++ Cocoa 中的位图从您的数据中创建一个 CGImage 并将该图像绘制到绘图中的当前上下文。
CGContextDrawImage(UIGraphicsGetCurrentContext(), <#CGRect rect#>, <#CGImageRef image#>);
如果这是静止图像,则可以。如果它是动画,这可能不是最好的解决方案。
熟悉 iPhone 上的 OpenGL ES。iPhone SDK 的 OpenGL ES 示例是一个很好的起点。研究纹理映射。一旦你熟悉了 glTexImage2D,就可以使用它来加载你的图像。
该示例可以使用以下内容轻松扩展:
有这些定义:
GLuint spriteTexture;
GLubyte *spriteData; // the perlin noise will be here
size_t width, height;
然后在 ESRenderer init 方法中为纹理创建空间:
- (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);
啊,我想念那个好老的视频是 000 美元天 :)
我在 Github 上启动了一个开源项目,您可以使用它来生成 Perlin 噪声。它支持完整的 4 维 (x,y,z,t) Perlin 生成。它还包括一个带有沙盒应用程序的项目,用于玩纹理创意。 http://czgarrett.com/code/2011/05/18/perlin-noise-generator-for-ios.html
现在有另一个用于 GLSL 着色器的 Perlin 噪声函数,不需要查找纹理:https ://github.com/ashima/webgl-noise/tree/master/src 。这应该适用于 iPhone。