2016-11-30 11 views
-1

FBOを別の深度バッファとステンシルバッファで作成しようとしています。 NVidia GPUは歴史的にサポートされているパックドデプス/ステンシルしかサポートしていません。 しかし、私はARB_texture_stencil8拡張モジュールを見つけて、FBOに対してどのように使用するのだろうかと思いました。 このコードglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT、GL_STENCIL_ATTACHMENT_EXT、GL_TEXTURE_2D、fboStencilTexture、0)でGLエラー1159を与える: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

"*このコードでは、エラー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の王様ではありません。 –

関連する問題