簡體   English   中英

JOGL使用緩沖區顯示

[英]JOGL display using Buffer

我有3個FloatBuffers頂點,法線和顏色包含其名稱的含義。 我也有一個IntBuffer來跟蹤索引。

數據看起來正確,但是我無法顯示它。 我只看到一塊空白的畫布。 我不確定自己在做什么錯。 我猜測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) {
}

一個明顯的問題是平局:

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

GL_INT對於glDrawElements()類型參數glDrawElements() 唯一有效的值為GL_UNSIGNED_BYTEGL_UNSIGNED_SHORTGL_UNSIGNED_INT 因此,呼叫必須為:

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

glGetError()glGetError() OpenGL代碼無法按預期運行的問題時,請確保調用glGetError() 通過代碼調用,您應該立即收到GL_INVALID_ENUM錯誤。

另外,您的透視圖設置代碼看起來有些可疑。 我不完全了解您要在此做什么,但是即使只是命名也可能會引起誤解:

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

gluPerspective()的第一個參數是視野 (以度為單位),而不是距離。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM