2012-09-11 2 views
7

Ich versuche, die Apple Sample GLCameraRipple Code mit Bild als Hintergrund zu schreiben. Eigentlich versuche ich, mit diesem Code einen Welleneffekt auf dem Wasserbild zu erzeugen, aber der Code funktioniert für die Kamera, stattdessen möchte ich einfach ein einfaches Wasserbild als Hintergrund anstelle der Kamera verwenden. Jede Richtung oder jeder Beispielcode wird eine große Hilfe sein. Danke im Voraus.Wie kann ich das GLCameraRipple-Sample mit Image als Hintergrund umschreiben?

Antwort

9

Die Art und Weise, wie der Kamera-Rippling-Effekt funktioniert, verformt Texturkoordinaten auf einem Raster aus Dreiecken - so ist die gute Nachricht, dass der gewünschte Effekt ganz von der Videotextur getrennt ist; Ihre Textur ist zufällig ein Video. Um zu erreichen, was Sie wollen, müssen Sie nur den Videocode der Kamera entfernen und Ihre eigene Textur binden.

So in viewDidLoad, würden Sie [self setupAVCapture] Kommentar aus, und gehen Sie vor und kommentieren beide Textur Uniformen in SetupGL heraus, da Sie nur eine verwenden werden (die beiden Linien sind glUniform1i(uniforms[UNIFORM_Y], 0);, glUniform1i(uniforms[UNIFORM_UV], 1);) und dann & erstellen binden Ihre eigene Textur.

GLKit ist der schnellste Weg, um so etwas zu erreichen. GLKit blendet eine Menge der OpenGL-Funktionsaufrufe von Ihnen aus, ist aber sehr schnell & wirksam.

Jetzt haben Sie einige wichtige Einstellungen verloren, die in setupAVCapture enthalten waren. legt es so in nach dem obigen Code in viewDidLoad:

if (_ripple == nil || 
    texture.width != _textureWidth || 
    texture.height != _textureHeight) 
{ 
    _textureWidth = texture.width; 
    _textureHeight = texture.height; 

    _ripple = [[RippleModel alloc] initWithScreenWidth:_screenWidth 
              screenHeight:_screenHeight 
              meshFactor:_meshFactor 
              touchRadius:5 
              textureWidth:_textureWidth 
             textureHeight:_textureHeight]; 

    [self setupBuffers]; 
} 

Und zuletzt, werden Sie die Fragment-Shader ein wenig ändern.

Shader.fsh Aufmachen und die Hauptfunktion dieses ändern:

void main() 
{ 
    gl_FragColor = texture2D(SamplerY, texCoordVarying); 
} 

Wie dem auch sei, das sollte es tun. Es macht einfach Spaß, mit dem RippleModel & zu experimentieren, um zu sehen, was für verrückte Effekte man machen kann.

+2

Große Antwort jankins, das funktioniert wie ein Charme! Diese Antwort sollte als akzeptiert markiert werden. –

+1

Danke Jankins, das sollte als akzeptiert markiert werden – Andrea

+0

Sehr unvollständige Antwort – rraallvv

Verwandte Themen