0

一部のデータを opengl テクスチャに読み込もうとするとエラーが発生します。私のエラーは次のとおりです。

A first chance exception of type 'System.AccessViolationException' occurred in libCoin3D.dll

以下の関数で関数 glTexImage3D を呼び出すと発生します。その関数をコメント アウトすると、プログラムは正常に実行されますが、関数に渡す int 配列からテクスチャを作成する必要があります。

GLuint TextureHandler::create3DTextureBonePreview(int* d, Vector3 length){
    GLuint bindLocation;
    glGenTextures(1, &bindLocation);


    static_cast<char*>(static_cast<void*>(d));

    int w=length.x;
    int h=length.y;
    int l=length.z;
    glBindTexture(GL_TEXTURE_3D, bindLocation);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);


    glTexImage3D(GL_TEXTURE_3D, 0,GL_RGBA,w, h, l, 0,GL_RGBA, GL_UNSIGNED_BYTE,d);
    printf("Done creating texture\n");

    return bindLocation;
}

int* d でメモリを処理する方法に関係していると思います。このデータは、一部の C# コードでは通常の int 配列として開始され、その後すぐに入力されます。

 int[] allDatint=new int[dataSize];

しかし、この C# から、allDatint は、それをシステム配列として受け取る Managed C++ コンストラクターに渡されます。

CallbackNode::CallbackNode(int w ,int h, int l, array<int>^ d)

そのコンストラクターでは、一部のアンマネージ C++ コードに渡される前に int* に変換されます。

cli::pin_ptr<int> pArrayElement = &d[0];
mCube=new MasterCube(w,h,l,pArrayElement);

アンマネージ C++ は int* として受け入れます

MasterCube::MasterCube(int w,int h, int l, int* d)

そして、それを上記の関数に渡し、最初に glTexImage3D で受け入れられるように char 配列に変換します。

static_cast<char*>(static_cast<void*>(d));

AccessViolationException について調べたところ、「int* d」のデータが破損しているか、glTexImage3D で使用できないと思われます。array/systemArray/int*/char* の間で変換する方法に問題があるかどうか誰かに教えてもらえますか? それとも、openglがそれを理解するのに単に間違った形式ですか?

4

1 に答える 1

1

そして、それを上記の関数に渡し、最初に glTexImage3D で受け入れられるように char 配列に変換します。

static_cast<char*>(static_cast<void*>(d));

char *ptrキャストされたポインターが割り当てられる場所はどこですか? 変数をキャストステートメントに入れるだけでは、変数は「変換」されません。

あなたの実際の問題について。w * h * l * 4式の値が実際の配列のサイズ (バイト単位) を超えていることは確かです。そこにはネイキッド ポインターしかないため、そこにサニティ チェックを追加することはできません。

于 2013-05-24T10:47:14.517 に答える