Tôi cần phải viết trình kết xuất đồ họa 2 chiều OpenGL ES trên iOS. Nó sẽ vẽ một số nguyên thủy như đường thẳng và đa giác thành hình ảnh 2d (nó sẽ hiển thị bản đồ vectơ). Cách nào là tốt nhất để nhận hình ảnh từ ngữ cảnh OpenGL trong tác vụ đó? Ý tôi là, tôi có nên đưa những nguyên thủy này vào kết cấu và sau đó lấy hình ảnh từ nó hay không? Ngoài ra, nó sẽ là tuyệt vời nếu ai đó cung cấp cho các ví dụ hoặc hướng dẫn mà trông giống như những gì tôi cần (2d GL rendering vào hình ảnh). Cảm ơn trước!Hiển thị OpenGL ES 2d thành hình ảnh
Trả lời
Nếu bạn cần hiển thị cảnh OpenGL ES 2-D, sau đó trích xuất hình ảnh của cảnh đó để sử dụng bên ngoài OpenGL ES, bạn có hai tùy chọn chính.
Đầu tiên là chỉ đơn giản là làm cho khung cảnh của bạn và sử dụng glReadPixels()
để lấy dữ liệu RGBA cho cảnh và đặt nó vào một mảng byte, như trong những điều sau đây:
GLubyte *rawImagePixels = (GLubyte *)malloc(totalBytesForImage);
glReadPixels(0, 0, (int)currentFBOSize.width, (int)currentFBOSize.height, GL_RGBA, GL_UNSIGNED_BYTE, rawImagePixels);
// Do something with the image
free(rawImagePixels);
Thứ hai, và nhanh hơn nhiều, cách làm điều này là hiển thị cảnh của bạn thành đối tượng framebuffer được hỗ trợ kết cấu (FBO), nơi kết cấu đã được cung cấp bởi bộ đệm kết cấu iOS 5.0. Tôi mô tả cách tiếp cận này trong this answer, mặc dù tôi không hiển thị mã để truy cập dữ liệu thô ở đó.
Bạn làm như sau để thiết lập bộ nhớ cache kết cấu và ràng buộc kết cấu FBO:
CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, (__bridge void *)[[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context], NULL, &rawDataTextureCache);
if (err)
{
NSAssert(NO, @"Error at CVOpenGLESTextureCacheCreate %d");
}
// Code originally sourced from http://allmybrain.com/2011/12/08/rendering-to-a-texture-with-ios-5-texture-cache-api/
CFDictionaryRef empty; // empty value for attr value.
CFMutableDictionaryRef attrs;
empty = CFDictionaryCreate(kCFAllocatorDefault, // our empty IOSurface properties dictionary
NULL,
NULL,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
attrs = CFDictionaryCreateMutable(kCFAllocatorDefault,
1,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(attrs,
kCVPixelBufferIOSurfacePropertiesKey,
empty);
//CVPixelBufferPoolCreatePixelBuffer (NULL, [assetWriterPixelBufferInput pixelBufferPool], &renderTarget);
CVPixelBufferCreate(kCFAllocatorDefault,
(int)imageSize.width,
(int)imageSize.height,
kCVPixelFormatType_32BGRA,
attrs,
&renderTarget);
CVOpenGLESTextureRef renderTexture;
CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault,
rawDataTextureCache, renderTarget,
NULL, // texture attributes
GL_TEXTURE_2D,
GL_RGBA, // opengl format
(int)imageSize.width,
(int)imageSize.height,
GL_BGRA, // native iOS format
GL_UNSIGNED_BYTE,
0,
&renderTexture);
CFRelease(attrs);
CFRelease(empty);
glBindTexture(CVOpenGLESTextureGetTarget(renderTexture), CVOpenGLESTextureGetName(renderTexture));
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, CVOpenGLESTextureGetName(renderTexture), 0);
và sau đó bạn chỉ có thể đọc trực tiếp từ các byte mà sao kết cấu này (ở định dạng BGRA, không phải là RGBA của glReadPixels()
) sử dụng một cái gì đó như:
CVPixelBufferLockBaseAddress(renderTarget, 0);
_rawBytesForImage = (GLubyte *)CVPixelBufferGetBaseAddress(renderTarget);
// Do something with the bytes
CVPixelBufferUnlockBaseAddress(renderTarget, 0);
Tuy nhiên, nếu bạn chỉ muốn sử dụng lại hình ảnh của bạn trong OpenGL ES, bạn chỉ cần để render cảnh của bạn đến một FBO texture hậu thuẫn và sau đó sử dụng kết cấu mà ở mức thứ hai của bạn dựng hình.
Tôi hiển thị ví dụ về hiển thị kết cấu và sau đó thực hiện một số xử lý trên mẫu, trong ứng dụng mẫu CubeExample trong khuôn khổ mã nguồn mở GPUImage của tôi, nếu bạn muốn thấy điều này hoạt động.
- 1. OpenGL ES Shader để phác thảo hình ảnh 2D
- 2. Làm cho OpenGL ES 2.0 thành hình ảnh
- 3. Cách tải và hiển thị hình ảnh trong OpenGL ES cho iphone
- 4. Cách viết lại ứng dụng OpenGL 2D cho OpenGL ES?
- 5. Hiển thị OpenGL ES theo yêu cầu sử dụng GLKit
- 6. Kết hợp các khối hoạt ảnh UIView và hiển thị OpenGL ES
- 7. Hình ảnh và mặt nạ trong OpenGL ES 2.0
- 8. Cách chia nhỏ hình ảnh 2d thành hình tam giác sử dụng OpenGL
- 9. OpenGL: Hiển thị nhanh trên màn hình
- 10. iPhone OpenGL ES - Cách chọn
- 11. Cách hiển thị bàn phím iPhone/iPad trên toàn màn hình Ứng dụng OpenGL ES
- 12. OpenGL ES Render to Texture
- 13. Chuyển đổi hình ảnh 2d thành mô hình 3d
- 14. Vẽ hình cầu trong OpenGL ES
- 15. Android OpenGL ES 2, Vẽ hình vuông
- 16. Hiển thị video với openGL
- 17. Polygon tam giác thành dải tam giác cho OpenGL ES
- 18. Các vấn đề về Máy ảnh OpenGL ES 2.0
- 19. Chọn OpenGL ES 1.1 hoặc OpenGL ES 2.0?
- 20. khác biệt trong iOS OpenGL ES và Android OpenGL ES
- 21. OpenGL es 2.0 Đọc bộ đệm sâu
- 22. Hiển thị hình ảnh WPF thành tệp WMF/EMF
- 23. OpenGL ES có thể hiển thị kết cấu của kích thước không cơ sở 2 không?
- 24. OpenGL ES 2.0 tương đương với glOrtho()?
- 25. Thiết bị Retina iOS không hiển thị hình ảnh @ 2X, nó hiển thị hình ảnh 1X
- 26. Kết cấu toàn màn hình iPhone OpenGL ES
- 27. OpenGL ES cho Iphone
- 28. OpenGL-ES và Cg
- 29. D3: Hiển thị hình ảnh thang độ xám được điều khiển bởi dữ liệu mảng 2D
- 30. Hiển thị hình ảnh từ một loạt hình ảnh - Javascript
cảm ơn rất nhiều, nhưng tính năng này chỉ hoạt động với iOS 5? – medvedNick
@medvedNick - 'glReadPixels()' hoạt động trên tất cả các phiên bản hệ điều hành, nhưng bộ đệm kết cấu chỉ được giới thiệu lần đầu tiên trong iOS 5.0. Chúng nhanh hơn rất nhiều, nhưng chỉ có 5.0. Tuy nhiên, bạn có thể thực hiện kiểm tra thời gian chạy và quay lại 'glReadPixels()' chậm hơn trên các phiên bản hệ điều hành cũ hơn. Một lần nữa, kiểm tra mã GPUImage của tôi, bởi vì tôi làm điều này trong đó. –
Bộ nhớ cache kết cấu là 5.0 trở lên, nhưng chúng không chỉ nhanh trên các thiết bị nhất định? ví dụ. Nhanh trên 4S/iPad2 và tương đương với glReadPixels/glTexImage2D ở mọi nơi khác –