문제

나는 OpenGL ES (특히 iPhone의 경우)의 텍스처로 장면을 렌더링하기 위해 간단한 코드를 찾는 데 어려움을 겪고 있습니다. 다음을 알고 싶습니다.

  1. OpenGl ES의 장면을 텍스처로 어떻게 렌더링합니까?
  2. OpenGL ES에서 렌더링 대상이 될 수있는 텍스처를 만들려면 어떤 매개 변수를 사용해야합니까?
  3. 이 렌더링 된 텍스처를 다른 프리미티브에 적용하는 데 영향이 있습니까?
도움이 되었습니까?

해결책

이것이 내가하는 방식입니다.

텍스처 변수를 정의합니다 (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

이제 질감으로 원하는 것을 할 수 있습니다. 게시물 처리 (블러, 블룸, 그림자 등)를 수행하려면 가능합니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top