Qt4 Qt QGLWidget GLuint阵列内存对齐问题

Qt4 Qt QGLWidget GLuint阵列内存对齐问题,qt4,texture-mapping,memory-alignment,qglwidget,Qt4,Texture Mapping,Memory Alignment,Qglwidget,我正在使用QGLWidget子类跟踪Qt中的。到目前为止,我还没有遇到任何问题,在纹理贴图上,他引入了旋转框的纹理。我让一切都正常工作,然后尝试在立方体的每一侧添加我自己的纹理。我使用QGLWidget::bindTexture()函数加载通过Qt资源系统存储的256x256 bmp文件,并将GLuint id保存在私有成员数组中。在paintGL()中,我使用GL_TEXTURE_2D和一个GLuint数组元素作为参数调用glBindTexture(),然后为正方形的每个面调用glBegin(

我正在使用QGLWidget子类跟踪Qt中的。到目前为止,我还没有遇到任何问题,在纹理贴图上,他引入了旋转框的纹理。我让一切都正常工作,然后尝试在立方体的每一侧添加我自己的纹理。我使用QGLWidget::bindTexture()函数加载通过Qt资源系统存储的256x256 bmp文件,并将GLuint id保存在私有成员数组中。在paintGL()中,我使用GL_TEXTURE_2D和一个GLuint数组元素作为参数调用glBindTexture(),然后为正方形的每个面调用glBegin(GL_四边形)和glEnd()。它编译得很好,但是长方体要么呈现完全白色(好像它可能找不到纹理),要么在旋转绘制过程中出现疯狂的黑白伪影,屏幕上到处都是随机线

当事情奇迹般地开始工作时,我设法通过在类声明的末尾添加另一个私有数据成员来解决问题,并决定在类声明中将GLuint纹理数组的声明向上移动,这似乎是可行的。我对记忆对齐很无知,这似乎是最明显的原因,我想解释一下这里发生了什么

如果有关系,这是在Qt4.6上,在GCC4.4.0和GNU Make 3.8.1的mingW5.1.6上编译的(我应该升级)

守则: glwidget.hpp,在底部注释了有问题的声明

    #ifndef GLWIDGET_HPP
    #define GLWIDGET_HPP

    #include <QtOpenGL>

    class QTimer;

    class GLWidget : public QGLWidget
    {
    Q_OBJECT

    public:
        GLWidget( QWidget *parent = 0 );
        ~GLWidget();

    protected:
        void initializeGL();
        void paintGL();
        void resizeGL( int width, int height );

    private:
        void drawCube();
        void loadTextures();

        QTimer  *m_timer;
        GLuint  m_textures[6]; // doesn't cause rendering problems here
        GLfloat m_xrot, m_yrot, m_zrot;
    //  GLuint  m_textures[6]; // causes rendering problems if declared here
    };

    #endif
\ifndef GLWIDGET\u水电站
#定义GLU水电站
#包括
类QTimer;
类GLWidget:publicqglwidget
{
Q_对象
公众:
GLWidget(QWidget*parent=0);
~GLWidget();
受保护的:
void initializeGL();
void paintGL();
空隙大小(内部宽度、内部高度);
私人:
void drawCube();
void loadTextures();
QTimer*m_定时器;
GLuint m_纹理[6];//在这里不会导致渲染问题
GLfloat m_xrot、m_yrot、m_zrot;
//GLuint m_纹理[6];//如果在此处声明,则会导致渲染问题
};
#恩迪夫
glwidget.cpp

    #include "glwidget.hpp"

    #include <QTimer>

    GLWidget::GLWidget( QWidget *parent )
        : QGLWidget( QGLFormat(QGL::SampleBuffers), parent )
    {
        m_timer = new QTimer( this );
        m_timer->setSingleShot( false );
        connect( m_timer, SIGNAL(timeout()), this, SLOT(updateGL()) );
        m_timer->start( 7 );

        setWindowTitle( "NeHe Lesson 6" );
    }

    GLWidget::~GLWidget()
    {
        glDeleteTextures( 6, m_textures );
    }

    void GLWidget::initializeGL()
    {
        glShadeModel( GL_SMOOTH );  // Enable smooth shading
        qglClearColor( Qt::black );
        glClearDepth( 1.0f );   // Depth buffer setup
        glEnable( GL_DEPTH_TEST );
        glEnable( GL_TEXTURE_2D );
        glDepthFunc( GL_LEQUAL );
        glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );

        loadTextures();
    }

    void GLWidget::loadTextures()
    {
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

        m_textures[0] = bindTexture( QPixmap(":/img/scifi.bmp") );
        m_textures[1] = bindTexture( QPixmap(":/img/scifi2.bmp") );
        m_textures[2] = bindTexture( QPixmap(":/img/scifi3.bmp") );
        m_textures[3] = bindTexture( QPixmap(":/img/scifi4.bmp") );
        m_textures[4] = bindTexture( QPixmap(":/img/scifi5.bmp") );
        m_textures[5] = bindTexture( QPixmap(":/img/scifi6.bmp") );
    }

    void GLWidget::drawCube()
    {
        // Front face
        glBindTexture( GL_TEXTURE_2D, m_textures[0] );
        glBegin( GL_QUADS );
            glNormal3f( 0.0f, 0.0f, 1.0f );
            glTexCoord2f( 0.0f, 0.0f ); glVertex3f(-1.0f,-1.0f, 1.0f ); // Bottom left
            glTexCoord2f( 1.0f, 0.0f ); glVertex3f( 1.0f,-1.0f, 1.0f ); // Bottom right
            glTexCoord2f( 1.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, 1.0f ); // Top right
            glTexCoord2f( 0.0f, 1.0f ); glVertex3f(-1.0f, 1.0f, 1.0f ); // Top left
        glEnd();

        // Back face
        glBindTexture( GL_TEXTURE_2D, m_textures[1] );
        glBegin( GL_QUADS );
            glNormal3f( 0.0f, 0.0f, -1.0f );
            glTexCoord2f( 1.0f, 0.0f ); glVertex3f(-1.0f,-1.0f,-1.0f ); // Bottom right
            glTexCoord2f( 1.0f, 1.0f ); glVertex3f(-1.0f, 1.0f,-1.0f ); // Top right
            glTexCoord2f( 0.0f, 1.0f ); glVertex3f( 1.0f, 1.0f,-1.0f ); // Top left
            glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 1.0f,-1.0f,-1.0f ); // Bottom left
        glEnd();

        // Top Face
        glBindTexture( GL_TEXTURE_2D, m_textures[2] );
        glBegin( GL_QUADS );
            glNormal3f( 0.0f, 1.0f, 0.0f );
            glTexCoord2f( 0.0f, 1.0f ); glVertex3f(-1.0f, 1.0f,-1.0f ); // Top left
            glTexCoord2f( 0.0f, 0.0f ); glVertex3f(-1.0f, 1.0f, 1.0f ); // Bottom left
            glTexCoord2f( 1.0f, 0.0f ); glVertex3f( 1.0f, 1.0f, 1.0f ); // Bottom right
            glTexCoord2f( 1.0f, 1.0f ); glVertex3f( 1.0f, 1.0f,-1.0f ); // Top right
        glEnd();

        // Bottom Face
        glBindTexture( GL_TEXTURE_2D, m_textures[3] );
        glBegin( GL_QUADS );
            glNormal3f( 0.0f, -1.0f, 0.0f );
            glTexCoord2f( 1.0f, 1.0f ); glVertex3f(-1.0f,-1.0f,-1.0f ); // Top right
            glTexCoord2f( 0.0f, 1.0f ); glVertex3f( 1.0f,-1.0f,-1.0f ); // Top left
            glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 1.0f,-1.0f, 1.0f ); // Bottom left
            glTexCoord2f( 1.0f, 0.0f ); glVertex3f(-1.0f,-1.0f, 1.0f ); // Bottom right
        glEnd();

        // Right face
        glBindTexture( GL_TEXTURE_2D, m_textures[4] );
        glBegin( GL_QUADS );
            glNormal3f( 1.0f, 0.0f, 0.0f );
            glTexCoord2f( 1.0f, 0.0f ); glVertex3f( 1.0f,-1.0f,-1.0f ); // Bottom right
            glTexCoord2f( 1.0f, 1.0f ); glVertex3f( 1.0f, 1.0f,-1.0f ); // Top right
            glTexCoord2f( 0.0f, 1.0f ); glVertex3f( 1.0f, 1.0f, 1.0f ); // Top left
            glTexCoord2f( 0.0f, 0.0f ); glVertex3f( 1.0f,-1.0f, 1.0f ); // Bottom left
        glEnd();

        // Left Face
        glBindTexture( GL_TEXTURE_2D, m_textures[5] );
        glBegin( GL_QUADS );
            glNormal3f( -1.0f, 0.0f, 0.0f );
            glTexCoord2f( 0.0f, 0.0f ); glVertex3f(-1.0f,-1.0f,-1.0f ); // Bottom left
            glTexCoord2f( 1.0f, 0.0f ); glVertex3f(-1.0f,-1.0f, 1.0f ); // Bottom right
            glTexCoord2f( 1.0f, 1.0f ); glVertex3f(-1.0f, 1.0f, 1.0f ); // Top right
            glTexCoord2f( 0.0f, 1.0f ); glVertex3f(-1.0f, 1.0f,-1.0f ); // Top left
        glEnd();
    }

    void GLWidget::paintGL()
    {
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
        glLoadIdentity();
        glTranslatef( 0.0f, 0.0f, -5.0f );
        glRotatef( m_xrot, 1.0f, 0.0f, 0.0f );
        glRotatef( m_yrot, 0.0f, 1.0f, 0.0f );
        glRotatef( m_zrot, 0.0f, 0.0f, 1.0f );
        drawCube();

        m_xrot += 0.3f;
        m_yrot += 0.2f;
        m_zrot += 0.4f;
    }

    void GLWidget::resizeGL( int width, int height )
    {
        if( height == 0 )
            height = 1;

        glViewport( 0, 0, width, height );
        glMatrixMode( GL_PROJECTION );
        glLoadIdentity();
        gluPerspective( 45.0f, static_cast<GLfloat>(width)/height, 0.1f, 100.0f );
        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity();
    }
#包括“glwidget.hpp”
#包括
GLWidget::GLWidget(QWidget*父项)
:QGLWidget(QGLFormat(QGL::SampleBuffers),父级)
{
m_timer=新的QTimer(此);
m_定时器->设置单显示(假);
连接(m_定时器、信号(timeout())、此、插槽(updateGL());
m_定时器->启动(7);
setWindowTitle(“NeHe第6课”);
}
GLWidget::~GLWidget()
{
glDeleteTextures(6,m_纹理);
}
void GLWidget::initializeGL()
{
glShadeModel(GL_平滑);//启用平滑着色
qglClearColor(Qt::黑色);
glClearDepth(1.0f);//深度缓冲区设置
glEnable(GLU深度试验);
glEnable(GL_纹理_2D);
glDepthFunc(GL_LEQUAL);
glHint(GL\u透视图\u校正\u提示,GL\u最佳);
加载纹理();
}
void GLWidget::loadTextures()
{
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
m_textures[0]=bindTexture(QPixmap(:/img/scfi.bmp));
m_textures[1]=bindTexture(QPixmap(:/img/scifi2.bmp));
m_textures[2]=bindTexture(QPixmap(:/img/scifi3.bmp));
m_textures[3]=bindTexture(QPixmap(:/img/scifi4.bmp));
m_textures[4]=bindTexture(QPixmap(:/img/scifi5.bmp));
m_textures[5]=bindTexture(QPixmap(:/img/scifi6.bmp));
}
void GLWidget::drawCube()
{
//正面
glBindTexture(GL_纹理_2D,m_纹理[0]);
glBegin(GL_QUADS);
glNormal3f(0.0f、0.0f、1.0f);
glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);//左下角
glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);//右下角
glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f,1.0f,1.0f);//右上角
glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);//左上角
格伦德();
//背面
glBindTexture(GL_纹理_2D,m_纹理[1]);
glBegin(GL_QUADS);
glNormal3f(0.0f,0.0f,-1.0f);
glTexCoord2f(1.0f,0.0f);glVertex3f(-1.0f,-1.0f,-1.0f);//右下角
glTexCoord2f(1.0f,1.0f);glVertex3f(-1.0f,1.0f,-1.0f);//右上角
glTexCoord2f(0.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);//左上角
glTexCoord2f(0.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);//左下角
格伦德();
//顶面
glBindTexture(GL_纹理_2D,m_纹理[2]);
glBegin(GL_QUADS);
glNormal3f(0.0f、1.0f、0.0f);
glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,-1.0f);//左上角
glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,1.0f,1.0f);//左下角
glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,1.0f,1.0f);//右下角
glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);//右上角
格伦德();
//底面
glBindTexture(GL_纹理_2D,m_纹理[3]);
glBegin(GL_QUADS);
glNormal3f(0.0f,-1.0f,0.0f);
glTexCoord2f(1.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);//右上角
glTexCoord2f(0.0f,1.0f);glVertex3f(1.0f,-1.0f,-1.0f);//左上角
glTexCoord2f(0.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);//左下角
glTexCoord2f(1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);//右下角
格伦德();
//右脸
glBindTexture(GL_纹理_2D,m_纹理[4]);
glBegin(GL_QUADS);
glNormal3f(1.0f、0.0f、0.0f);
glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);//右下角