2013-05-11 70 views
2

我的问题是我可以使用glDrawElements而不使用着色器?glDrawElements不使用着色器?

我产生我的VBO类似如下:

glGenBuffers(1, &vertexId_); 
    glBindBuffer(GL_ARRAY_BUFFER, vertexId_); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)*((tess.x + 1) * (tess.y + 1)), &pVertex[0].p.x, GL_STATIC_DRAW); 


    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid *) vOffset_); 
    glEnableVertexAttribArray(1); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid *) nOffset_); 
    glEnableVertexAttribArray(2); 
    glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid *) tOffset_); 

    glGenBuffers(1, &indexId_); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexId_); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned short)*idxCount_, &pIndices[0], GL_STATIC_DRAW); 

    glBindVertexArray(0); 

所以,问题是,我可以只使用glDrawElements没有约束力的任何着色画?我正在使用GL 4.0

回答

4

在OpenGL 4.0中没有固定的管道,您需要着色器来告知如何处理您要发送给GPU的数据(顶点)。

有关于如何使用着色器开始很多资源,比如这一个:http://nehe.gamedev.net/article/glsl_an_introduction/25007/

编辑:正如有人指出低于这个是不完全正确的。如果支持,您可以使用兼容性配置文件并使用固定管道。 http://www.opengl.org/registry/doc/glspec40.compatibility.20100311.pdf

+0

因此,无论何时使用glDrawElement,我必须在绘制之前绑定着色器并使用该着色器进行绘制,即使绘图非常简单,对吧? – 2013-05-11 20:53:34

+0

是的,即使它只是输出一个白色的三角形。 – Trax 2013-05-11 20:55:15

+0

您对glDrawElements的调用将使用当前绑定程序沿其他状态呈现所有这些元素。 – Trax 2013-05-11 20:55:51