C++ 纹理贴图在Windows中不起作用

C++ 纹理贴图在Windows中不起作用,c++,opengl,texture-mapping,C++,Opengl,Texture Mapping,我想使用opengl将视频渲染到glwidget。目前我正在使用glDrawPixels来渲染视频。它在windows和linux中运行良好。为了获得更好的性能,我尝试使用linux进行纹理映射,但在windows中我得到了白色屏幕。 你能帮我解决这个问题吗?同时附上样本代码 GLWidget::GLWidget(QWidget *parent) : QGLWidget (parent) { initializeGL(); DisplayImage(); } void GLWid

我想使用opengl将视频渲染到glwidget。目前我正在使用glDrawPixels来渲染视频。它在windows和linux中运行良好。为了获得更好的性能,我尝试使用linux进行纹理映射,但在windows中我得到了白色屏幕。 你能帮我解决这个问题吗?同时附上样本代码

GLWidget::GLWidget(QWidget *parent) : QGLWidget (parent)
{
   initializeGL();
    DisplayImage();

}
void GLWidget::initializeGL()
{
    //qglClearColor(qtBlack.dark());
    glEnable(GL_CULL_FACE);
    glShadeModel(GL_SMOOTH);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    //glEnable(GL_MULTISAMPLE);
    static GLfloat lightPosition[4] = { 0.5, 5.0, 7.0, 1.0 };
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
    //cameraPos = 0;
    glEnable(GL_TEXTURE_2D);
    DisplayImage();
}
void GLWidget:: DisplayImage( )
{
    QImage img;

    if(!img.load("1146625_532685140120225_1868914019_n.jpg")){
       // std::cerr << "ERROR in loading image" << std::endl;
    }
    img  = img.scaled(this->width(),this->height(),Qt::IgnoreAspectRatio);
    QImage t = QGLWidget::convertToGLFormat(img);

    glGenTextures(1, &imageID);
    glBindTexture(GL_TEXTURE_2D, imageID);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits());

    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glBindTexture( GL_TEXTURE_2D, 0 );
}
void GLWidget::resizeGL(int width, int height)
{
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
   // gluOrtho2D(0, width, height, 0);    // flip the y axis
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void GLWidget::paintGL()
{
        glClearColor( 0.0f, 0.0f, 0.0f, 0.0f);
        glClear( GL_COLOR_BUFFER_BIT );


        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity();

        glShadeModel( GL_FLAT );
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);
        glEnable(GL_TEXTURE_2D);
        glColor3f(1.5, 1.5, 1);
        glBindTexture(GL_TEXTURE_2D,imageID);

        glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 1.0f); glVertex2f(-0.5f, 0.5f);  // vertex 1
        glTexCoord2f(0.0f, 0.0f); glVertex2f(-0.5f, -0.5f); // vertex 2
        glTexCoord2f(1.0f, 0.0f); glVertex2f(0.5f, -0.5f); // vertex 3
        glTexCoord2f(1.0f, 1.0f); glVertex2f(0.5f, 0.5f); // vertex 4
        glEnd();
        glDisable(GL_TEXTURE_2D);

        glFlush();
}
GLWidget::GLWidget(QWidget*parent):QGLWidget(parent)
{
初始化egl();
显示图像();
}
void GLWidget::initializeGL()
{
//qglClearColor(qtback.dark());
glEnable(GL_CULL_面);
glShadeModel(GL_平滑);
glEnable(德国劳埃德大学照明);
glEnable(GL_LIGHT0);
//glEnable(GL_多样本);
静态GLfloat lightPosition[4]={0.5,5.0,7.0,1.0};
glLightfv(GL_LIGHT0,GL_位置,lightPosition);
//cameraPos=0;
glEnable(GL_纹理_2D);
显示图像();
}
void GLWidget::DisplayImage()
{
QImage img;
如果(!img.load(“1146625_532685140120225_1868914019_n.jpg”)){
//std::cerr height(),Qt::IgnoreAspectRatio);
QImage t=QGLWidget::convertToGLFormat(img);
glGenTextures(1,&imageID);
glBindTexture(GL_TEXTURE_2D,imageID);
GLTEXAGE2D(GL_纹理_2D,0,3,t.宽度(),t.高度(),0,GL_RGBA,GL_无符号_字节,t.位());
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
glBindTexture(GL_TEXTURE_2D,0);
}
void GLWidget::resizeGL(整数宽度、整数高度)
{
glViewport(0,0,宽度,高度);
glMatrixMode(GL_投影);
glLoadIdentity();
//gluOrtho2D(0,宽度,高度,0);//翻转y轴
glMatrixMode(GLU模型视图);
glLoadIdentity();
}
void GLWidget::paintGL()
{
glClearColor(0.0f、0.0f、0.0f、0.0f);
glClear(GLU颜色缓冲位);
glMatrixMode(GLU模型视图);
glLoadIdentity();
glShadeModel(GLU平面);
glEnable(德国劳埃德大学照明);
glEnable(GL_LIGHT0);
glEnable(GL_纹理_2D);
GL3F(1.5,1.5,1);
glBindTexture(GL_TEXTURE_2D,imageID);
glBegin(GL_QUADS);
glTexCoord2f(0.0f,1.0f);glVertex2f(-0.5f,0.5f);//顶点1
glTexCoord2f(0.0f,0.0f);glVertex2f(-0.5f,-0.5f);//顶点2
glTexCoord2f(1.0f,0.0f);glVertex2f(0.5f,-0.5f);//顶点3
glTexCoord2f(1.0f,1.0f);glVertex2f(0.5f,0.5f);//顶点4
格伦德();
glDisable(GL_纹理_2D);
glFlush();
}

@BartekBanachewicz是的,我在调用GltexImage2d后遇到1281个错误。你考虑过修复它吗?@BartekBanachewicz我试图通过更改宽度和高度来解决这个问题。如果它是256*256,我得到的是正确的图像。如果宽度和高度是2的幂,那么只有它工作。我们能克服这个限制吗?NPOT(非二次幂)纹理支持可能取决于驱动程序。如果您使用的是OpenGL版本和图形卡,则可能无法使用非二次幂纹理