OBJ 로딩 클래스를 패치하려고합니다. Short 번호 만 지원하므로 Short 번호 제한을 초과하는 큰 OBJ가 있습니다.ShortBuffer를 IntBuffer로 변경하면 BufferOverFlowException이 발생합니다.
Short Vector 대신 Integer Vectors를 사용하도록 코드를 변경하고 ShortBuffer를 IntBuffer로 변경해야했습니다.
이제 기본 OBJ에 3 초 안에로드하는 데 사용 된 (10,000 줄)로드가 더 이상 필요하지 않으며 BufferOverflowException이 발생합니다.
아래는 코드의 문제 덩어리입니다 : 내가 allocateDirect의 4에 2를 변경 한 경우 다음 함수가, 이상하게도 toPrimitiveArrayS
private static int[] toPrimitiveArrayS(Vector<Integer> vector){
int[] s;
s = new int[vector.size()];
for (int i=0; i<vector.size(); i++){
s[i] = vector.get(i);
}
return s;
}
입니다
ByteBuffer fBuf = ByteBuffer.allocateDirect(faces.size() * 2);
fBuf.order(ByteOrder.nativeOrder());
faceBuffer = fBuf.asIntBuffer();
faceBuffer.put(toPrimitiveArrayS(faces)); // this gives the exception
faceBuffer.position(0);
, 모델로드, 그러나 잘못 렌더링되었습니다 (이전에는 2로 표시된 숫자로 잘로드되어 방금보기 위해 바뀌 었습니다)
푸 아래 LL 클래스 코드 : 당신이 인덱스 당 하나 개의 INT를 사용하고 있기 때문에 당신은 얼굴 인덱스 당 두 바이트 (16 비트)를 할당하는
public class TDModelPart {
Vector<Integer> faces;
Vector<Integer> vtPointer;
Vector<Integer> vnPointer;
Material material;
private FloatBuffer normalBuffer;
IntBuffer faceBuffer;
public TDModelPart(Vector<Integer> faces, Vector<Integer> vtPointer, Vector<Integer> vnPointer, Material material, Vector<Float> vn) {
super();
this.faces = faces;
this.vtPointer = vtPointer;
this.vnPointer = vnPointer;
this.material = material;
ByteBuffer byteBuf = ByteBuffer.allocateDirect(vnPointer.size() * 4 * 3);
byteBuf.order(ByteOrder.nativeOrder());
normalBuffer = byteBuf.asFloatBuffer();
for(int i=0; i<vnPointer.size(); i++){
float x=vn.get(vnPointer.get(i)*3);
float y=vn.get(vnPointer.get(i)*3+1);
float z=vn.get(vnPointer.get(i)*3+2);
normalBuffer.put(x);
normalBuffer.put(y);
normalBuffer.put(z);
}
normalBuffer.position(0);
ByteBuffer fBuf = ByteBuffer.allocateDirect(faces.size() * 2);
fBuf.order(ByteOrder.nativeOrder());
faceBuffer = fBuf.asIntBuffer();
faceBuffer.put(toPrimitiveArrayS(faces));
faceBuffer.position(0);
}
public String toString(){
String str=new String();
if(material!=null)
str+="Material name:"+material.getName();
else
str+="Material not defined!";
str+="\nNumber of faces:"+faces.size();
str+="\nNumber of vnPointers:"+vnPointer.size();
str+="\nNumber of vtPointers:"+vtPointer.size();
return str;
}
public IntBuffer getFaceBuffer(){
return faceBuffer;
}
public FloatBuffer getNormalBuffer(){
return normalBuffer;
}
private static int[] toPrimitiveArrayS(Vector<Integer> vector){
int[] s;
s = new int[vector.size()];
for (int i=0; i<vector.size(); i++){
s[i] = vector.get(i);
}
return s;
}
public int getFacesCount(){
return faces.size();
}
public Material getMaterial(){
return material;
}
}
그래서 무엇을 고쳐야합니까? ShortBuffer를 사용할 수는 없지만 IntBuffer를 사용하면 작동하지 않으며 그래픽 카드에 인덱스를 업로드 할 때 –
이 필요합니다. 이제 부호없는 정수임을 나타냅니다. –
솔직히 무슨 말인지 모르겠군요. 간단히 ShortBuffer를 IntBuffer로 변경했습니다. 내 질문을 읽으십시오, 그게 내가 가진 모든 정보입니다. –