Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Qt5, OpenGL] Texturowanie sześcianu - problem!

Ostatnio zmodyfikowano 2017-04-22 12:21
Autor Wiadomość
wojownik266
Temat założony przez niniejszego użytkownika
[Qt5, OpenGL] Texturowanie sześcianu - problem!
» 2017-04-21 10:31:48
Zabrałem się za pisanie bardzo prostego programu, którego zadaniem jest oteksturowanie sześcianu. Program ładnie wyświetla bryłę sześcianu ale niestety bez tekstur.  Czy ktoś bardziej obeznany z OpenGl mógłby rzucić okiem  na kod tego programu i powiedzieć co źlę zrobiłem i jak to naprawić?
Przypuszczam że głównym podejrzanym będzie funkcja wczytująca teksturę ale nie wiem tego na pewno…

C/C++
#-------------------------------------------------
#
# Project created by QtCreator 2017-04-20T19:58:29
#
#-------------------------------------------------

QT += core gui opengl

greaterThan( QT_MAJOR_VERSION, 4 )
    : QT += widgets TARGET = OpenGL_Texture_001 TEMPLATE = app SOURCES += main.cpp\
 mainwindow.cpp cpp\
 qglbegin.cpp HEADERS += mainwindow.h h\
 qglbegin.h FORMS += mainwindow.ui LIBS += - lopengl32 - lglu32
C/C++
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
    class MainWindow;
}

class MainWindow
    : public QMainWindow
{
    Q_OBJECT
   
public:
    explicit MainWindow( QWidget * parent = 0 );
    ~MainWindow();
   
private slots:
    void on_pushButton_pressed();
   
private:
    Ui::MainWindow * ui;
};

#endif // MAINWINDOW_H

C/C++
#ifndef QGLBEGIN_H
#define QGLBEGIN_H

#include <QtWidgets>
#include <QTimer>

class QGLBegin
    : public QOpenGLWidget
{
    Q_OBJECT
public:
    explicit QGLBegin( QWidget * parent = 0 );
    void Rysuj();
    void loadGLTextures();
   
protected:
    void initializeGL();
    void paintGL();
    void resizeGL( int width, int height );
   
    signals:
   
public slots:
   
private:
    GLuint texture[ 2 ];
    QTimer * czas;
};

#endif // QOGLBEGIN_H
C/C++
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow( QWidget * parent )
    : QMainWindow( parent )
     , ui( new Ui::MainWindow )
{
    ui->setupUi( this );
}

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

void MainWindow::on_pushButton_pressed()
{
    ui->openGLWidget->Rysuj();
}


C/C++
#include "qglbegin.h"
#include <QOpenGLWidget>

#include <gl\gl.h>
#include <gl\glu.h>
#include <cmath>
#include <QGLWidget>

QGLBegin::QGLBegin( QWidget * parent )
    : QOpenGLWidget( parent )
{
   
}

void QGLBegin::initializeGL()
{
   
    loadGLTextures();
    glEnable( GL_TEXTURE_2D );
    glClearColor( 1.0f, 1.0f, 1.0f, 0.0f );
    glClearDepth( 1.0f );
    glEnable( GL_DEPTH_TEST );
    glDepthFunc( GL_LESS );
   
}

void QGLBegin::paintGL()
{
   
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
   
    glLoadIdentity();
    gluLookAt( 5.0f, 5.0f, 5.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f );
   
   
    // store current matrix
    glMatrixMode( GL_MODELVIEW );
    glPushMatrix();
   
   
   
    glBindTexture( GL_TEXTURE_2D, texture[ 0 ] );
    glEnable( GL_LIGHTING );
    glEnable( GL_LIGHT0 );
    // glScalef(2.0,2.0,2.0);
   
    glBegin( GL_QUADS );
   
    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 );
   
    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 );
   
    glTexCoord2f( 1.0f, 0.0f );
    glVertex3f( - 1.0f, - 1.0f, - 1.0f );
    glTexCoord2f( 0.0f, 0.0f );
    glVertex3f( 1.0f, - 1.0f, - 1.0f );
    glTexCoord2f( 0.0f, 1.0f );
    glVertex3f( 1.0f, 1.0f, - 1.0f );
    glTexCoord2f( 1.0f, 1.0f );
    glVertex3f( - 1.0f, 1.0f, - 1.0f );
   
    glTexCoord2f( 1.0f, 0.0f );
    glVertex3f( - 1.0f, - 1.0f, 1.0f );
    glTexCoord2f( 0.0f, 0.0f );
    glVertex3f( - 1.0f, - 1.0f, - 1.0f );
    glTexCoord2f( 0.0f, 1.0f );
    glVertex3f( - 1.0f, 1.0f, - 1.0f );
    glTexCoord2f( 1.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 );
    glTexCoord2f( 0.0f, 1.0f );
    glVertex3f( - 1.0f, 1.0f, - 1.0f );
   
    glTexCoord2f( 1.0f, 0.0f );
    glVertex3f( - 1.0f, - 1.0f, 1.0f );
    glTexCoord2f( 0.0f, 0.0f );
    glVertex3f( 1.0f, - 1.0f, 1.0f );
    glTexCoord2f( 0.0f, 1.0f );
    glVertex3f( 1.0f, - 1.0f, - 1.0f );
    glTexCoord2f( 1.0f, 1.0f );
    glVertex3f( - 1.0f, - 1.0f, - 1.0f );
   
    glEnd();
    glDisable( GL_LIGHTING );
   
   
    // restore current matrix
    glMatrixMode( GL_MODELVIEW );
    glPopMatrix();
   
   
   
}

void QGLBegin::resizeGL( int width, int height )
{
    //set viewport
    glViewport( 0, 0, width, height );
   
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
   
    //set persepective
    //change the next line order to have a different perspective
    GLdouble aspect_ratio =( GLdouble ) width /( GLdouble ) height;
    gluPerspective( 45.0f, aspect_ratio, 0.1, 100.0 );
   
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
   
   
}
void QGLBegin::loadGLTextures()
{
    QImage t;
    QImage b;
   
    if( !b.load( "logo.bmp" ) )
    {
        qDebug( "Didn't found the image." );
        b = QImage( 16, 16, QImage::Format_RGB32 );
        b.fill( 1 );
       
    }
   
    //t = QGLWidget::convertToGLFormat( b );
    glGenTextures( 1, & texture[ 0 ] );
    glBindTexture( GL_TEXTURE_2D, texture[ 0 ] );
    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 );
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
   
   
}
void QGLBegin::Rysuj()
{
   
    update();
}

C/C++
#include "mainwindow.h"
#include <QApplication>

int main( int argc, char * argv[] )
{
    QApplication a( argc, argv );
    MainWindow w;
    w.show();
   
    return a.exec();
}
P-160322
pekfos
» 2017-04-21 12:11:00
Czy glEnable( GL_TEXTURE_2D ); nie powinno być po ustawieniu wszystkiego z teksturami, w szczególności: po zbindowaniu tekstury?
P-160323
wojownik266
Temat założony przez niniejszego użytkownika
» 2017-04-21 13:52:42
Pokombinowałem trochę z tą instrukcją tak jak piszesz ale uzyskałem jedynie to że sześcian zmienił kolor z niebieskiego na szary. To chyba dobry znak:) No ale to jeszcze nie to:( Może ktoś podsunie jeszcze jakiś pomysł co by te textury było widać?
P-160325
VND
» 2017-04-22 04:31:07
Program jest ok.
Prawdopodobnie masz plik bmp nie tam gdzie trzeba.
Powinien być na zewnątrz folderu debug lub release.
A najprościej podaj po prostu całą ścieżkę do obrazka.
Odkomentuj tą linijkę z t = QGLWidget... inaczej będziesz miał odwrócone kolory.
P-160349
wojownik266
Temat założony przez niniejszego użytkownika
» 2017-04-22 12:21:51
Zrobiłem tak jak mówisz tzn. Podałem całą ścieżkę do pliku bmp i przeniosłem wywołanie metody  loadGLTextures(); do funkcji paintGL i textura bardzo ładnie się wyświetla:) A to by znaczyło że problem został rozwiązany. Dziękuję i życzę Miłego Dnia!
P-160351
« 1 »
  Strona 1 z 1