我一直试图用JOGL编写渲染应用程序。但我正在解决VBO的一个问题。在linux下它每次运行都很好,但在Windows下它会一直崩溃。我不知道我错过了什么。我为各种教程提供了服务VBO的代码,因为java很少而且没有谈论JOGL。
我读过这个:
http://www.java-gaming.org/index.php?topic=25672.0 我修改了我的代码,所以我从我的类的init函数传递GL2实例,它从GLEventListener派生为函数参数,一直到我的VBOClass函数。 (我不将GL2实例存储为类属性) 但这并没有帮助
所以我的班级:
public class VBOMesh {
private int vertexVBOId;
private int normalVBOId;
private int texCoordVBOId;
public VBOMesh(GL2 gl) {
IntBuffer ib = IntBuffer.allocate(4);
gl.glGenBuffers(4, ib);
vertexVBOId = ib.get(0);
normalVBOId = ib.get(1);
texCoordVBOId = ib.get(2);
}
public void setVetices(GL2 gl, List<Vector3> vetices)
{
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, vertexVBOId);
gl.glBufferData( GL.GL_ARRAY_BUFFER, vetices.size()*3*Float.SIZE, VectorListToFloatBuffer(vetices,3), GL.GL_STATIC_DRAW);
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, 0);
}
public void setTexCoords(GL2 gl, List<Vector3> texCoords)
{
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, texCoordVBOId);
gl.glBufferData( GL.GL_ARRAY_BUFFER, texCoords.size()*2*Float.SIZE, VectorListToFloatBuffer(texCoords,2), GL.GL_STATIC_DRAW);
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, 0);
}
public void setNormals( GL2 gl, List<Vector3> normals)
{
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, normalVBOId);
gl.glBufferData( GL.GL_ARRAY_BUFFER, normals.size()*3*Float.SIZE, VectorListToFloatBuffer(normals,3), GL.GL_STATIC_DRAW);
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, 0);
}
public void Draw( GL2 gl, List<Integer> indices)
{
IntBuffer indiceBuffer = Buffers.newDirectIntBuffer( indices.size() );
for (int ind : indices) {
indiceBuffer.put(ind);
}
gl.glEnableClientState(GLPointerFunc.GL_VERTEX_ARRAY);
gl.glEnableClientState(GLPointerFunc.GL_NORMAL_ARRAY);
gl.glEnableClientState(GLPointerFunc.GL_TEXTURE_COORD_ARRAY);
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, normalVBOId);
gl.glNormalPointer( GL.GL_FLOAT, 0, 0);
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, texCoordVBOId);
gl.glTexCoordPointer(2, GL.GL_FLOAT, 0, 0);
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, vertexVBOId);
gl.glVertexPointer(3, GL.GL_FLOAT, 0, 0);
gl.glDrawElements(GL.GL_TRIANGLES, indiceBuffer.capacity(), GL.GL_UNSIGNED_INT, indiceBuffer.rewind());
//gl.glDrawArrays(GL.GL_LINES, 0, 24);
gl.glBindBuffer( GL.GL_ARRAY_BUFFER, 0);
gl.glDisableClientState(GLPointerFunc.GL_VERTEX_ARRAY);
gl.glDisableClientState(GLPointerFunc.GL_NORMAL_ARRAY);
gl.glDisableClientState(GLPointerFunc.GL_TEXTURE_COORD_ARRAY);
}
private Buffer VectorListToFloatBuffer(List<Vector3> vectors, int floatsToTake)
{
if(floatsToTake > 4)
{
throw new InvalidParameterException("floats to take greater than 4");
}
FloatBuffer buffer = Buffers.newDirectFloatBuffer(vectors.size()*3);
for (Vector3 vector : vectors)
{
float [] arr = {0.f,0.f,0.f};
if(vector != null)
{
arr = vector.getVector3AsGLArray();
}
for (int i = 0; i < floatsToTake; i++)
{
buffer.put(arr[i]);
}
}
return buffer.rewind();
}
}
glBufferData发生异常。
我没有想法,所以我问。
答案 0 :(得分:1)
Float.SIZE在一个浮点数(32)中返回位的数量,而你想要浮点数中 bytes 的数量。
将Float.SIZE
的每个实例替换为(Float.SIZE/Byte.SIZE)
或4
,或自定义的常量BYTES_IN_FLOAT
。