Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法在opengl中绘制多个对象_C++_Opengl - Fatal编程技术网

C++ 无法在opengl中绘制多个对象

C++ 无法在opengl中绘制多个对象,c++,opengl,C++,Opengl,我不明白为什么下面的代码不起作用,我试图画两个形状,一个是红色的三角形,一个是多色的立方体,它们自己画得很完美,但如果我试图同时画这两个形状,就会产生奇怪的错误,我尝试过改变变量周围的线条,修改我的着色器,但我似乎无法达到我想要的效果,当前代码最终绘制了两个使用立方体颜色的相同三角形 GLuint VertexArrayID; glGenVertexArrays(1, &VertexArrayID); glBindVertexArray(VertexArrayID); GLuint

我不明白为什么下面的代码不起作用,我试图画两个形状,一个是红色的三角形,一个是多色的立方体,它们自己画得很完美,但如果我试图同时画这两个形状,就会产生奇怪的错误,我尝试过改变变量周围的线条,修改我的着色器,但我似乎无法达到我想要的效果,当前代码最终绘制了两个使用立方体颜色的相同三角形

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);
这是主要代码。我以类似的方式创建所有缓冲区,基本上使用以下3行的变体插入不同的缓冲区名称和数据

glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER,sizeof(Cube), Cube, GL_STATIC_DRAW);
片段着色器

#version 330 core
in vec3 fragmentColour;
out vec3 colour;
void main(){
colour = fragmentColour;
}
顶点着色器

  #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;
   }

我看到您正在尝试使用VAO,但您只创建了一个。另外,您为什么准备:

GlenableVertexAttributeArray(0);glBindBuffer(GL_数组_缓冲区, 顶点缓冲区); glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0)

GlenableVertexAttributeArray(1);glBindBuffer(GL_数组_缓冲区, 颜色缓冲液); glvertexattributepointer(1,3,GL_FLOAT,GL_FALSE,0,(void*)0)

并删除:

glDeleteBuffers(1和vertexBuffer);glDeleteBuffers(1和vertexBuffer2); glDeleteBuffers(1,&colorBuffer);glDeleteBuffers(1和ColorBuffer2)

每次渲染调用时都要使用VAO?VAO的全部目的是初始化所有需要的缓冲区和属性一次,然后仅绑定VAO本身以进行实际渲染。在初始化设置中执行此操作,仅当不再需要这些对象时才删除。这是一个很好的例子

你应该做的是: 在某些初始化方法中只启动VAO一次。然后在渲染循环中:

   glBindVertexArray(m_VAO1);

   ///draw geometry here

    glBindVertexArray(0);
对要渲染的每个几何体执行此操作

在深入检查代码后,我看到您这样做:

GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);

所以你确实绑定了VAO,但你只创建并绑定了一个!您需要为每个可渲染对象创建一个,附加所有必需的缓冲区,然后在渲染循环中使用它们,正如我前面所解释的。

由于您使用的是VAO,您还可以创建其中两个并保存其中每个形状的VBO绑定,这样您就不必每次都设置所有属性。嘿,谢谢,似乎是什么问题,但我似乎无法修复它,我添加了一个新的vao,并在禁用第一个vao后将其绑定,现在三角形具有红色纹理,但立方体似乎不知道我做错了什么?我会继续修补。此外,我的代码中没有使用循环,这基本上是一次渲染调用,这就是我删除缓冲区的原因。请尝试单独渲染立方体,可能是因为存在几何问题,例如错误的缠绕或顶点数据错误。成功使其运行,是我设置/未设置vao的方式。感谢您的帮助。