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# 中, allDaintt 被传递给一个托管 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)

然后将其传递给上面的函数,首先将其转换为一个 char 数组以供 glTexImage3D 接受。

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

我对 AccessViolationException 的查找让我相信“int* d”中的数据已损坏或不能被 glTexImage3D 使用。有人可以告诉我如何在 array/systemArray/int*/char* 之间转换它有问题吗?或者它只是以错误的格式让opengl理解它?

4

1 回答 1

1

然后将其传递给上面的函数,首先将其转换为一个 char 数组以供 glTexImage3D 接受。

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

char *ptr转换后的指针分配到哪里?只是将变量放入强制转换语句不会“转换”变量。

至于你的实际问题。我很确定表达式的值w * h * l * 4超过了实际数组的大小(以字节为单位)。由于那里只有一个裸指针,因此不可能在那里添加健全性检查。

于 2013-05-24T10:47:14.517 回答