为什么OpenGL不绘制矩形?

  • 本文关键字:绘制 OpenGL c++ opengl
  • 更新时间 :
  • 英文 :


我目前正在开发一款小型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);
}

My 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_FAILEDn" << 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_FAILEDn" << 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_FAILEDn" << infoLog << std::endl;
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
}
void Shader::use() {
glUseProgram(id);
}

错误在以下行:

glDrawArrays(GL_VERTEX_ARRAY, 0, 6);

glDrawArrays的第一个参数是基元类型。GL_VERTEX_ARRAY不是有效的基元类型,将导致INVALID_ENUM错误。您必须使用三角形基元类型GL_TRIANGLES:绘制2个字符串

glDrawArrays(GL_TRIANGLES, 0, 6);

最新更新