2010-04-06 143 views
4

我想創建一個iPhone上的動畫Perlin雜,所以我最終可以做這樣的事情:http://dl.dropbox.com/u/1977230/example.png如何生成柏林噪聲在iPhone

我看了又看,卻找不到任何東西類似或實際顯示佩林噪聲的方法。

我被告知要查看OpenGL ES,但即使搜索Perlin噪聲或熔岩/等離子體效應的示例也不會導致任何結果。

我真的很感謝這一個幫助。

謝謝你們, 安德烈

回答

10

嗯,首先研究柏林噪聲算法本身。 http://en.wikipedia.org/wiki/Perlin_noise看起來只是最好的起飛地點。

一旦你得到了你的這種效果的RGBA數據,這個討厭的事情就開始了。

基本上有兩種選擇。

  • 創建一個UIView子類並重寫繪製:(CGRect)方法。明智地使用Converting RGB data into a bitmap in 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); 
    

啊,我錯過了良好的舊視頻是$ A000天:)

+0

我明白了。感謝那。 我仍然無法相信Objective-C/OpenGL ES中沒有Perlin Noise的版本...... – Andre 2010-04-07 10:31:30

+1

c函數和C++類可以在objc中使用。 – f3r3nc 2010-04-07 10:58:42