尝试将一些数据读入 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理解它?