2

キューブマップのレンダリングターゲットクラスを作成しています。私はすでに正常に動作する2Dを持っています。しかし、このキューブマップレンダリングターゲットクラスでは、必要に応じて特定の面にレンダリングできるようにしたいと思います。「X+」面に円をレンダリングしたいのですが、「Y+」面に三角形をレンダリングしたいのかもしれません。

これは私のクラスがどのように見えるかです

class CRenderTarget 
{
private:
    //frame buffer to render on
    unsigned  m_uifboHandle;

    //depth stencil 
    unsigned  m_uiDepthStencilHandle;

    //the texture we will render on
    unsigned  m_uiTextureHandle;

public:
    CCubeRenderTarget( void );

    ~CCubeRenderTarget( void );

    void Create( unsigned uiHeightWidth = 512,
             int iInternalFormat = 0x1908 ); //GL_RGBA

    void Bind( void );

    void UnBind( void );
}

これは私の作成関数がどのように見えるかです

void Create( unsigned uiHeightWidth, int iInternalFormat )
{
        //generate our variables
    glGenFramebuffers(1, &m_uifboHandle);
    glGenRenderbuffers(1, &m_uiDepthStencilHandle);
    glGenTextures(1, &m_uiTextureHandle);

    // Initialize FBO
    glBindFramebuffer( GL_FRAMEBUFFER, m_uifboHandle);

    glBindTexture( GL_TEXTURE_CUBE_MAP, m_uiTextureHandle);

    // Pre-allocate the correct sized cube map
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, iInternalFormat, uiHeightWidth, uiHeightWidth, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
    glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, iInternalFormat, uiHeightWidth, uiHeightWidth, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, iInternalFormat, uiHeightWidth, uiHeightWidth, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
    glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, iInternalFormat, uiHeightWidth, uiHeightWidth, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, iInternalFormat, uiHeightWidth, uiHeightWidth, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
    glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, iInternalFormat, uiHeightWidth, uiHeightWidth, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);

    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

    // Must attach texture to framebuffer. Has Stencil and depth
    glBindRenderbuffer(GL_RENDERBUFFER, m_uiDepthStencilHandle);
    glRenderbufferStorage(GL_RENDERBUFFER, /*GL_DEPTH_STENCIL*/GL_DEPTH24_STENCIL8, uiHeightWidth, uiHeightWidth );
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_uiDepthStencilHandle);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_uiDepthStencilHandle);

    glBindFramebuffer(GL_FRAMEBUFFER, 0);
}

これは私のバインド関数がどのように見えるかです

void Bind( void )
{
    glBindFramebuffer( GL_FRAMEBUFFER, m_uifboHandle );
}

//これは私のバインド解除関数がどのように見えるかです

void Unbind( void )
{
    glBindFramebuffer( GL_FRAMEBUFFER, 0 );
}

私はこの1週間、たくさんの調査を行いました。キューブマップ全体をバインドする代わりに、キューブマップの1つの面だけをバインドする方法を見つけることができないようです。これが私の全体的な目標です。DirectXでは、6つの面を取得して手動で処理するだけでよいことは知っていますが、openGLキューブマップで各面を手動で処理するにはどうすればよいですか?

4

1 に答える 1

5

フレームバッファをバインドしたら、ターゲットにするテクスチャのレベルを指定する必要があります。次のようになります。

glBindFramebuffer( GL_FRAMEBUFFER, m_uifboHandle );
glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, m_uiTextureHandle, 0);
于 2013-01-15T13:40:10.767 に答える