OpenGL渲染黑色正方形

时间:2019-02-15 21:14:34

标签: c++ opengl glsl

我试图渲染一个彩色的矩形,但是最终得到一个黑色的矩形。

我的着色器和着色器程序在编译或链接时不会产生任何错误,因此,我可以确保在尝试缓冲数据时出了点问题。但是,一切对我来说都是正确的。

enter image description here

着色器源

std::string const fragment_shader_source = "#version 330 core\n"
                                           ""
                                           "in vec4 fColor;\n"
                                           "\n"
                                           "out vec4 finalColor;\n"
                                           "\n"
                                           "void main() {\n"
                                           "    finalColor = fColor;\n"
                                           "}";

std::string const vertex_shader_source = "#version 330 core\n"
                                         ""
                                         "layout (location = 0) in vec2 vPos;\n"
                                         "layout (location = 1) in vec4 vColor;\n"
                                         "\n"
                                         "out vec4 fColor;\n"
                                         "void main() {\n"
                                         "  gl_Position = vec4(vPos.xy, 1.0, 1.0);\n"
                                         "  fColor = vColor;\n"
                                         "}";

顶点数据

    static GLfloat const vertex_data[] = {
    //            //Position                  //Color                 //UV Coords
                0.5f, 0.5f,             1.0f, 0.0f, 1.0f, 1.0f,
                -0.5f, 0.5f,            1.0f, 0.0f, 0.0f, 1.0f,
                0.5f, -0.5f,            1.0f, 1.0f, 0.0f, 1.0f,

                -0.5f, -0.5f,           0.0f, 1.0f, 1.0f, 1.0f,
                -0.5f, 0.5f,            0.0f, 0.0f, 1.0f, 1.0f,
                0.5f, -0.5f,            0.0f, 1.0f, 0.0f, 1.0f
    };

这是我的主循环:

int SDLApp::AppMain(int argc, char** argv) {

  if(sdl_window_ == nullptr) {
    acorn::Log(acorn::LoggingLevel::Fatal, "Could not initialize the window.");
    return -1;
  }

  if(sdl_gl_context_ == nullptr) {
    acorn::Log(acorn::LoggingLevel::Fatal, "Could not create an OpenGL context.");
    return -1;
  }

  acorn::shader::FragmentShader f(fragment_shader_source);
  acorn::shader::VertexShader v(vertex_shader_source);
  acorn::shader::Program shader_program(f, v);
  shader_program.Link();
  shader_program.Use();


  GLuint vao_;
  glGenVertexArrays(1, &vao_);

  GLuint vbo_;
  glGenBuffers(1, &vbo_);

  glBindVertexArray(vao_);
  glBindBuffer(GL_ARRAY_BUFFER, vbo_);

  glEnableVertexAttribArray(0);
  glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (void*)0);
  glEnableVertexAttribArray(1);
  glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (void*)2);

  glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(GLfloat) * 6, vertex_data, GL_STATIC_DRAW);


  glClearColor(1.0f, 0.0f, 0.0f,1.0f);
  SDL_Event event;
  while (true) {
    while (SDL_PollEvent(&event)) {
      if (event.type == SDL_QUIT) {
        return 0;
      }
    }
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

    glDrawArrays(GL_TRIANGLES, 0, 6);
    SDL_GL_SwapWindow(sdl_window_);
  }
}

1 个答案:

答案 0 :(得分:1)

glVertexAttribPointer的最后一个参数被视为缓冲区对象数据存储区中的字节偏移量
因此,偏移量必须为8,list_name

2*sizeof(float)

更改后,您的代码可以正常工作