Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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帧缓冲区屏幕外到纹理、颜色错误_C++_Qt_Opengl_Framebuffer - Fatal编程技术网

C++ opengl帧缓冲区屏幕外到纹理、颜色错误

C++ opengl帧缓冲区屏幕外到纹理、颜色错误,c++,qt,opengl,framebuffer,C++,Qt,Opengl,Framebuffer,我正在尝试使用帧缓冲区进行屏幕外渲染立方体。然后我尝试使用它的纹理将其转换为纹理。我遇到的问题是,当我尝试将纹理放置在平面上时。纹理颜色完全基于一种原色:芦苇、绿色或蓝色。我不知道问题出在哪里,可能是从浮动到双精度的铸造问题?我真的不知道该怎么想,也不知道该去哪里探索 这是我得到的gif。在此gif中,您可以看到正常的立方体,而无需屏幕外渲染。第二个绿色立方体是打印在平面上的帧缓冲区纹理: 这是我使用的代码。它基于Qt,但与glut没有区别。我解释它是为了更容易理解: initializeG

我正在尝试使用帧缓冲区进行屏幕外渲染立方体。然后我尝试使用它的纹理将其转换为纹理。我遇到的问题是,当我尝试将纹理放置在平面上时。纹理颜色完全基于一种原色:芦苇、绿色或蓝色。我不知道问题出在哪里,可能是从浮动到双精度的铸造问题?我真的不知道该怎么想,也不知道该去哪里探索

这是我得到的gif。在此gif中,您可以看到正常的立方体,而无需屏幕外渲染。第二个绿色立方体是打印在平面上的帧缓冲区纹理:


这是我使用的代码。它基于Qt,但与glut没有区别。我解释它是为了更容易理解:

  • initializeGL:我声明帧缓冲区及其附件
  • PaintGL:如果我没有“左键单击”启用此功能,则不使用FB绘制立方体(gif的第一部分,它工作正常)。如果我左键单击,则例程将更改并在帧缓冲区上绘制立方体,然后在平面上绘制其纹理(gif的第二部分,它将我的纹理涂成绿色)
  • setProyection:将正常立方体绘制的光圈设置为

  • 如果需要,这里是头文件:

    #ifndef WIDGETOPENGL_H
    #define WIDGETOPENGL_H
    #include <QtWidgets/QMainWindow>
    #include <QtWidgets/qopenglwidget.h>
    #include <QtOpenGL>
    #include <GL/GLU.h>
    
    
    class WidgetOpenGL : public QOpenGLWidget, protected QOpenGLFunctions
    {
        Q_OBJECT
    
    public:
        WidgetOpenGL(QWidget *parent);
    
    signals:
        void screenClicked();
    protected:
        void initializeGL();
        void paintGL();
        void resizeGL(int w, int h);
    
        void setViewport();
        void setProyection();
        void setModelView();
    
    private:
        int initX;
        int initY;
        QOpenGLFramebufferObject *frameBuffer;
        GLuint buffer;
        GLuint renderedTexture;
        GLuint renderedDepth;
        bool buttonpressed;
        QImage image;
        GLdouble desplazamientoX;
        GLdouble desplazamientoY;
        void setRotation();
        void mouseMoveEvent(QMouseEvent *event);
        void mousePressEvent(QMouseEvent *event);
    
    };
    
    #endif
    
    \ifndef WIDGETOPENGL\u H
    #定义WIDGETOPENGL_H
    #包括
    #包括
    #包括
    #包括
    WidgetOpenGL类:公共QOpenGLWidget,受保护的QOpenGLFunctions
    {
    Q_对象
    公众:
    WidgetOpenGL(QWidget*父项);
    信号:
    void screensclicked();
    受保护的:
    void initializeGL();
    void paintGL();
    无效尺寸(整数w,整数h);
    void setViewport();
    void setProyection();
    void setModelView();
    私人:
    int initX;
    完整性;
    QOpenGLFramebufferObject*帧缓冲区;
    胶合缓冲液;
    胶合渲染纹理;
    GLuint Renderdepth;
    按下按钮;
    图像;
    gl-双黑色素瘤;
    GLD双desplazamientoY;
    void setRotation();
    作废mouseMoveEvent(QMouseEvent*事件);
    作废鼠标压力事件(QMouseEvent*事件);
    };
    #恩迪夫
    
    已解决!问题是我在绿色平面上绘制纹理。这是因为最后一个glcolor3f是绿色的(当我绘制真实立方体的后平面时使用)


    在绘制平面之前,我只需添加glColor3f(1.0,1.0,1.0),即可生成白色平面。

    已解决!问题是我在绿色平面上绘制纹理。这是因为最后一个glcolor3f是绿色的(当我绘制真实立方体的后平面时使用)


    在绘制平面之前,我只需添加glColor3f(1.0,1.0,1.0)即可生成白色平面。

    您好,欢迎来到StackOverflow。我确实觉得这对于新手来说是一个非常高质量的问题,但是请花一些时间阅读帮助页面,特别是命名为和的部分。更重要的是,请阅读。您可能还想了解。如果您有更多的问题要问,您可能希望在后面的问题中理解这些。i需要大写,否则您的问题将无法验证。您好,欢迎来到StackOverflow。我确实觉得这对于新手来说是一个非常高质量的问题,但是请花一些时间阅读帮助页面,特别是命名为和的部分。更重要的是,请阅读。您可能还想了解。如果您有更多问题要问,您可能希望在后面的问题中理解这些内容。i需要大写,否则您的问题将无法验证。
    #ifndef WIDGETOPENGL_H
    #define WIDGETOPENGL_H
    #include <QtWidgets/QMainWindow>
    #include <QtWidgets/qopenglwidget.h>
    #include <QtOpenGL>
    #include <GL/GLU.h>
    
    
    class WidgetOpenGL : public QOpenGLWidget, protected QOpenGLFunctions
    {
        Q_OBJECT
    
    public:
        WidgetOpenGL(QWidget *parent);
    
    signals:
        void screenClicked();
    protected:
        void initializeGL();
        void paintGL();
        void resizeGL(int w, int h);
    
        void setViewport();
        void setProyection();
        void setModelView();
    
    private:
        int initX;
        int initY;
        QOpenGLFramebufferObject *frameBuffer;
        GLuint buffer;
        GLuint renderedTexture;
        GLuint renderedDepth;
        bool buttonpressed;
        QImage image;
        GLdouble desplazamientoX;
        GLdouble desplazamientoY;
        void setRotation();
        void mouseMoveEvent(QMouseEvent *event);
        void mousePressEvent(QMouseEvent *event);
    
    };
    
    #endif