4

他のテクスチャを読み込んでその一部を書き込むことができる空白 (アルファなしの白) テクスチャを作成しようとしています。テクスチャの一部を取得するだけで、glTexSubImage2D を使用してそこに配置しようとしましたが、正しく機能していないようです。誰でもこれを行う方法を知っていますか? 私は何を間違っていますか?

int sourceTextWidth;
int sourceTextHeight;
int sourceFormat;
int formatOffset = 0;

//bind the texture
glBindTexture( GL_TEXTURE_2D, textureID );

//get its params
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_COMPONENTS, &sourceFormat);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &sourceTextWidth);
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &sourceTextHeight);
switch (sourceFormat)
{
    case GL_RGB:
    {
        formatOffset = 3;
    }
    break;
    case GL_RGBA:
    {
        formatOffset = 4;
    }
    break;
}
if (formatOffset == 0)
{
    return false;
}


unsigned char * sourceData = (unsigned char *)malloc(sourceTextWidth * sourceTextHeight * formatOffset);

glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, sourceData);

glBindTexture( GL_TEXTURE_2D, m_currentTextureId );

unsigned char * destData = (unsigned char *)malloc(width * height * 3);



glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, sourceData);

for (int i = 0; i < height; ++i)
{       
memcpy(&destData[(i * width * 3) ], &sourceData[((i + y) * sourceTextWidth * 3) + (x * 3)], width * 3);
}
//glDeleteTextures (1, m_currentTextureId);
glBindTexture( GL_TEXTURE_2D, m_currentTextureId );

glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGB,GL_UNSIGNED_BYTE, destData );
free(destData);
free(sourceData);
4

1 に答える 1

6

OpenGL 4.3 または ARB_copy_image 拡張機能(またはその古いいとこである NV_copy_image) にアクセスできる場合は、glCopyImageSubData .

それ以外の場合は、FBO ブリッティングを使用できます。ソース テクスチャをFBOにアタッチし、デスティネーション テクスチャを FBO にアタッチし (同じものである可能性がありますが、そうであれば、明らかに同じアタッチ ポイントではありません)、読み込みバッファを設定し、FBO が FBO から読み込むバッファ描画します。ソースのアタッチメントと描画先のアタッチメントに描画し、1 つのフレームバッファーから別のフレームバッファーにブリットします。

ところで、新しいテクスチャにストレージを割り当てていないため、実行しようとしているトリックは機能しません。そのイメージのストレージが割り当てられていない限り、テクスチャ内のイメージに対してglTexSubImage 呼び出すことはできません。これは、または他の多くの関数の 1 つを呼び出すことによって行うことができます。「サブイメージ」関数はすべて、新しいストレージを作成するためではなく、既存のストレージにアップロードするためのものです。glTexImage

于 2013-07-16T18:39:45.480 に答える