2011-08-03 20 views
0

最近OpenGLで始まって、私は画面とフレームバッファに背景イメージを描くことができました。すべて正常に動作します。新しいテクスチャを作成してフレームバッファに追加すると問題が発生します。OpenGL iphoneのタッチでテクスチャを描く

{

[EAGLContext setCurrentContext:context]; 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
glViewport(0, 0, backingWidth, backingHeight); 
    // Clear screen 
glClear(GL_COLOR_BUFFER_BIT); 

// Render player ship 

    [playerShip drawAtPoint:CGPointMake(160, 240)]; 
// glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
// [context presentRenderbuffer:GL_RENDERBUFFER_OES]; 
} 

Iは

// glBindRenderbufferOES(GL_RENDERBUFFER_OES、viewRenderbuffer)を上記の二つの行のコメントを解除した場合。

// [コンテキストpresentRenderbuffer:GL_RENDERBUFFER_OES];

は、私は以下のコードを描画しています新しいテクスチャを取得いけない:

NSInteger myDataLength = 20 * 20 * 4。 GLubyte * buffer =(GLubyte *)malloc(myDataLength); glReadPixels(location.x-10、location.y-10,20,20、GL_RGBA、GL_UNSIGNED_BYTE、buffer);

// gl renders "upside down" so swap top to bottom into new array. 
// there's gotta be a better way, but this works. 
GLubyte *buffer2 = (GLubyte *) malloc(myDataLength); 
for(int y = 0; y < 20; y++) 
{ 
    for(int x = 0; x < 20 * 4; x++) 
    { 
     buffer2[(19 - y) * 20 * 4 + x] = buffer[y * 4 * 20 + x]; 
    } 
} 

// make data provider with data. 
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer2, myDataLength, NULL); 

// prep the ingredients 
int bitsPerComponent = 8; 
int bitsPerPixel = 32; 
int bytesPerRow = 4 * 20; 
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); 
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; 
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; 

// make the cgimage 
CGImageRef imageRef = CGImageCreate(20, 20, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent); 

// then make the uiimage from that 
UIImage *myImage = [UIImage imageWithCGImage:imageRef]; 
Texture2D *texture = [[Texture2D alloc] initWithImage:myImage]; 
UIImageWriteToSavedPhotosAlbum(myImage, self, nil, nil); 

    glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glLoadIdentity(); 
[texture drawAtPoint:location]; 
glPopMatrix(); 

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

glPushMatrix(); 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
[context presentRenderbuffer:GL_RENDERBUFFER_OES]; 

私はミスをやっているところを知りません。私はこれに新しいです。

答えて

0

コード内に背景テクスチャをレンダリングしてから、その上に宇宙船を描画すると、宇宙船が奥行きバッファテストに失敗することがあります。

あなたがしたことがあります:

にglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BITを)。

zバッファをクリアしてから、宇宙船をレンダリングするには?

+0

私はOpenGLを初めて使っているので、あなたが話していることを詳しく述べてください。私はどのように進めるべきですか?私がやったことは、進める正しい方法ですか? PhotoBoothのように画像のワープを試しています。 – DivineDesert

+0

@Dimple OpenGLには、3Dシーンを描画するときに可視性を検出するためのオプションのデプスバッファが付属しています(フォアグラウンドオブジェクトのz値が背景オブジェクトよりも小さいため、 2Dテクスチャを写真のようにレンダリングするだけで、Zバッファは生産性が低下し、最終的に新しいテクスチャがレンダリングされないようにすることができます(デプスバッファーの戦い)。 zバッファを無効にすると、ここで役立ちます。しかし、それがあなたの問題かどうかはわかりません。おそらくより完全な例を投稿すると助けになるかもしれません。 – KPK

関連する問題