2010-08-02 28 views
10

Tôi là người mới và cố gắng hiển thị hình ảnh trên màn hình iPhone bằng cách sử dụng OpenGL ES. Tôi biết nó đơn giản hơn và dễ dàng hơn để làm điều đó với cocos2d nhưng bây giờ tôi đang cố gắng để mã trực tiếp trên OpenGL. Có cách nào đơn giản nhưng hiệu quả để tải và hiển thị các sprites trong OpenGL ES không. Những gì tôi đã tìm thấy cho đến bây giờ là phức tạp hơn nhiều. :(Cách tải và hiển thị hình ảnh trong OpenGL ES cho iphone

+0

Phiên bản OpenGL ES, 1 hoặc 2 nào? –

+0

Tôi đang sử dụng ES 1. – nomann

Trả lời

15

Dưới đây là một số mã để tải một png từ ABC: Cái.

UIImage* image = [UIImage imageNamed:@"PictureName.png"]; 
GLubyte* imageData = malloc(image.size.width * image.size.height * 4); 
CGContextRef imageContext = CGBitmapContextCreate(imageData, image.size.width, image.size.height, 8, image.size.width * 4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast); 
CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, image.size.width, image.size.height), image.CGImage); 
CGContextRelease(imageContext); 

Dưới đây là một số mã để tạo ra một kết cấu với dữ liệu hình ảnh

GLuint texture; 
glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.size.width, image.size.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

Và một ví dụ về làm thế nào để hiển thị điều này:

glBindTexture(GL_TEXTURE_2D, texture); 
glVertexPointer(2, GL_FLOAT, 0, vertices); 
glNormalPointer(GL_FLOAT, 0, normals); 
glTexCoordPointer(2, GL_FLOAT, 0, textureCoords); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4) 

Ở đây bạn cần tìm giá trị của đỉnh, normals và textureCoords phù hợp với bạn r nhu cầu.

Cập nhật 1

Hãy nhớ để thiết lập các trạng thái đúng như thế này:

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

Nếu bạn sử dụng glOrthof (Xem bên dưới) để thiết lập một chiếu 2D trong ứng dụng, bạn có thể sử dụng các giá trị :

GLfloat vertices[] = { 
    -1.0, 1.0, 
    1.0, 1.0, 
    -1.0, -1.0, 
    1.0, -1.0, }; 

GLfloat normals[] = { 
    0.0, 0.0, 1.0, 
    0.0, 0.0, 1.0, 
    0.0, 0.0, 1.0, 
    0.0, 0.0, 1.0 }; 

GLfloat textureCoords[] = { 
    0.0, 0.0, 
    1.0, 0.0, 
    0.0, 1.0, 
    1.0, 1.0 }; 

cập nhật 2

Đây là cách tôi ngồi chế độ chiếu khi sử dụng đoạn mã trên để render sprites:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrthof(-5.0, 5.0, -7.5, 7.5, -1, 1); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

Và đây là làm thế nào tôi thiết lập chức năng pha trộn của tôi. Điều này cho phép tính minh bạch trong các tệp png:

glEnable(GL_TEXTURE_2D); 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
+0

Thnx 4 ur tym Martin. Tôi chắc chắn sẽ thử điều đó. :) – nomann

+0

Luôn luôn tốt để bắt đầu với những điều cơ bản trước bất kỳ hình ảnh động ưa thích và như vậy ... Tôi cũng hoàn toàn mới cho đồ họa/iPhone thứ ... mẫu tốt. – DRapp

4

Tôi khuyên bạn nên xem ứng dụng ví dụ mẫu GLSprite của Apple. Đó chính xác là những gì ứng dụng này làm.

Nếu bạn muốn tải kết cấu được nén PVRTC, hãy xem ví dụ PVRTextureLoader của chúng. Tôi sử dụng mã từ điều này trong một số sample application Tôi đã viết cho lớp iPhone của mình.

Các vấn đề liên quan