2012-01-02 16 views
2

私は現在OpenGL ES for iPhoneを学んでおり、RGBピクセルデータの配列をどのようにしてスクリーンにblitするのかと思っていますが、私が見つけたすべてのチュートリアルでは、既存のイメージをテクスチャとそれを表示します。OpenGL ESを使用してピクセルデータを画面にブライトするにはどうすればよいですか?

ここで私はUIImageとUIImageViewを使用して、その後imagerefを作成することにより、コアグラフィックスを使用してそれを達成してきた方法は次のとおりです。

int screenWidth = (int)[[UIScreen mainScreen] bounds].size.width; 
int screenHeight = (int)[[UIScreen mainScreen] bounds].size.height; 

//Create blank image 
CGImageRef blankImageRef = [self createBlankImageRef]; 
CFDataRef m_DataRef; 
m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(blankImageRef)); 
UInt8* bufferData = CFDataGetBytePtr(m_DataRef); 


//Manipulate the image here 
for(int x=0; x < screenWidth-1; x++) 
{ 
    int y = x;//*2; 

    [self setPixel:bufferData width:screenWidth x:x y:y r:255 g:0 b:0]; 
} 


//Paint the image to the screen 
CGImageRef imageRef = blankImageRef; 
CGContextRef ctx; 
ctx = CGBitmapContextCreate(bufferData, 
          CGImageGetWidth(imageRef), 
          CGImageGetHeight(imageRef), 
          8, 
          CGImageGetBytesPerRow(imageRef), 
          CGImageGetColorSpace(imageRef), 
          kCGImageAlphaPremultipliedLast); 
screenImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage (ctx)]; 
CGContextRelease(ctx); 

[imageView setImage:screenImage]; 

free(bufferData); 

...

- (CGImageRef) createBlankImageRef 
{ 
CGFloat imageScale = (CGFloat)1.0; 
CGFloat width = [[UIScreen mainScreen] bounds].size.width; 
CGFloat height = [[UIScreen mainScreen] bounds].size.height; 

// Create a bitmap graphics context of the given size 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef context = CGBitmapContextCreate(NULL, width * imageScale, height * imageScale, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); 

// Draw ... 
CGContextSetRGBFillColor(context, (CGFloat)0.0, (CGFloat)0.0, (CGFloat)0.0, (CGFloat)1.0); 

// Get your image 
CGImageRef cgImage = CGBitmapContextCreateImage(context); 

CGColorSpaceRelease(colorSpace); 
CGContextRelease(context); 

return cgImage; 
} 

-(void)setPixel:(UInt8*)buffer width:(int)width x:(int)x y:(int)y r:(int)r g:(int)g b:(int)b 
{ 
buffer[x*4 + y*(width*4)] = r; 
buffer[x*4 + y*(width*4)+1] = g; 
buffer[x*4 + y*(width*4)+2] = b; 
buffer[x*4 + y*(width*4)+3] = 255; 
} 

すべてのアイデアは、私が使用してこれを実現できますかCore Graphicsの代わりにOpenGL ES(現在1.0を使用しています)?

+0

フルスクリーンクワッドを作成し、ピクセルデータをTexture2Dとして取り込み、照明なしで塗りつぶす小さなシェーダを作成します。 – rejj

答えて

2

glTexImage2D(http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml)またはglTexSubImage2D(http://www.opengl.org/sdk/)を使用してテクスチャを作成できます。 docs/man/xhtml/glTexSubImage2D.xml)。 glTexSubImage2Dは、主にリアルタイムでテクスチャを更新するためのものです。

RGBAテクスチャのために:あなたはES 1.xのを使用している場合

GLubyte texBuffer[4*texWidth*texHeight]; 
GLuint texName; 
glGenTextures(1, &texName) ; 
glBindTexture(GL_TEXTURE_2D, texName) ; 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, texBuffer); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

あなたもglDrawPixels(http://www.opengl.org/sdk/docs/man/xhtml/glDrawPixels.xml)を使用することができます。

+0

texBufferはGLuint形式であるか、それともGlubyteでなければなりませんか? – RSH1

+0

よく、あなたは 'GLuint texBuffer [texWidth * texHeight]'としてtexBufferを宣言することができます - 重要なことは、サイズが 'sizeof(GLubyte)* 4 * texWidth * texHeight'に等しいことです。 (この場合は4つのコンポーネント、つまりRGBAが必要であると仮定します。 'glTexImage2D'を呼び出す前にtexBufferを塗りつぶすときに違いがあります(バッファ内のピクセルを設定する前に1つのコンポーネントに4つのコンポーネントをパックする必要があります)。 glTexImage2D呼び出しを同じように保つことに注意してください。 –

関連する問題