2

ここに私のテクスチャクラスがあります:

struct GPUAllocation {
    uint ID,VectorType,DataType,Width,Height,Format,IntFormat;
    //ID is the output from glGen* and Format is the format of the texture and IntFormat
    //is the Internal Format of this texture. (Width and height and too obvious)
    //DataType is like GL_FLOAT...
    bool isFinalized;
    GPUAllocation(uint vectorType,uint dataType,uint width,uint height);
    void SetSlot(int n);
    void Finalize();
    ~GPUAllocation();
};

このテクスチャから RAM にコピーするコード:

void memcpy(GPUAllocation src,void* dst) {
    glBindTexture(GL_TEXTURE_2D,src.ID); //ID is the output from glGen*
    glTexSubImage2D(GL_TEXTURE_2D,0,0,0,src.Width,src.Height,src.Format,src.DataType,dst);
}

この関数を実行するコードは次のとおりです。

GPUAllocation gpu_alloc(PCPU_Vector1,PCPU_Float,4096,4096); //I generate Format and IntFormat here.
//The generated format is correct because when I copied from GPU to CPU I didn't got any error
float *cpu_alloc=new float[4096*4096];
memcpy(gpu_alloc,cpu_alloc); //The error occurred here!

発生したエラーは1281.


編集: GPU から CPU にコピーし、次に CPU から GPU にコピーすると、そのエラーが発生することがわかりました。最初に GPU から CPU にコピーした場合、エラーは発生しませんでした。CPU から GPU にコピーする関数は次のとおりです。

void memcpy(void* src,GPUAllocation dst) {
    glBindTexture(GL_TEXTURE_2D,dst.ID);
    glGetTexImage(GL_TEXTURE_2D,0,dst.Format,dst.DataType,src);
}
4

1 に答える 1

4

glTexSubImage*関数は、からではなく、テクスチャにコピーします。glReadPixelsGLからクライアントメモリにテクスチャを読み取るために使用します。

また、最適化されたテクスチャ転送を視聴することを強くお勧めします

PS。もちろん、ErrはglReadPixelsテクスチャからではなく、フレームバッファからglGetTexImage読み取ります。テクスチャから読み取ります。

于 2012-12-02T15:55:38.153 に答える