我无法弄清楚为什么以下代码不起作用,我试图绘制2个形状,一个红色的三角形和一个多色的立方体,他们自己画得很完美,但如果我试图同时绘制它们给出了奇怪的错误,我尝试改变变量修改我的着色器的线条,我似乎无法接近我想要的结果,当前的代码最终绘制了2个使用立方体颜色的相同三角形.
GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);
GLuint MatrixID = glGetUniformLocation(shader->id(), "MVP");
glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
glm::mat4 View = glm::lookAt(
glm::vec3(4,2,2), // Camera location
glm::vec3(0,0,0), // and looks at the origin
glm::vec3(0,1,0) // Head is up (set to 0,-1,0 to look upside-down)
);
glm::mat4 myMatrix = glm::translate(-2.f,0.f,0.f);
glm::mat4 Model = glm::mat4(1.f);
Model= myMatrix * Model;
glm::mat4 MVP = Projection * View * Model;
glm::mat4 myMatrix2 = glm::translate(2.f,0.f,0.f);
glm::mat4 Model2 = glm::mat4(1.f);
Model2= myMatrix2 * Model2;
glm::mat4 MVP2 = Projection * View * Model2;
glViewport(0, 0, windowWidth, windowHeight); // set viewport to the size of the window
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
shader->bind();
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, colourBuffer);
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,0,(void*)0);
glDrawArrays(GL_TRIANGLES,0,12*3);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP2[0][0]);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer2);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, colourBuffer2);
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,0,(void*)0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
SwapBuffers(hdc);
glDeleteBuffers(1, &vertexBuffer);
glDeleteBuffers(1, &vertexBuffer2);
glDeleteBuffers(1, &colourBuffer);
glDeleteBuffers(1, &colourBuffer2);
shader->unbind();
glDeleteVertexArrays(1, &VertexArrayID);
Run Code Online (Sandbox Code Playgroud)
这是主要代码.我通过基本上使用以下3行的变体来插入不同的缓冲区名称和数据,以类似的方式创建所有缓冲区,
glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER,sizeof(Cube), Cube, GL_STATIC_DRAW);
Run Code Online (Sandbox Code Playgroud)
片段着色器
#version 330 core
in vec3 fragmentColour;
out vec3 colour;
void main(){
colour = fragmentColour;
}
Run Code Online (Sandbox Code Playgroud)
顶点着色器
#version 330 core
uniform mat4 MVP;
layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec3 vertexColour;
out vec3 fragmentColour;
void main(){
gl_Position = MVP * vec4(vertexPosition_modelspace,1);
fragmentColour = vertexColour;
}
Run Code Online (Sandbox Code Playgroud)
我看到你正在尝试使用VAO,但你只创建了一个.你也为什么要准备:
glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER,vertexBuffer); glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,(无效*)0);
glEnableVertexAttribArray(1); glBindBuffer(GL_ARRAY_BUFFER,colourBuffer); glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,0,(无效*)0);
并删除:
glDeleteBuffers(1,&vertexBuffer); glDeleteBuffers(1,&vertexBuffer2); glDeleteBuffers(1,&colourBuffer); glDeleteBuffers(1,&colourBuffer2);
你对每个渲染调用VAOs?VAOs的整个目的是初始化所有需要的缓冲区和属性一次,然后绑定只有VAO本身为它的实际rendering.Do的初始化设置和删除,只有当你不需要的那些对象了.这是一个很好的例子,它是如何正确完成的.
你应该做的是:只在一些init方法中启动你的VAO一次.然后在渲染循环中:
glBindVertexArray(m_VAO1);
///draw geometry here
glBindVertexArray(0);
Run Code Online (Sandbox Code Playgroud)
对要渲染的每个几何体执行此操作.
在深入审查您的代码后,我看到您这样做:
GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);
Run Code Online (Sandbox Code Playgroud)
所以你绑定VAO.但是你只创建并绑定一个!你需要为每个可渲染对象创建一个,将所有需要的缓冲区附加到它,然后在渲染循环中使用它们,如上所述.