2017-02-27 144 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

相关问题