2013-12-03 9 views
4

나는 즉석에서 밉맵을 생성 주위에 내 머리를 포장하고,이 코드로이 비트를 읽고 있어요 : http://www.g-truc.net/post-0256.htmlOpenGL을 glGeneratemipmap 및 프레임 버퍼

//Create the mipmapped texture 
glGenTextures(1, &ColorbufferName); 
glBindTexture(ColorbufferName); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 512, 0, GL_UNSIGNED_BYTE, NULL); 
glGenerateMipmap(GL_TEXTURE_2D); // /!\ Allocate the mipmaps /!\ 
... 
//Create the framebuffer object and attach the mipmapped texture 
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName); 
glFramebufferTexture2D(
GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ColorbufferName, 0); 
... 
//Commands to actually draw something 
render(); 
... 
//Generate the mipmaps of ColorbufferName 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, ColorbufferName); 
glGenerateMipmap(GL_TEXTURE_2D); 

내 질문 :

glGenerateMipmap 요구를하지 왜
  1. 텍스쳐에 렌더링 할 때 두 번 호출 할 수 있습니까?
  2. 모든 프레임처럼 이것을 호출해야합니까?

내가 예를 들어이 같은 OpenGL을로로드 한 후 내가 한 번만 호출 할 필요 확산 2D 텍스처 가져 오는 경우 :

GLCALL(glGenTextures(1, &mTexture)); 
    GLCALL(glBindTexture(GL_TEXTURE_2D, mTexture)); 

    GLint format = (colorFormat == ColorFormat::COLOR_FORMAT_RGB ? GL_RGB : colorFormat == ColorFormat::COLOR_FORMAT_RGBA ? GL_RGBA : GL_RED); 
    GLCALL(glTexImage2D(GL_TEXTURE_2D, 0, format, textureWidth, textureHeight, 0, format, GL_UNSIGNED_BYTE, &textureData[0])); 

    GLCALL(glGenerateMipmap(GL_TEXTURE_2D)); 
    GLCALL(glBindTexture(GL_TEXTURE_2D, 0)); 

을 나는 텍스처는 모든 프레임을 다시 그려되어 있기 때문에 의심을하고 밉맵 생성은 그 과정에서 내용을 사용하지만 이것에 대한 확인을 원합니다.

3 - 또한 내 FBuffer로 렌더링 한 다음 즉시 glBlitFramebuffer을 기본 FBO로 바인딩하면 바인드해야합니까? glGenerateMipmap 이렇게하면 되나요?

GLCALL(glBindTexture(GL_TEXTURE_2D, mGBufferTextures[GBuffer::GBUFFER_TEXTURE_DIFFUSE])); 
GLCALL(glGenerateMipmap(GL_TEXTURE_2D)); 
GLCALL(glReadBuffer(GL_COLOR_ATTACHMENT0 + GBuffer::GBUFFER_TEXTURE_DIFFUSE)); 
GLCALL(glBlitFramebuffer(0, 0, mWindowWidth, mWindowHeight, 0, 0, mWindowWidth, mWindowHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR)); 

답변

7
  1. 으로는 "[glGenerateMipmap] 실제로 어쩌면 유일한 문제가 두 가지 작업을 수행합니다. : 그것은 밉맵 메모리를 할당하고 밉맵을 생성", 당신이 링크 게시물에 설명

    첫 번째 glGenerateMipmap 호출 앞에 오는 것은 NULL 데이터 포인터가있는 glTexImage2D 호출입니다. 이 두 호출을 결합하면 텍스처의 모든 레벨에 메모리가 할당됩니다. 이 시점에서 포함 된 데이터는 가비지입니다.

    텍스처의 첫 번째 레벨로 이미지를로드 한 후에는 glGenerateMipmap에 다시 호출하여 더 작은 레벨을 실제로 다운 샘플링 된 이미지로 채워야합니다.

  2. 텍스처의 첫 번째 레벨로 렌더링 된 이미지가 렌더링 될 때마다 모든 프레임이 변경되기 때문에 glGenerateMipmap이 모든 프레임에서 호출됩니다. 함수를 호출하지 않으면 더 작은 밉맵이 수정되지 않습니다 (그러한 텍스처를 매핑하는 경우 멀리 떨어져있을 때 초기화되지 않은 작은 밉맵 수준이 표시됨).

  3. No. 밉맵을 사용하는 텍스처 필터링 모드로 텍스처를 삼각형으로 매핑하려는 경우에만 밉맵이 필요합니다. 텍스처의 첫 번째 레벨 만 다루는 경우에는 밉맵을 생성 할 필요가 없습니다. 실제로 텍스처를 매핑하지 않으면 프레임 버퍼의 텍스처 대신 렌더 버퍼를 사용할 수 있습니다.