C++ OpenGL着色器没有绘制任何东西-错误的sprite类
我试图将OpenGL渲染封装在渲染器类中 我很确定我的window类工作正常(我已经检查了错误),但我认为错误在我的sprite类中,但我不知道它是什么 这是我的精灵课: sprite_渲染器.hppC++ OpenGL着色器没有绘制任何东西-错误的sprite类,c++,opengl,glfw,C++,Opengl,Glfw,我试图将OpenGL渲染封装在渲染器类中 我很确定我的window类工作正常(我已经检查了错误),但我认为错误在我的sprite类中,但我不知道它是什么 这是我的精灵课: sprite_渲染器.hpp \ifndef精灵渲染器\u H #定义精灵渲染器 #包括 #包括“shader.hpp” 类喷枪 { 公众: SpriteRenderer(着色器和着色器); ~Spriterender(); void DrawSprite(); 私人: 着色器; GLuint quadVAO; void in
\ifndef精灵渲染器\u H
#定义精灵渲染器
#包括
#包括“shader.hpp”
类喷枪
{
公众:
SpriteRenderer(着色器和着色器);
~Spriterender();
void DrawSprite();
私人:
着色器;
GLuint quadVAO;
void initRenderData();
};
#恩迪夫
sprite_渲染器.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();
}
为了排除明显的错误,请尝试在着色器类的析构函数中粘贴一条print语句。根据着色器类的设计判断,在实际使用着色器之前调用glDeleteProgram应该非常容易 通常,如果在GLSL着色器或程序周围有一个包装器,则可能需要删除复制构造函数和赋值运算符(或实现一个引用计数系统) \编辑以删除复制和分配运算符
Shader(const Shader&)=delete;
着色器和运算符=(常量着色器&)=删除;
您可能希望在某个位置管理这些着色器(可能是ref counted),并且只在spritender中存储指向它们的指针。
我看不出你上面发布的代码有任何其他问题,因此问题可能在你的着色器中,或者你如何传递你正在使用的任何统一变量。
glvertexattributepointer(0,4,GL\u FLOAT,GL\u FALSE,4*sizeof(GLfloat),(GLvoid*)0)
必须是glvertexattributepointer(0,2,GL\u FLOAT,GL\u FALSE,2*sizeof(GLfloat),(GLvoid*)0
。属性元组的大小为2,因为每个顶点坐标由2个组件(x,y)组成-即使顶点着色器中的类型为vec4
。缺少的组件将分别自动设置为0(对于y和z)1(对于w).啊,好吧,我简化了这个示例,去掉了我认为不相关的内容。我在代码中替换了这一行,但仍然没有得到任何渲染。重新编辑帖子以反映您的评论谢谢,这正是发生的事情:渲染前调用了着色器析构函数。我不清楚如何“删除副本构造函数”,我只是让它们成为空函数吗?这实际上没有帮助,但可能它指出了更多我做错的事情!