2015-12-01 33 views
1

我有3 FloatBuffers - 頂點,法線和顏色,其中包含名稱的建議。我也有一個IntBuffer來跟蹤索引。JOGL顯示使用緩衝區

數據看起來正確,但我在顯示時遇到問題。我只看到一張空白的畫布。我不知道我做錯了什麼。我猜在init(),display(),reshape()dispose()中被忽略了。任何人都可以告訴我,如果你在下面的代碼中發現一些明顯錯誤的東西,爲什麼你覺得沒有什麼顯示?

@Override 
    public void init(GLAutoDrawable drawable) { 
    GL2 gl = drawable.getGL().getGL2(); 
    gl.glClearColor(.0f, .0f, .2f, 0.9f); 
    gl.glEnable(GL2.GL_DEPTH_TEST); 
    gl.glDepthFunc(GL2.GL_LESS); 
    gl.glEnable(GL2.GL_CULL_FACE); 
    gl.glEnable(GL2.GL_LIGHTING); 
    gl.glEnable(GL2.GL_LIGHT0); 
    gl.glEnable(GL2.GL_AUTO_NORMAL); 
    gl.glEnable(GL2.GL_NORMALIZE); 
    gl.glFrontFace(GL2.GL_CCW); 
    gl.glCullFace(GL2.GL_BACK); 
    gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST); 
    gl.glShadeModel(GL2.GL_SMOOTH); 
    if (viewMesh) { 
     gl.glPolygonMode(GL2.GL_FRONT_AND_BACK, GL2.GL_LINE); 
    } else { 
     gl.glPolygonMode(GL2.GL_FRONT_AND_BACK, GL2.GL_FILL); 
    } 

    glu = new GLU(); 

    // Build the VBOs 
    VBO = IntBuffer.allocate(4); 
    gl.glGenBuffers(4, VBO); 
    vertVBOID = VBO.get(0); 
    normalVBOID = VBO.get(1); 
    colorVBOID = VBO.get(2); 
    indexVBOID = VBO.get(3); 

    // vertices 
    int vsize = sd.verts.capacity() * BufferUtil.SIZEOF_FLOAT; 
    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vertVBOID); // get a valid name 
    gl.glBufferData(GL2.GL_ARRAY_BUFFER, vsize, sd.verts, GL2.GL_STATIC_DRAW); 
    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0); // reset 

    // normals 
    int nsize = sd.normals.capacity() * BufferUtil.SIZEOF_FLOAT; 
    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, normalVBOID); 
    gl.glBufferData(GL2.GL_ARRAY_BUFFER, nsize, sd.normals, GL2.GL_STATIC_DRAW); 
    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0); 

    // colors 
    int csize = sd.colors.capacity() * BufferUtil.SIZEOF_FLOAT; 
    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, colorVBOID); 
    gl.glBufferData(GL2.GL_ARRAY_BUFFER, csize, sd.colors, GL2.GL_STATIC_DRAW); 
    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, 0); 

    int isize = sd.indices.capacity() * BufferUtil.SIZEOF_INT; 
    gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, indexVBOID); 
    gl.glBufferData(GL2.GL_ELEMENT_ARRAY_BUFFER, isize, sd.indices, GL2.GL_STATIC_DRAW); 
    gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, 0); 

    // sd.verts = null; // copy of data is no longer necessary, it is in the graphics card now. 
    // sd.colors = null; 
    // sd.normals = null; 
    // sd.indices = null; 
} 

@Override 
public void display(GLAutoDrawable drawable) { 
    GL2 gl = drawable.getGL().getGL2(); 
    gl.glMatrixMode(GL2.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
    glu.gluLookAt(45, 0, 0, 0, 0, 0, 0.0, 1.0, 0.0); 

    gl.glScalef(scale, scale, scale); 
    gl.glRotatef(rot, 0, 1, 0); 
    gl.glTranslatef(-sd.tr_x, -sd.tr_y, -sd.tr_z); 

     gl.glEnableClientState(GLPointerFunc.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GLPointerFunc.GL_NORMAL_ARRAY); 
    gl.glEnableClientState(GLPointerFunc.GL_COLOR_ARRAY); 

    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, normalVBOID); 
    gl.glNormalPointer(GL2.GL_FLOAT, 0, 0); 
    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, colorVBOID); 
    gl.glColorPointer(3, GL2.GL_FLOAT, 0, 0); 
    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vertVBOID); 
    gl.glVertexPointer(3, GL2.GL_FLOAT, 0, 0); 

    gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, indexVBOID); 
    gl.glDrawElements(GL2.GL_TRIANGLES, sd.indices.capacity(), GL2.GL_INT, 0); 
    gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, 0); // unbind it 

    gl.glDisableClientState(GLPointerFunc.GL_VERTEX_ARRAY); 
    gl.glDisableClientState(GLPointerFunc.GL_NORMAL_ARRAY); 
    gl.glDisableClientState(GLPointerFunc.GL_COLOR_ARRAY); 

} 

    @Override 
public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) { 
    GL2 gl = drawable.getGL().getGL2(); 
    double fov = (Math.PI/4.0); 
    double zmm = Math.abs(sd.min_z - sd.max_z); 
    camdist = (zmm/2.0)/Math.tan(fov/2.0); 

    h = (h == 0) ? 1 : h; 

    gl.glViewport(0, 0, w, h); 
    gl.glMatrixMode(GL2.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    glu.gluPerspective(camdist, w/(float) h, 0.1f, 1000.0); 
} 




    /** 
* Initilaize graphics 
*/ 
public void initOGL() { 
    profile = GLProfile.get(GLProfile.GL2); 
    caps = new GLCapabilities(profile); 
    caps.setHardwareAccelerated(true); 
    canvas = new GLCanvas(caps); 
    canvas.addGLEventListener(this); 
    canvas.requestFocusInWindow(); 
    getContentPane().add(canvas); // add to the frame 
} 


    @Override 
public void dispose(GLAutoDrawable drawable) { 
} 
+0

你應該避免被棄用的OpenGL,除非你確實需要它 – elect

+0

你應該用GLU.createGLU(gl)來代替glu = new GLU()。如果稍後使用未實現的功能,則可能會遇到問題,而GLU.createGLU(gl)將在您的特定情況下創建GLUgl2的實例。 – gouessej

+0

謝謝gouessej。 –

回答

2

一個明顯的問題是引入呼叫:

gl.glDrawElements(GL2.GL_TRIANGLES, sd.indices.capacity(), GL2.GL_INT, 0); 

GL_INT無效的glDrawElements()說法。唯一有效的值是GL_UNSIGNED_BYTE,GL_UNSIGNED_SHORTGL_UNSIGNED_INT。因此,需要將電話:你有不按預期工作的OpenGL代碼中的問題

gl.glDrawElements(GL2.GL_TRIANGLES, sd.indices.capacity(), GL2.GL_UNSIGNED_INT, 0); 

任何時候,請確保您撥打glGetError()。隨着你的代碼的呼叫,你應該立即得到一個GL_INVALID_ENUM錯誤。

此外,您的透視設置代碼看起來有點可疑。我不完全理解你正在試圖做什麼有,但哪怕只是命名提出了一種可能的誤解:

glu.gluPerspective(camdist, w/(float) h, 0.1f, 1000.0); 

gluPerspective()第一個參數是場的視角度(度),而不是距離。

+0

@Retro Koradi - 感謝您關注GL2.GL_UNSIGNED_INT。我改變了它,但它仍然沒有工作。所以,做了一些挖掘並發現,除了沒有使用GL2.GL_UNSIGNED_INT之外,還有另一個問題。我沒有清除顯示屏上的深度。這是我必須做的 - \t gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);另外,將var名稱camdist更改爲fovy,正在計算的是fov。 –