c++ - Qt OpenGL 纹理为黑色

标签 c++ qt opengl textures

我需要将纹理加载到正方形上,但每当我启动程序时,我都看不到任何纹理,只有一个黑色正方形。

代码如下:

GLuint texture;

interactiveScenes::interactiveScenes(QWidget *parent) :
    QGLWidget(parent), ui(new Ui::interactiveScenes)
{
    ui->setupUi(this);

    timer = new QTimer();
    connect( timer, SIGNAL(timeout()), this, SLOT(updateGL()) );

    setFocusPolicy(Qt::StrongFocus);

    lockMouse = true;

   camPosx = 2.0,  camPosy = 2.0,    camPosz = 25.0;
   camViewx = 2.0, camViewy = 2.0, camViewz = 0.0;
   camUpx = 0.0,   camUpy = 1.0,   camUpz = 0.0;

   mouseX = QCursor::pos().x();
   mouseY = QCursor::pos().y();
   setMouseTracking(true);

}

interactiveScenes::~interactiveScenes()
{
    delete ui;
}

void interactiveScenes::initializeGL()
{
    // Initialize QGLWidget (parent)
    QGLWidget::initializeGL();

    glShadeModel(GL_SMOOTH);

    // White canvas
    glClearColor(1.0f,1.0f,1.0f,0.0f);

    // Place light
    glEnable( GL_LIGHTING );
    glEnable( GL_LIGHT0 );
    glEnable(GL_DEPTH_TEST);

    GLfloat light0_position [] = {0.1f, 0.1f, 5.0f, 0.0f};
    GLfloat light_diffuse []={ 1.0, 1.0, 1.0, 1.0 };
    glLightfv ( GL_LIGHT0, GL_POSITION, light0_position );
    glLightfv ( GL_LIGHT0, GL_DIFFUSE, light_diffuse );

    glEnable(GL_TEXTURE_2D);
    img = new QImage(":/images/images.jpg", "JPG");
    if (img->isNull())
        std::cout << "error" <<std::endl;

    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);

    QImage tex = QGLWidget::convertToGLFormat(*img);
    if (tex.isNull())
        std::cout << "error" <<std::endl;

    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA,
                tex.width(), tex.height(),
                0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glDisable(GL_TEXTURE_2D);

    timer->start(50);
}

void interactiveScenes::resizeGL(GLint width, GLint height)
{
    if ((width<=0) || (height<=0))
        return;

    //set viewport
    glViewport(0,0,width,height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    //set persepective
    GLdouble aspect_ratio=(GLdouble)width/(GLdouble)height;
    gluPerspective(45.0f, aspect_ratio, 0.1, 40.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void interactiveScenes::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();

    // store current matrix
    glMatrixMode( GL_MODELVIEW );
    glPushMatrix( );

    gluLookAt(camPosx ,camPosy ,camPosz,
        camViewx,camViewy,camViewz,
        camUpx, camUpy, camUpz );

    //Draw Axes
    glDisable( GL_LIGHTING );
    glBegin(GL_LINES);
    glColor3f(1.0, 0.0, 0.0);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(10.0, 0.0, 0.0);
    glColor3f(0.0, 1.0, 0.0);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(0.0, 10.0, 0.0);
    glColor3f(0.0, 0.0, 1.0);
    glVertex3f(0.0, 0.0, 0.0);
    glVertex3f(0.0, 0.0, 10.0);
    glEnd();
    glEnable( GL_LIGHTING );

    glEnable(GL_LIGHTING);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);

    glColor3f( 1.0,  0.0,  0.0 );
    glBegin(GL_POLYGON);

    glTexCoord2d( 0.0, 5.0 );
    glVertex3f(  0.0f, 3.0f, 0.0f );

    glTexCoord2d( 0.0, 0.0);
    glVertex3f(  0.0f, 0.0f, 0.0f );

    glTexCoord2d( 5.0, 0.0);
    glVertex3f( 3.0f, 0.0f, 0.0f );

    glTexCoord2d( 5.0, 5.0);
    glVertex3f( 3.0f, 3.0f, 0.0f );
    glEnd();
    glDisable(GL_TEXTURE_2D);

    glPushMatrix();

    glTranslated(2.0, 2.0 ,-4);

    GLfloat shin[] = { 12.8f };
    GLfloat amb[] = { 0.135f, 0.2225f, 0.1575f, 0.95f };
    GLfloat diff2 [] = { 0.54f , 0.89f , 0.63f, 0.95f };
    GLfloat specular[] = { 0.316228f, 0.316228f, 0.316228f, 0.95f };

    glMaterialfv ( GL_FRONT, GL_SPECULAR, specular);
    glMaterialfv ( GL_FRONT, GL_SHININESS, shin);
    glMaterialfv ( GL_FRONT, GL_AMBIENT, amb);
    glMaterialfv ( GL_FRONT, GL_DIFFUSE, diff2 );

    solidSphere(2, 25, 25);

    glPopMatrix();

    // restore current matrix
    glMatrixMode( GL_MODELVIEW );
    glPopMatrix( );
}

图像从我的资源文件中加载正常,我认为它是 convertToGLFormat 的东西,但它也返回图像。

最佳答案

感谢 agrum,我发现了这个问题,我测试了这个正方形是否会显示任何颜色,但它没有。 在应用纹理/颜色之前我没有禁用照明。 在应用纹理时禁用光照后一切正常!

关于c++ - Qt OpenGL 纹理为黑色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23764289/

相关文章:

c++ - 在 C++ 中,表达式和文字有什么区别?

Qt显示带有文本输入的消息框

c++ - QAbstractItemModel:为什么在将大量项目插入模型时发出 dataChanged 和插入行信号如此缓慢?

c++ - 初始化 QGenericMatrix

c++ - 离屏渲染(使用 FBO 和 RenderBuffer)以及颜色、深度、模板的像素传输

c++ - OpenGL GL_POLYGON_SMOOTH 二维抗锯齿从四边形创建三边形

linux - 强制现有的 OpenGL 应用程序在 headless 机器上渲染屏幕外

c++ - 在 C++11 中处理毫秒的正确方法是什么

c++ - delete 如何知道对象在内存中的起始位置?

c++ - 如何从运行时值转换为模板参数?