Để hiển thị cảnh thành kết cấu, bạn phải sử dụng bộ đệm khung được liên kết với họa tiết. Dưới đây là một phương pháp mà tôi tạo ra để đơn giản hóa nó:
void glGenTextureFromFramebuffer(GLuint *t, GLuint *f, GLsizei w, GLsizei h)
{
glGenFramebuffers(1, f);
glGenTextures(1, t);
glBindFramebuffer(GL_FRAMEBUFFER, *f);
glBindTexture(GL_TEXTURE_2D, *t);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *t, 0);
GLuint depthbuffer;
glGenRenderbuffers(1, &depthbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, w, h);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthbuffer);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE)
NSLog(@"Framebuffer status: %x", (int)status);
}
Bạn có thể tạo bộ đệm khung và kết cấu một cách dễ dàng:
GLuint _texture, _framebuffer;
GLsizei w,h;
float scale = [UIScreen mainScreen].scale;
w = self.view.bounds.size.width * scale;
h = self.view.bounds.size.height * scale;
glGenTextureFromFramebuffer(&_texture, &_framebuffer, w, h);
Bạn sau đó có thể sử dụng _framebuffer để render cảnh vào _texture trong bốc thăm của bạn phương pháp:
glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
//draw here the content you want in the texture
//_texture is now a texture with the drawn content
//bind the base framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, 0);
//or if you use GLKit
[view bindDrawable];
//draw normaly
Bây giờ bạn có thể làm những gì bạn muốn với kết cấu. Nếu bạn muốn làm một số xử lý bài (mờ, nở, bóng, vv ...) bạn có thể!
Marco, bạn có biết bao nhiêu chi phí liên quan đến việc giữ bộ đệm khung và biểu tượng kết xuất cho mỗi kết cấu bạn cần hiển thị không? Tôi có một số kết cấu lớn mà ứng dụng của tôi cần phải đưa vào và tôi sắp xếp các kết cấu khác nhau vào một bộ đệm khung "phụ" duy nhất bằng cách sử dụng glFramebufferTexture2DOES. Sẽ giữ một framebuffer riêng biệt cho mỗi được tốt hơn? –
Bạn có thể chỉnh sửa mã của mình để initWithData: ... cuộc gọi vừa khớp mà không cần cuộn? – nornagon
Ok, đã chỉnh sửa, trông đẹp hơn ngay bây giờ. –