Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I am currently working on a small OpenGL-Game. I tried to make a renderer, which renders a simple rectangle, but I doesn't render anything. I am quite sure that the shaders work, so I think the problem is in the code of the renderer.

I think the problem is in this code:

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

My Shader class has only two functions: compile and use:

#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
" << 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
" << 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
" << infoLog << std::endl;
    }
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
}

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
250 views
Welcome To Ask or Share your Answers For Others

1 Answer

The mistake is in the line:

glDrawArrays(GL_VERTEX_ARRAY, 0, 6);

The first argument of glDrawArrays is the primitive type. GL_VERTEX_ARRAY is not a valid primitive type and will cause an INVALID_ENUM error. You have to draw 2 tringles with the Triangle primitive type GL_TRIANGLES:

glDrawArrays(GL_TRIANGLES, 0, 6);

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...