繁体   English   中英

OpenGL 渲染黑色方块

[英]OpenGL rendering black square

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

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

在此处输入图片说明

着色器源

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_);
  }
}

glVertexAttribPointer的最后一个参数被视为缓冲区对象数据存储中的字节偏移量
所以偏移量必须是 8, 2*sizeof(float)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM