【问题标题】:c++ opengl texturing does not workc ++ opengl纹理不起作用
【发布时间】:2016-05-24 12:54:13
【问题描述】:

我是 Opengl 的新手,我不是来用 OpenGL 在一个小项目中制作纹理的。

This is my code : 

// myglwidget.cpp

    #include <QtWidgets>
#include <QtOpenGL>
#include <QDebug>
#include <QGLFormat>
#include<QOpenGlTexture>
#include<qimage.h>

#include "myglwidget.h"

int MyGLWidget::loadTextures()
{
    Image = QImage("D:\\workspace\\logo.png");
    Image = QGLWidget::convertToGLFormat(Image);
    if(Image.isNull())
    {
        qDebug() << "isNull"<<endl;
        return 0;
    }
    textures = 1;
    glGenTextures(1, (GLuint*)textures);
    glBindTexture(GL_TEXTURE_2D,(GLuint)textures);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, (GLuint)textures, GL_RGBA, Image.width(), Image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, Image.bits());
    return 1;

}

MyGLWidget::MyGLWidget(QWidget *parent) : QGLWidget(QGLFormat(QGL::SampleBuffers), parent)
{
    xRot = 0;
    yRot = 0;
    zRot = 0;
}

MyGLWidget::~MyGLWidget()
{
}

QSize MyGLWidget::minimumSizeHint() const
{
    return QSize(50, 50);
}

QSize MyGLWidget::sizeHint() const
{
    return QSize(400, 400);
}

static void qNormalizeAngle(int &angle)
{
    while (angle < 0)
        angle += 360 * 16;
    while (angle > 360)
        angle -= 360 * 16;
}

void MyGLWidget::setXRotation(int angle)
{
    qNormalizeAngle(angle);
    if (angle != xRot) {
        xRot = angle;
        emit xRotationChanged(angle);
        updateGL();
    }
}

void MyGLWidget::setYRotation(int angle)
{
    qNormalizeAngle(angle);
    if (angle != yRot) {
        yRot = angle;
        emit yRotationChanged(angle);
        updateGL();
    }
}

void MyGLWidget::setZRotation(int angle)
{
    qNormalizeAngle(angle);
    if (angle != zRot) {
        zRot = angle;
        emit zRotationChanged(angle);
        updateGL();
    }
}

void MyGLWidget::initializeGL()
{
    glEnable(GL_DEPTH_TEST); //On initialise la profondeur
    glEnable(GL_TEXTURE_2D); //On initialise les textures !
}

void MyGLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glEnable(GL_TEXTURE_2D);
    glTranslatef(0.0, 0.0, -10.0);
    glRotatef(xRot / 16.0, 1.0, 0.0, 0.0);
    glRotatef(yRot / 16.0, 0.0, 1.0, 0.0);
    glRotatef(zRot / 16.0, 0.0, 0.0, 1.0);
    draw();
}

void MyGLWidget::resizeGL(int width, int height)
{
    int side = qMin(width, height);
    glViewport((width - side) / 2, (height - side) / 2, side, side);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
#ifdef QT_OPENGL_ES_1
    glOrthof(-2, +2, -2, +2, 1.0, 15.0);
#else
    glOrtho(-2, +2, -2, +2, 1.0, 15.0);
#endif
    glMatrixMode(GL_MODELVIEW);
}

void MyGLWidget::mousePressEvent(QMouseEvent *event)
{
    lastPos = event->pos();
}

void MyGLWidget::mouseMoveEvent(QMouseEvent *event)
{
    int dx = event->x() - lastPos.x();
    int dy = event->y() - lastPos.y();

    if (event->buttons() & Qt::LeftButton) {
        setXRotation(xRot + 8 * dy);
        setYRotation(yRot + 8 * dx);
    } else if (event->buttons() & Qt::RightButton) {
        setXRotation(xRot + 8 * dy);
        setZRotation(zRot + 8 * dx);
    }

    lastPos = event->pos();
}

void MyGLWidget::draw()
{
    qglColor(Qt::red);
    glPushMatrix();
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, textures);
    glBegin(GL_QUADS);
    glNormal3f(0,0,-1);
    glVertex3f(-1,-1,0);
    glVertex3f(-1,1,0);
    glVertex3f(1,1,0);
    glVertex3f(1,-1,0);
    glEnd();
    glDisable(GL_TEXTURE_2D);
    glBegin(GL_TRIANGLES);
    glNormal3f(0,-1,0.707);
    glVertex3f(-1,-1,0);
    glVertex3f(1,-1,0);
    glVertex3f(0,0,1.2);
    glEnd();
    glBegin(GL_TRIANGLES);
    glNormal3f(1,0, 0.707);
    glVertex3f(1,-1,0);
    glVertex3f(1,1,0);
    glVertex3f(0,0,1.2);
    glEnd();
    glBegin(GL_TRIANGLES);
    glNormal3f(0,1,0.707);
    glVertex3f(1,1,0);
    glVertex3f(-1,1,0);
    glVertex3f(0,0,1.2);
    glEnd();
    glBegin(GL_TRIANGLES);
    glNormal3f(-1,0,0.707);
    glVertex3f(-1,1,0);
    glVertex3f(-1,-1,0);
    glVertex3f(0,0,1.2);
    glEnd();
    glPopMatrix();
}

我尝试了许多图像格式(bmp、png、tga),但我从来没有看到纹理。 为了在网上加载纹理,我也尝试了很多功能,但我没有来展示它。我知道图像的路径是好的,并且函数没有返回任何错误。 感谢您的帮助。

【问题讨论】:

  • 即使不在帖子里,我也已经在构造函数中调用了函数loadTexture
  • 您需要指定纹理坐标。应该有很多老问题来解释如何做到这一点。此外,您对glTexImage2D() 的第二个论点是错误的。它应该是纹理级别,在本例中为0

标签: c++ opengl textures


【解决方案1】:

我不确定您使用的是哪个版本的 openGL。但我注意到您的代码中有几个问题。 将 glTexImage2D API 的第二个参数更正为 0(Mipmap 级别), glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Image.width(), Image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, Image.bits());

并使用 glTexCoord2f() 为每个漩涡添加纹理坐标

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textures);
glBegin(GL_QUADS);
glNormal3f(0,0,-1);
glVertex3f(-1,-1,0);
glTexCoord2f(0, 0); //tex Coord (0, 0)
glVertex3f(-1,1,0);
glTexCoord2f(1, 0); //tex Coord (1, 0)
glVertex3f(1,1,0);
glTexCoord2f(1, 1); //tex Coord (1, 1)
glVertex3f(1,-1,0);
glTexCoord2f(0, 1); //tex Coord (0, 1)
glEnd();
glDisable(GL_TEXTURE_2D);

希望这会奏效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2013-04-21
    • 2017-11-26
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多