Opengl es는 텍스처로 렌더링됩니다
-
06-07-2019 - |
문제
나는 OpenGL ES (특히 iPhone의 경우)의 텍스처로 장면을 렌더링하기 위해 간단한 코드를 찾는 데 어려움을 겪고 있습니다. 다음을 알고 싶습니다.
- OpenGl ES의 장면을 텍스처로 어떻게 렌더링합니까?
- OpenGL ES에서 렌더링 대상이 될 수있는 텍스처를 만들려면 어떤 매개 변수를 사용해야합니까?
- 이 렌더링 된 텍스처를 다른 프리미티브에 적용하는 데 영향이 있습니까?
해결책
이것이 내가하는 방식입니다.
텍스처 변수를 정의합니다 (Apple을 사용합니다. Texture2D
클래스이지만 원하는 경우 OpenGL 텍스처 ID를 사용할 수 있습니다) 및 프레임 버퍼 :
Texture2d * texture;
GLuint textureFrameBuffer;
그런 다음 어느 시점에서 텍스처, 프레임 버퍼를 만들고 렌더 버퍼를 부착합니다. 이것은 한 번만해야합니다.
texture = [[Texture2D alloc] initWithData:0
pixelFormat:kTexture2DPixelFormat_RGB888
pixelsWide:32
pixelsHigh:32
contentSize:CGSizeMake(width, height)];
// create framebuffer
glGenFramebuffersOES(1, &textureFrameBuffer);
glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer);
// attach renderbuffer
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture.name, 0);
// unbind frame buffer
glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);
질감에 렌더링하고 싶을 때마다 다음을 수행합니다.
glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer);
...
// GL commands
...
glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);
당신의 질문 3에 대해, 그것은 그게 다른 텍스처 인 것처럼 텍스처를 사용할 수 있습니다.
다른 팁
장면을 텍스처로 렌더링하려면 텍스처와 관련된 프레임 버퍼를 사용해야합니다. 다음은 단순화하기 위해 만든 방법입니다.
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);
}
프레임 버퍼와 텍스처를 쉽게 만들 수 있습니다.
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);
나중에 _frameBuffer를 사용하여 장면을 _Texture로 렌더링 할 수 있습니다.
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
이제 질감으로 원하는 것을 할 수 있습니다. 게시물 처리 (블러, 블룸, 그림자 등)를 수행하려면 가능합니다!
제휴하지 않습니다 StackOverflow