2016-11-30 4 views
-1

FBO에 별도의 깊이 버퍼와 스텐실 버퍼가 있어야합니다. NVidia GPU는 역사적으로 오직 압축 깊이/스텐실 만 지원합니다. 그러나 ARB_texture_stencil8 확장을 발견하고 FBO에 대해 사용하는 방법을 궁금해합니다. 이 코드는 glFramebufferTexture2DEXT에 GL 오류 1159를 제공합니다 (GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, fboStencilTexture, 0) :스텐실과 FBO (NVidia)를 분리하십시오.

static GLuint fboId, rboDepth, rboStencil, TEXTURE_WIDTH, TEXTURE_HEIGHT; 
    if (!fboColorTexture) { 
     fboDepthTexture = fboId = rboDepth = rboStencil = TEXTURE_WIDTH = TEXTURE_HEIGHT = 0; // vid restart? 
     glGenTextures(1, &fboColorTexture); 
     glBindTexture(GL_TEXTURE_2D, fboColorTexture); 
     qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
     qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
     qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    } 
    if (!fboDepthTexture) { 
     glGenTextures(1, &fboDepthTexture); 
     glBindTexture(GL_TEXTURE_2D, fboDepthTexture); 
     qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
     qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
     qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    } 
    if (!fboStencilTexture) { 
     glGenTextures(1, &fboStencilTexture); 
     glBindTexture(GL_TEXTURE_2D, fboStencilTexture); 
     qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
     qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
     qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     qglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    } 
    GLuint curWidth = r_virtualResolution.GetFloat() * glConfig.vidWidth, curHeight = r_virtualResolution.GetFloat() * glConfig.vidHeight; 
    if (curWidth != TEXTURE_WIDTH || curHeight != TEXTURE_HEIGHT) { 
     TEXTURE_WIDTH = curWidth; 
     TEXTURE_HEIGHT = curHeight; 
     glBindTexture(GL_TEXTURE_2D, fboColorTexture); 
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5_A1, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); //NULL means reserve texture memory, but texels are undefined 
     glBindTexture(GL_TEXTURE_2D, fboDepthTexture); 
     glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); 
     glBindTexture(GL_TEXTURE_2D, fboStencilTexture); 
     glTexImage2D(GL_TEXTURE_2D, 0, GL_STENCIL_INDEX8, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0, GL_STENCIL_INDEX, GL_FLOAT, 0); 
    } 
    //------------------------- 
    if (!fboId) { 
     // create a framebuffer object, you need to delete them when program exits. 
     glGenFramebuffersEXT(1, &fboId); 
     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId); 
     // attach a texture to FBO color attachement point 
     glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, fboColorTexture, 0); 
     // attach a renderbuffer to depth attachment point 
     glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, fboDepthTexture, 0); 
     glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, fboStencilTexture, 0); 
     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 
    } 
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId); 
+0

"*이 코드는 gl 오류 1159를 발생시킵니다. *"오류 코드는 없습니다. 16 진수 또는 10 진수 중 하나입니다. 사실 OpenGL의 모든 가치에 열거가 없습니다. –

+0

어쩌면 내 코드를 사용해보고 오류가 발생했는지 확인할 수 있습니까? –

+0

코드를 시도하려면 [mcve] 여야하며 그렇지 않습니다. 그것은 단지 코드 조각입니다. –

답변

1

ARB_texture_stencil8의 목적은 당신이 텍스처으로 스텐실 전용 형식을 사용할 수 있도록하는 것입니다. 즉, 셰이더에서 읽는 것입니다.

이것은 스텐실 버퍼와 깊이 버퍼를 분리 할 수있는 것은 아닙니다. 스텐실 -8 텍스처 뒤에있는 아이디어는 깊이/스텐실 텍스처의 스텐실 부분을 복사하여 데이터를 생성하거나 없이 깊이 버퍼를 완전히 렌더링한다는 것입니다.

따라서이 확장 프로그램을 사용하면 별도의 깊이 및 스텐실 이미지로 렌더링 할 수 있습니다. 여전히 하드웨어 의존적입니다.

또한 ARB_texture_stencil8과 같은 새로운 기능을 사용하려는 경우 이전 EXT_framebuffer_object API와 결합해서는 안됩니다. 따라서 glFramebufferTexture2DEXT을 사용 중지하고 glFramebufferTexture을 사용하십시오.

+0

글쎄 glFramebufferTexture는 glFramebufferTexture2DEXT와 다르게 처리하지 않기 때문에 실제로 전환 할 인센티브가 없습니다. 실제로 NVidia는 별도의 스텐실 버퍼와 같은 간단한 작업을 수행하지 않습니다. –

+0

@AntonDuzenko : "* NVidia는 별개의 스텐실 버퍼와 같은 간단한 작업을 수행하지 않을 것입니다. *"당신이 "단순하다"고 생각하는 이유는 무엇입니까? 실제로 Vulkan은 별도의 깊이/스텐실 * 가능성을 허용하지 않습니다. 왜? * 아무도 * 지원하지 않기 때문입니다. 따라서 저수준 그래픽 API는 옵션을 제공하지 않습니다. –

+0

Intel이 지원하며 3D 왕이 아닙니다. –