OpenGL 텍스처로 일부 데이터를 읽으려고 할 때 오류가 있습니다. 내 오류는 다음과 같습니다.관리 데이터를 glTexImage3D에 넣으려고 할 때 AccessViolationException이 발생했습니다.
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는 시스템 배열로 취하는 관리 C++ 생성자로 전달된다CallbackNode::CallbackNode(int w ,int h, int l, array<int>^ d)
그 생성자에이 전달되기 전에, * int로 변환되고 일부 관리되지 않는 C++ 코드는
cli::pin_ptr<int> pArrayElement = &d[0];
mCube=new MasterCube(w,h,l,pArrayElement);
관리되지 않는 C의 ++는 INT *
로 받아그리고 위의 함수에 전달하여 char 배열로 변환 한 다음 glTexImage3D에서 허용합니다. AccessViolationException는 'INT의 * 디부의 데이터가 glTexImage3D으로 사용할 손상 여부를했다고 생각 날 리드에 대해 내가 고개를 가지고있는
static_cast<char*>(static_cast<void*>(d));
. 누군가가 내가 array/systemArray/int */char * 사이에서 변환하는 방법에 문제가 있는지 말해 줄 수 있습니까? 아니면 그것을 이해하기 위해 단순히 잘못된 형식으로입니까?
잡기 주셔서 고맙습니다. 배열 크기를 과장하여 그 오류가 발생한다는 것을 알지 못했습니다. 그래도 말이 되네. w, h, l에 대해 잘못된 값을 사용하고있는 것을 발견했습니다. – AAB
원래 배열 배열이 w * h * l * 4 int로 작성되었는지 확인해도 여전히 'System.AccessViolationException'이 발생합니다. 동일한 정확한 숫자는 텍스처 생성 함수에서 바이트로 요청됩니다. 배열에 확실히 하나 이상의 int가 있어도 w = h = l = 1을 대입하면 문제가 발생합니다. 당신이 알고있는 또 다른 원인이 있습니까? char * ptr에 캐스트 값을 받도록 코드를 변경 한 다음 glTexImage3D에 매개 변수로 사용합니다. – AAB