2013-07-03 43 views
0

我想在Java(JOGL)中移植一個簡單​​的C++示例。JOGL,着色器,VAO和索引數組的簡單示例

但它不工作,它必須是愚蠢的東西,但我不能看到它..

public class OverlapNoDepth implements GLEventListener { 

private int imageWidth = 800; 
private int imageHeight = 600; 
private GLCanvas canvas; 
private GLSLProgramObject programObject; 
private int[] vertexBufferObject = new int[1]; 
private int[] indexBufferObject = new int[1]; 
private int[] VAOs = new int[1]; 
private float[] vertexData = new float[]{ 
    0.25f, 0.25f, -1.25f, 1.0f, 
    0.25f, -0.25f, -1.25f, 1.0f, 
    -0.25f, 0.25f, -1.25f, 1.0f, 
    0.0f, 1.0f, 1.0f, 1.0f, 
    0.0f, 1.0f, 1.0f, 1.0f, 
    0.0f, 1.0f, 1.0f, 1.0f 
}; 
private int[] indexData = new int[]{ 
    0, 2, 1 
}; 
private String shadersFilepath = "/tut05/shaders/"; 
float[] perspectiveMatrix = new float[16]; 
float fFrustumScale = 1.0f; 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    OverlapNoDepth overlapNoDepth = new OverlapNoDepth(); 

    Frame frame = new Frame("Tutorial 05 - Overlap No Depth"); 

    frame.add(overlapNoDepth.getCanvas()); 

    frame.setSize(overlapNoDepth.getCanvas().getWidth(), overlapNoDepth.getCanvas().getHeight()); 

    frame.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowClosing(WindowEvent windowEvent) { 
      System.exit(0); 
     } 
    }); 

    frame.setVisible(true); 
} 

public OverlapNoDepth() { 
    initGL(); 
} 

private void initGL() { 
    GLProfile profile = GLProfile.getDefault(); 

    GLCapabilities capabilities = new GLCapabilities(profile); 

    canvas = new GLCanvas(capabilities); 

    canvas.setSize(imageWidth, imageHeight); 

    canvas.addGLEventListener(this); 
} 

@Override 
public void init(GLAutoDrawable glad) { 
    System.out.println("init"); 

    canvas.setAutoSwapBufferMode(false); 

    GL3 gl3 = glad.getGL().getGL3(); 

    initializeProgram(gl3); 

    initializeVertexBuffer(gl3); 

    initializeVertexArrayObjects(gl3); 

    gl3.glEnable(GL3.GL_CULL_FACE); 
    gl3.glCullFace(GL3.GL_BACK); 
    gl3.glFrontFace(GL3.GL_CW); 
} 

@Override 
public void dispose(GLAutoDrawable glad) { 
    System.out.println("dispose"); 
} 

@Override 
public void display(GLAutoDrawable glad) { 
    System.out.println("display"); 

    GL3 gl3 = glad.getGL().getGL3(); 

    gl3.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 
    gl3.glClear(GL3.GL_COLOR_BUFFER_BIT); 

    programObject.bind(gl3); 
    { 
     gl3.glBindVertexArray(VAOs[0]); 
     { 
      programObject.setUniform(gl3, "offset", new float[]{0.0f, 0.0f, 0.0f}, 3); 
      gl3.glDrawElements(GL3.GL_TRIANGLES, indexData.length, GL3.GL_UNSIGNED_INT, 0); 
     } 
     gl3.glBindVertexArray(0); 
    } 
    programObject.unbind(gl3); 

//  programObject.bind(gl3); 
//  { 
//   gl3.glBindBuffer(GL3.GL_ARRAY_BUFFER, vertexBufferObject[0]); 
//   { 
//    gl3.glEnableVertexAttribArray(0); 
//    gl3.glEnableVertexAttribArray(1); 
//    { 
//     programObject.setUniform(gl3, "offset", new float[]{0.0f, 0.0f, 0.0f}, 3); 
//     gl3.glVertexAttribPointer(0, 4, GL3.GL_FLOAT, false, 0, 0); 
//     gl3.glVertexAttribPointer(1, 4, GL3.GL_FLOAT, false, 0, 3 * 4 * 4); 
// 
//     gl3.glDrawArrays(GL3.GL_TRIANGLES, 0, 3); 
//    } 
//    gl3.glDisableVertexAttribArray(0); 
//    gl3.glDisableVertexAttribArray(1); 
//   } 
//  } 
//  programObject.unbind(gl3); 
    glad.swapBuffers(); 
} 

@Override 
public void reshape(GLAutoDrawable glad, int x, int y, int w, int h) { 
    System.out.println("reshape() x: " + x + " y: " + y + " width: " + w + " height: " + h); 

    GL3 gl3 = glad.getGL().getGL3(); 

    perspectiveMatrix[0] = fFrustumScale/(w/(float) h); 
    perspectiveMatrix[5] = fFrustumScale; 

    programObject.bind(gl3); 
    { 
     int perspectiveMatrixLocation = gl3.glGetUniformLocation(programObject.getProgId(), "perspectiveMatrix"); 
     gl3.glUniformMatrix4fv(perspectiveMatrixLocation, 1, false, perspectiveMatrix, 0); 
    } 
    programObject.unbind(gl3); 

    gl3.glViewport(x, y, w, h); 
} 

private void buildShaders(GL3 gl3) { 
    System.out.print("Building shaders..."); 

    programObject = new GLSLProgramObject(gl3); 
    programObject.attachVertexShader(gl3, shadersFilepath + "MatrixPerspective_VS.glsl"); 
    programObject.attachFragmentShader(gl3, shadersFilepath + "StandardColor_FS.glsl"); 
    programObject.initializeProgram(gl3, true); 

    System.out.println("ok"); 
} 

private void initializeVertexBuffer(GL3 gl3) { 
    gl3.glGenBuffers(1, IntBuffer.wrap(vertexBufferObject)); 

    gl3.glBindBuffer(GL3.GL_ARRAY_BUFFER, vertexBufferObject[0]); 
    { 
     gl3.glBufferData(GL3.GL_ARRAY_BUFFER, vertexData.length * 4, GLBuffers.newDirectFloatBuffer(vertexData), GL3.GL_STATIC_DRAW); 
    } 
    gl3.glBindBuffer(GL3.GL_ARRAY_BUFFER, 0); 


    gl3.glGenBuffers(1, IntBuffer.wrap(indexBufferObject)); 

    gl3.glBindBuffer(GL3.GL_ELEMENT_ARRAY_BUFFER, indexBufferObject[0]); 
    { 
     gl3.glBufferData(GL3.GL_ELEMENT_ARRAY_BUFFER, indexData.length * 4, GLBuffers.newDirectIntBuffer(indexData), GL3.GL_STATIC_DRAW); 
    } 
    gl3.glBindBuffer(GL3.GL_ELEMENT_ARRAY_BUFFER, 0); 
} 

private void initializeProgram(GL3 gl3) { 
    buildShaders(gl3); 

    programObject.bind(gl3); 
    { 
     float fzNear = 0.5f; 
     float fzFar = 3.0f; 

     perspectiveMatrix[0] = fFrustumScale; 
     perspectiveMatrix[5] = fFrustumScale; 
     perspectiveMatrix[10] = (fzFar + fzNear)/(fzNear - fzFar); 
     perspectiveMatrix[14] = (2 * fzFar * fzNear)/(fzNear - fzFar); 
     perspectiveMatrix[11] = -1.0f; 

     int matrixLocation = gl3.glGetUniformLocation(programObject.getProgId(), "perspectiveMatrix"); 
     gl3.glUniformMatrix4fv(matrixLocation, 1, false, perspectiveMatrix, 0); 
    } 
    programObject.unbind(gl3); 
} 

private void initializeVertexArrayObjects(GL3 gl3) { 
    int colorDataOffset; 
    int positionDataOffset; 



    gl3.glGenVertexArrays(1, IntBuffer.wrap(VAOs)); 
    gl3.glBindVertexArray(VAOs[0]); 
    gl3.glBindBuffer(GL3.GL_ARRAY_BUFFER, vertexBufferObject[0]); 
    { 
//  2 objects * 18 vertices * 3 coordinate * 4 Bytes/Float 
//   colorDataOffset = 2 * 18 * 3 * 4; 
     colorDataOffset = 3 * 4 * 4; 

     gl3.glEnableVertexAttribArray(0); 
     gl3.glEnableVertexAttribArray(1); 
     { 
      gl3.glVertexAttribPointer(0, 4, GL3.GL_FLOAT, false, 0, 0); 
      gl3.glVertexAttribPointer(1, 4, GL3.GL_FLOAT, false, 0, colorDataOffset); 
     } 
     gl3.glDisableVertexAttribArray(0); 
     gl3.glDisableVertexAttribArray(1); 

     gl3.glBindBuffer(GL3.GL_ELEMENT_ARRAY_BUFFER, indexBufferObject[0]); 
    } 
    gl3.glBindVertexArray(0); 
} 

public GLCanvas getCanvas() { 
    return canvas; 
} 

public void setCanvas(GLCanvas canvas) { 
    this.canvas = canvas; 
} 
} 

我試圖減少它儘可能地(原來它採用更多的頂點和另一VAO )。 glsl程序使用了我使用了很多的外部類,它應該沒問題。好吧,應該也是來自另一個例子的頂點和片段着色器。如果錯誤看起來不在這裏,我會粘貼其餘的。 如果我在顯示屏()我可以看到三角形行註釋掉我沒有得到任何錯誤,只是一個空白屏幕.. ..

任何想法?

回答

0

發現,當我初始化VAO我最前一頁啓用頂點屬性,然後禁用它們..

但我不應該再禁用,因爲這將被存儲在VAO狀態...