首页 > 解决方案 > 在 OpenGL 中使用和绑定多个 vbo

问题描述

我正在尝试并学习如何使用多个 VBO 在 OpenGL 中绘制非常不同的对象。第一个 VBO 只是一个文本渲染器,现在与主 VBO 一起使用的着色器只是一个基本的顶点着色器

attribute vec3 vPosition;

void main()
{
  gl_Position = vec4(vPosition, 1.0);
}

测试片段着色器:

void main()
{
  gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);
}

代码可以很好地呈现文本,但是只要我调用 UseProgram 并绑定 VAO,就会出现黑屏。

这是我对上述 VAO 的初始化:

//random polygon

  points[0]= vec3(-0.5, 0.5, 0.3);
  points[1]= vec3(-0.5, -0.5, 0.2);
  points[2]= vec3(0.5, -0.5, 0.3);
  points[3]= vec3(0.5, 0.5, 0.4);

  //Returns a uInt name for a shader program
  shader = InitShader("vshader.glsl", "fshader.glsl");

  glGenVertexArrays(1, &vao);
  glGenBuffers(1, &buffer);
  glBindVertexArray(vao);
  glBindBuffer(GL_ARRAY_BUFFER, buffer);
  glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);

  GLuint loc = glGetAttribLocation(shader, "vPosition");
  glEnableVertexAttribArray(loc);

  glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, 3*sizeof(float), BUFFER_OFFSET(0));
  glBindBuffer(GL_ARRAY_BUFFER, 0);
  glBindVertexArray(0);

  glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // white background

其中 vao 和 buffer 是以前未初始化的 GLuint,在调试后它们不返回 -1。

这是我要绘制的代码

  glUseProgram(shader);
  glBindBuffer(GL_ARRAY_BUFFER, buffer);
  glBindVertexArray(vao);
  glDrawArrays(GL_POLYGON, 0, 4);
  glBindVertexArray(0);
  glBindBuffer(GL_ARRAY_BUFFER, 0);

标签: c++openglgraphicsshader

解决方案


感谢大家的帮助,我发现在绑定我的第二个 VBO 和 VAO 并绘制它们之前,我需要调用 glFlush() 。


推荐阅读