Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL着色器没有绘制任何东西-错误的sprite类_C++_Opengl_Glfw - Fatal编程技术网

C++ OpenGL着色器没有绘制任何东西-错误的sprite类

C++ 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

我试图将OpenGL渲染封装在渲染器类中

我很确定我的window类工作正常(我已经检查了错误),但我认为错误在我的sprite类中,但我不知道它是什么

这是我的精灵课:

sprite_渲染器.hpp

\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).啊,好吧,我简化了这个示例,去掉了我认为不相关的内容。我在代码中替换了这一行,但仍然没有得到任何渲染。重新编辑帖子以反映您的评论谢谢,这正是发生的事情:渲染前调用了着色器析构函数。我不清楚如何“删除副本构造函数”,我只是让它们成为空函数吗?这实际上没有帮助,但可能它指出了更多我做错的事情!