2017-02-27 149 views
0

我無法獲取任何內容以呈現到屏幕。使用着色器的頂點緩衝區對象/頂點數組對象

private void initVBO() { 
    vao = GL30.glGenVertexArrays(); 
    GL30.glBindVertexArray(vao); 

    float[] vertices = { 
      -0.5f, 0.5f, 0f, 
      0.5f, 0.5f, 0f, 
      0.5f, -0.5f, 0f, 
      -0.5f, -0.5f, 0f 
    }; 
    FloatBuffer vertBuffer = BufferUtils.createFloatBuffer(vertices.length); 
    vertBuffer.put(vertices); 
    vertBuffer.flip(); 

    this.vboID = GL15.glGenBuffers(); 
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, this.vboID); 
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertBuffer, GL15.GL_STATIC_DRAW); 
    positionAttribute = GL20.glGetAttribLocation(getMaterial().getShader() 
      .getProgram(), "position"); 
    GL20.glEnableVertexAttribArray(positionAttribute); 
    GL20.glVertexAttribPointer(positionAttribute, 3, GL11.GL_FLOAT, false, 0, 
      0); 

    Color c = getMaterial().getColor(); 
    float[] colors = { 
     c.red, c.green, c.blue, c.alpha, 
     c.red, c.green, c.blue, c.alpha, 
     c.red, c.green, c.blue, c.alpha, 
    }; 
    FloatBuffer colorBuffer = BufferUtils.createFloatBuffer(colors.length); 
    colorBuffer.put(colors); 
    colorBuffer.flip(); 

    this.vbocID = GL15.glGenBuffers(); 
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, this.vbocID); 
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, colorBuffer, GL15.GL_STATIC_DRAW); 
    colorAttribute = GL20.glGetAttribLocation(getMaterial().getShader().getProgram 
      (), "color"); 
    GL20.glEnableVertexAttribArray(colorAttribute); 
    GL20.glVertexAttribPointer(colorAttribute, 4, GL11.GL_FLOAT, false, 0, 0); 

    byte[] indices = { 
      0, 1, 2, 
      2, 3, 0 
    }; 
    ByteBuffer indicesBuffer = BufferUtils.createByteBuffer(indices.length); 
    indicesBuffer.put(indices); 
    indicesBuffer.flip(); 

    this.vboiID = GL15.glGenBuffers(); 
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, this.vboiID); 
    GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesBuffer, 
      GL15.GL_STATIC_DRAW); 

    GL30.glBindVertexArray(0); 

    GL20.glDisableVertexAttribArray(positionAttribute); 
    GL20.glDisableVertexAttribArray(colorAttribute); 

    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); 
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); 
} 

public void render() { 
    GL20.glUseProgram(getMaterial().getShader().getProgram()); 

    GL30.glBindVertexArray(this.vao); 
    GL20.glEnableVertexAttribArray(positionAttribute); 
    GL20.glEnableVertexAttribArray(colorAttribute); 

    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, this.vboiID); 

    GL11.glDrawElements(GL11.GL_TRIANGLES, 6, GL11.GL_BYTE, 0); 

    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0); 
    GL20.glDisableVertexAttribArray(colorAttribute); 
    GL20.glDisableVertexAttribArray(positionAttribute); 
    GL30.glBindVertexArray(0); 
    GL20.glUseProgram(0); 
} 

着色器編譯正確,Im綁定位置和顏色正確的屬性。我只是使用glOrtho,它設置正確,因爲通過即時模式繪製工作得很好。我不確定這個問題是否可以來自創建索引,或者如果它是glVertexAttribPointer中的問題。我只是想獲得一個彩色繪製到屏幕上的矩形。

更新: 頂點着色器:

#version 150 

in vec3 position; 
in vec4 color; 

out vec4 passColor; 

void main(void) { 
    gl_Position = vec4(position, 1.0); 
    passColor = color; 
} 

片段着色器:

#version 150 

in vec4 passColor; 

out vec4 outColor; 

void main(void) { 
    outColor = vec4(1.0, 1.0, 1.0, 1.0); 
} 

我也更新了init和上面的繪製代碼。這裏還有着色器的加載代碼:

private void load(File vertex, File fragment) { 
     this.vertexID = FileUtility.loadShader(vertex, GL20.GL_VERTEX_SHADER); 
     this.fragmentID = FileUtility.loadShader(fragment, GL20.GL_FRAGMENT_SHADER); 

     programID = GL20.glCreateProgram(); 
     GL20.glAttachShader(programID, vertexID); 
     GL20.glAttachShader(programID, fragmentID); 

     GL20.glBindAttribLocation(programID, 0, "position"); 
     GL20.glBindAttribLocation(programID, 1, "color"); 

     GL30.glBindFragDataLocation(programID, 0, "outColor"); 

     GL20.glLinkProgram(programID); 
     GL20.glValidateProgram(programID); 

     int status = GL20.glGetProgrami(programID, GL20.GL_LINK_STATUS); 
     if (status != GL11.GL_TRUE) { 
      Log.print(LogLevel.Error, GL20.glGetProgramInfoLog(programID)); 
     } 
    } 
+0

如何您的投影矩陣得到的頂點着色器設置? 'glOrtho'不會這樣做,除非你使用'#version 110'和'ftransform'或'gl_ProjectionMatrix'等等。 –

+0

我正在通過'GL11.glViewport(0,0,Configuration.getInstance( ).getWindowWidth(), Configuration.getInstance()。getWindowHeight()); GL11.glMatrixMode(GL11.GL_PROJECTION); (); GL11.glLoadIdentity(); i GL11.glOhoho(-1,1,1,-1,1,-1); GL11.glMatrixMode(GL11.GL_MODELVIEW);' 我沒有在着色器中設置投影矩陣;我只是設置頂點的顏色。 – Greymouth

+0

您打算如何在未擴展的#version 120着色器中使用'in' /'out'? – genpfault

回答

0

這裏有很多問題,主要是VBO沒有實際綁定。

您創建,綁定,然後立即解除綁定您的VAO。因此,請刪除對glBindVertexArray(0)的呼叫或將其降至initVBO的底部。在解除綁定你的VAO之前,也不要解除綁定你的VBO,否則你的VAO將不會被綁定到VBO。

您沒有發佈着色器,但您使用的是VAO,這意味着您至少可以訪問GLSL 1.30。帶有着色器的glOrtho僅被簡單地支持,隨着GLSL 1.20被拒絕並在核心配置文件中被刪除。我強烈建議儘快遠離固定功能矩陣堆棧。 LWJGL有自己的矩陣類,開關應該非常簡單。

除非在你的着色器的任何其他問題,第一件事應該做的東西出現在屏幕上

+0

'GL30.glBindVertexArray(0); GL20.glDisableVertexAttribArray(positionAttribute); GL20.glDisableVertexAttribArray(colorAttribute); GL20.glDisableVertexAttribArray(colorAttribute); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER,0); GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER,0);' 所以我把所有這些按順序移動到底部,但它仍然沒有畫任何東西。 – Greymouth

+0

你可以用着色器更新你的問題嗎?如果不是已經禁用背面剔除,只是爲了檢查你的臉不被剔除 –

+0

更新和添加的代碼。 – Greymouth

相關問題