gpt4 book ai didi

c++ - OpenGL着色器不绘制任何东西 - 坏 Sprite 类

转载 作者:行者123 更新时间:2023-12-02 10:21:15 29 4
gpt4 key购买 nike

我正在尝试将 OpenGL 渲染封装在渲染器类中。

我很确定我的窗口类工作正常(我检查了错误),但我认为错误在我的 Sprite 类中,但我不知道它是什么。

这是我的 Sprite 类:

sprite_renderer.hpp

#ifndef SPRITE_RENDERER_H
#define SPRITE_RENDERER_H

#include <GL/glew.h>
#include "shader.hpp"


class SpriteRenderer
{
public:
SpriteRenderer(Shader &shader);
~SpriteRenderer();
void DrawSprite();
private:
Shader shader;
GLuint quadVAO;
void initRenderData();
};

#endif

sprite_renderer.cpp
#include "sprite_renderer.hpp"

SpriteRenderer::SpriteRenderer(Shader &shader)
{
this->shader = shader;
this->initRenderData();
}

SpriteRenderer::~SpriteRenderer()
{
glDeleteVertexArrays(1, &this->quadVAO);
}

void SpriteRenderer::DrawSprite()
{
this->shader.Use();

glBindVertexArray(this->quadVAO);
glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);
}

void SpriteRenderer::initRenderData()
{
GLuint VBO;
GLfloat vertices[] = {
// Pos
0.0f, 1.0f,
1.0f, 0.0f,
0.0f, 0.0f,

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

glGenVertexArrays(1, &this->quadVAO);
glGenBuffers(1, &VBO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glBindVertexArray(this->quadVAO);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), (GLvoid*)0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}

我在 main.cpp 中这样使用它:
int main()
{
Window window = Window();
Shader shader = ResourceManager::LoadShader("./assets/shaders/sprite.vert", "./assets/shaders/sprite.frag", "sprite");
SpriteRenderer* renderer = new SpriteRenderer(shader);

while (window.IsOpen())
{
window.BeginDraw();
renderer->DrawSprite();
window.EndDraw();
}

glfwTerminate();
return 0;
}

在哪里 window.BeginDraw()window.EndDraw()只是:
void Window::BeginDraw()
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
}

void Window::EndDraw()
{
glfwSwapBuffers(window);
glfwPollEvents();
}

最佳答案

只是为了排除明显的问题,尝试在 Shader 类的析构函数中添加一个 print 语句。从 Shader 类的设计来看,您应该会发现在实际使用着色器之前调用 glDeleteProgram 非常容易。

一般来说,如果你有一个 GLSL 着色器或程序的包装器,你可能想要删除复制构造函数和赋值运算符(或实现一个引用计数系统)。

\edit 删除复制 ctor & 赋值运算符....

Shader(const Shader&) = delete;
Shader& operator = (const Shader&) = delete;

您可能想在某个地方管理这些着色器(可能是引用计数),并且只在 SpriteRenderer 中存储指向它们的指针。
我看不出您上面发布的代码有任何其他问题,因此问题可能出在您的着色器中,或者您如何传递正在使用的任何统一变量。

关于c++ - OpenGL着色器不绘制任何东西 - 坏 Sprite 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60046726/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com