代码之家  ›  专栏  ›  技术社区  ›  Acorn

opengl渲染黑方块

  •  1
  • Acorn  · 技术社区  · 5 年前

    我试图渲染一个彩色矩形,但我只是以一个黑色的结束。

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

    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 回复  |  直到 5 年前
        1
  •  1
  •   Rabbid76    5 年前

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

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

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