【问题标题】:Why isn't OpenGL drawing a rectangle?为什么OpenGL不画一个矩形?
【发布时间】:2021-01-08 23:28:28
【问题描述】:

我目前正在开发一个小型 OpenGL 游戏。 我试图制作一个渲染器,它渲染一个简单的矩形,但我没有渲染任何东西。 我很确定着色器可以工作,所以我认为问题出在渲染器的代码中。

我认为问题出在这段代码中:

#include "Renderer.h"

#include <game/Game.h>
#include <glad/glad.h>

Renderer::Renderer() {
    initQuadRenderData();
}

void Renderer::initQuadRenderData() {
    float vertices[]{
        0.0f, 1.0f,
        1.0f, 0.0f,
        0.0f, 0.0f,

        0.0f, 1.0f, 
        1.0f, 0.0f,
        1.0f, 1.0f
    };

    unsigned int vbo;
    glGenVertexArrays(1, &quadVAO);
    glGenBuffers(1, &vbo);

    glBindVertexArray(quadVAO);

    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glBindVertexArray(0);
}

void Renderer::renderRect(Shader& shader, glm::vec2 pos, glm::vec2 size, glm::vec3 color, float opacity) {
    shader.use();
    glBindVertexArray(quadVAO);
    glDrawArrays(GL_VERTEX_ARRAY, 0, 6);
    glBindVertexArray(0);
}

我的Shader类只有两个功能:编译和使用:

#include "Shader.h"

#include <game/Game.h>
#include <glad/glad.h>

void Shader::compile(const char* vertexSource, const char* fragmentSource) {
    int vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexSource, nullptr);
    glCompileShader(vertexShader);

    int success;
    char infoLog[512];
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
    }

    int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentSource, nullptr);
    glCompileShader(fragmentShader);

    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
    }

    id = glCreateProgram();
    glAttachShader(id, vertexShader);
    glAttachShader(id, fragmentShader);
    glLinkProgram(id);

    glGetProgramiv(id, GL_LINK_STATUS, &success);
    if (!success) {
        glGetProgramInfoLog(id, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
    }
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
}

void Shader::use() {
    glUseProgram(id);
}

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    错误在一行:

    glDrawArrays(GL_VERTEX_ARRAY, 0, 6);
    

    glDrawArrays 的第一个参数是primitive 类型。 GL_VERTEX_ARRAY 不是有效的原始类型,将导致 INVALID_ENUM 错误。您必须使用Triangle primitive 类型GL_TRIANGLES 绘制2 个三角形:

    glDrawArrays(GL_TRIANGLES, 0, 6);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 2010-10-19
      相关资源
      最近更新 更多