Hej! Może to głupie pytanie - ale skąd pobrać biblioteki (lib i pliki nagłówkowe) OpenGL i GLUT dla środowiska lcc-win32 lub np QT.
Chodzi o to, że na standardowych bibliotekach zawartych w tych środowiskach nie kompilują się przykłady z NeHE. :/
Może te będą pasować?
http://www.opengl.org/resources/libraries/windowtoolkits/
A co się dzieje, że się nie kompilują?
LOSMARCELOS napisał(a)
Hej! Może to głupie pytanie - ale skąd pobrać biblioteki (lib i pliki nagłówkowe) OpenGL i GLUT dla środowiska lcc-win32 lub np QT.
Zdecyduj się czego chcesz używać jako interfejsu dla OGL, jeśli chcesz używać Qt to wystarczy że dodasz: <QtGui> i <qgl.h> do swojego projektu oraz odpowiednie liby do ustawień linkera. Jesli chodzi o liby to, nie wiem jak to jest w QtCreatorze, ale tworząc nowy projekt w VS wybierasz moduł GL do swojego projektu i liby są podpinane z automatu. Jeśli ten sposób Ci nie działa to musisz doprecyzować co dokładnie jest nie tak.
No więc kompilator mi wyrzuca coś takiego
(w LCC)
Warning g:\lccwin32_lesson23\lesson23\lesson23.c: 146 Missing prototype for 'LoadGLTextures'
Warning g:\lccwin32_lesson23\lesson23\lesson23.c: 233 Missing prototype for 'glDrawCube'
Error g:\lccwin32_lesson23\lesson23\lesson23.c 67 undefined reference to _auxDIBImageLoadA@4
g:\lcc\bin\make.exe
Compilation + link time:0.8 sec, Return code: 1
Pliki nagłówkowe których używam :
#include <windows.h> // Header File For Windows
#include <stdio.h> // Header File For Standard Input/Output
#include <gl\gl.h> // Header File For The OpenGL32 Library
#include <gl\glu.h> // Header File For The GLu32 Library
#include <gl\glaux.h> // Header File For The Glaux Library
Podobnie było z QT....
Nie mam pojęcia co to może być...
Może tutorial NeHe zawiera do starszej wersji kod ?
lcc??? Co to w ogóle jest? Spróbuj może inny kompilator np. gcc (MinGW). Powinien mieć już "na start" biblioteki do OGLa, trzeba tylko pamiętać o dodaniu odpowiednich parametrów do kompilatora (-lopengl chyba)
Do Qt użyj IDE Qt Creator. Te IDE jest też dobre do innych projektów, edytor jest bardzo szybki i lekki, a zarazem wystarczająco funkcjonalny.
W QT też do końca nie działa... :/
QT jakieś swoje biblioteki OpenGL ma... troche inne niż standardowe...
Pierwsze słyszę, Qt zapewnia tylko interfejs dla OGL nic więcej. Ma tam jakieś swoje narzędzia do rysowania ale nie mieszaj ich do OGL. Ja używałem Qt jako interfejsu dla OpenGL gdy robiłem przykłady NeHe i wszystko mi działało.
QT mi coś takiego wyrzuca :
G:/lesson06/nienazwany1-build-desktop/../Lesson6.cpp error: gl\glaux.h: No such file or directory
i
G:/lesson06/nienazwany1-build-desktop/../Lesson6.cpp error: expected constructor, destructor, or type conversion before '*' token
odnosnie funkcji
AUX_RGBImageRec *LoadBMP(char *Filename)
Grrr :/
A właściwie z Nehe to który przykład dla QT C++ ?
Ja używam tego przykladu dla Dev C++
No nic dziwnego że Ci tak wyrzuciło bo mało prawdopodobne żebyś glaux.h posiadał. Jeśli chcesz używać Qt to nie używasz przestarzałego glauxa. Tak samo jak zamierzasz używać gluta to o glauxie też zapominasz. Zrobiłem tylko kilka pierwszych przykładów, do teksturowania i cieniowania jeśli dobrze pamiętam. Jak wrócę do domu i odpalę mojego laptopa mogę wrzucić Ci kod jeśli chcesz.
several napisał(a)
No nic dziwnego że Ci tak wyrzuciło bo mało prawdopodobne żebyś glaux.h posiadał. Jeśli chcesz używać Qt to nie używasz przestarzałego glauxa. Tak samo jak zamierzasz używać gluta to o glauxie też zapominasz. Zrobiłem tylko kilka pierwszych przykładów, do teksturowania i cieniowania jeśli dobrze pamiętam. Jak wrócę do domu i odpalę mojego laptopa mogę wrzucić Ci kod jeśli chcesz.
O fajnie by było :) Szczerze to mam blade pojecie o programowaniu w OpenGL :(
LOSMARCELOS napisał(a)
Szczerze to mam blade pojecie o programowaniu w OpenGL :(
Ja też, umiem tylko podstawy podstaw.
Kod nie jest idealny, ale w miarę czytelny no i działa. Nie zapomnij machnąć 6 teksturek 256x256, ja użyłem painta do tego ;)
first_steps.h
#ifndef FIRST_STEPS_H
#define FIRST_STEPS_H
/*************************************************
* *
* *
* Prosty obiekt 3d *
* teksturowanie *
* kilka tekstur na jednym obiekcie *
* mouse event *
* oswietlenie *
* key event *
* *
* *
* *
*************************************************/
#include <qgl.h>
#include <QtGui>
class CGLwidget : public QGLWidget
{
Q_OBJECT
public:
CGLwidget(QWidget *parent=0 );
~CGLwidget();
QSize minimumSizeHint() const;
QSize sizeHint() const;
public slots:
void setXRotation(int angle);
void setYRotation(int angle);
void setZRotation(int angle);
signals:
void xRotationChanged(int angle);
void yRotationChanged(int angle);
void zRotationChanged(int angle);
protected:
void initializeGL();
void paintGL();
void resizeGL(GLsizei width, GLsizei height);
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void keyPressEvent(QKeyEvent *event);
private:
GLuint texture[6];
void LoadTex(QString Filename, int nMemPos);
QPoint lastPos;
int xRot;
int yRot;
int zRot;
bool light;
};
//---------------------
//----Klasa okna-------
//---------------------
class CWindow: public QWidget
{
//Q_OBJECT
public:
CWindow();
~CWindow();
QSize minimumSizeHint() const;
private:
CGLwidget *glScene;
};
#endif // FIRST_STEPS_H
first_steps.cpp
#include "first_steps.h"
CGLwidget::CGLwidget(QWidget *parent)
: QGLWidget( parent )
{
setFocusPolicy(Qt::StrongFocus);
xRot=0;
yRot=0;
zRot=0;
light=true;
}
CGLwidget::~CGLwidget()
{
}
//**********
void CGLwidget::initializeGL()
{
LoadTex("1.bmp", 1);
LoadTex("2.bmp", 2);
LoadTex("3.bmp", 3);
LoadTex("4.bmp", 4);
LoadTex("5.bmp", 5);
LoadTex("6.bmp", 6);
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f); // ustawienie bufora głebi
glEnable(GL_DEPTH_TEST); // włączenie testowania głębi
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_TEXTURE_2D);
GLfloat LightAmbient[]={ 0.5f, 0.5f, 0.5f, 1.0f }; // Wartości światła otaczająceg
GLfloat LightDiffuse[]={ 1.0f, 1.0f, 1.0f, 1.0f }; // Wartości światła rozproszonego
GLfloat LightPosition[]={ 0.0f, 0.0f, 2.0f, 1.0f }; // Pozycja światła
glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // Ustaw światło otaczające
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // Ustaw światło rozproszone
glLightfv(GL_LIGHT1, GL_POSITION,LightPosition); // Pozycja światła
glEnable(GL_LIGHT1); // Włącz światło numer jeden
}
//************
void CGLwidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
/*glTranslatef(-1.5f,0.0f,-6.0f);
/*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);
glBegin(GL_TRIANGLES); // Rysujemy trójkąty
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f); // wierzchołek
glVertex3f(1.0f, -1.0f, 1.0f); //prawy (przod)
glVertex3f(-1.0f, -1.0f, 1.0f); //lewy (przód)
glColor3f(0.5f,0.5f,0.5f);
glVertex3f(0.0f, 1.0f, 0.0f); // wierzchołek
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(1.0f,-1.0f, -1.0f); //prawy (prawa)
glColor3f(0.5f, 0.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f); // wierzchołek
glVertex3f(1.0f,-1.0f, -1.0f); //prawy (prawa)
glVertex3f(1.0f, -1.0f, 1.0f); //lewy (prawa)
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f); // wierzchołek
glVertex3f(-1.0f, -1.0f, 1.0f); //lewy (przód)
glVertex3f(-1.0f,-1.0f, -1.0f); //lewy (lewa)
glEnd(); // Koniec rysowania trójkąta*/
//glTranslatef(1.5f,0.0f,-7.0f);
//glColor3f(0.0f, 1.0f, 0.6f);
if(light){
glEnable(GL_LIGHTING);}
else{
glDisable(GL_LIGHTING);}
glTranslatef(0.0f,0.0f,-7.0f);
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);
glBindTexture(GL_TEXTURE_2D, texture[0]); // Wybierz naszą teksturę
glBegin(GL_QUADS);
glNormal3f( 0.0f, 1.0f, 0.0f); // Normalna wskazująca w gore ekranu
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f,-1.0f); // Prawy górny punkt (Góra)
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f,-1.0f); // Lewy górny punkt (Góra)
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Lewy dolny punkt (Góra)
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Prawy dolny (Góra)
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[1]);
glBegin(GL_QUADS);
glNormal3f( 0.0f, -1.0f, 0.0f); // Normalna wskazująca w dol
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,-1.0f, 1.0f); // Prawy górny (Dół)
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,-1.0f, 1.0f); // Lewy górny (Dół)
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,-1.0f,-1.0f); // Lewy dolny (Dół)
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,-1.0f,-1.0f); // Prawy dolny (Dół)
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[2]);
glBegin(GL_QUADS);
glNormal3f( 0.0f, 0.0f, 1.0f); // Normalna wskazująca na widza
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Prawy górny (Przód)
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Lewy górny (Przód)
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,-1.0f, 1.0f); // Lewy dolny (Przód)
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 1.0f); // Prawy dolny (Przód)
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[3]);
glBegin(GL_QUADS);
glNormal3f( 0.0f, 0.0f,-1.0f); // Normalna wskazująca na tyl ekranu
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f,-1.0f,-1.0f); // Lewy dolny (Tył)
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f,-1.0f,-1.0f); // Prawy dolny (Tył)
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f,-1.0f); // Prawy górny (Tył)
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f,-1.0f); // Lewy górny (Tył)
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[4]);
glBegin(GL_QUADS);
glNormal3f( -1.0f, 0.0f, 0.0f); // Normalna wskazująca w lewo
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Prawy górny (Lewa)
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f,-1.0f); // Lewy górny (Lewa)
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,-1.0f,-1.0f); // Lewy dolny (Lewa)
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f,-1.0f, 1.0f); // Prawy dolny (Lewa)
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[5]);
glBegin(GL_QUADS);
glNormal3f( 1.0f, 0.0f, 0.0f); // Normalna wskazująca w głąb ekranu
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f,-1.0f); // Prawy górny (Prawa)
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Lewy górny (Prawa)
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 1.0f); // Lewy dolny (Prawa)
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,-1.0f,-1.0f); // Prawy dolny (Prawa)
glEnd();
}
//***********
void CGLwidget::resizeGL(GLsizei width, GLsizei height)
{
if (height==0) // zapobiegnij dzieleniu przez zero...
{
height=1; // ...ustawiając liczbę 1
}
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION); // wybierz macierz projekcji
glLoadIdentity(); // zresetuj ją
// oblicz perspektywę dla okna
gluPerspective(55.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // wybierz macier modeli
glLoadIdentity();
/*int side = qMin(width, height);
glViewport((width - side) / 2, (height - side) / 2, side, side);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-5.0, 5.0, -5.0, 5.0, 5.0, 60.0);
glMatrixMode(GL_MODELVIEW);*/
}
QSize CGLwidget::minimumSizeHint() const
{
return QSize(50, 50);
}
QSize CGLwidget::sizeHint() const
{
return QSize(400, 400);
}
//********
static void qNormalizeAngle(int &angle)
{
while (angle < 0)
angle += 360 * 16;
while (angle > 360 * 16)
angle -= 360 * 16;
}
//********
void CGLwidget::setXRotation(int angle)
{
qNormalizeAngle(angle);
if (angle != xRot) {
xRot = angle;
emit xRotationChanged(angle);
updateGL();
}
}
//********
void CGLwidget::setYRotation(int angle)
{
qNormalizeAngle(angle);
if (angle != yRot) {
yRot = angle;
emit yRotationChanged(angle);
updateGL();
}
}
//********
void CGLwidget::setZRotation(int angle)
{
qNormalizeAngle(angle);
if (angle != zRot) {
zRot = angle;
emit zRotationChanged(angle);
updateGL();
}
}
//*********
void CGLwidget::mousePressEvent(QMouseEvent *event)
{
lastPos=event->pos();
}
//*********
void CGLwidget::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 CGLwidget::LoadTex(QString Filename, int nMemPos)
{
nMemPos-=1;
QImage img;
img.load(Filename, "BMP");
QImage glFormImg=QGLWidget::convertToGLFormat(img);
glGenTextures(1, &texture[nMemPos]);
glBindTexture(GL_TEXTURE_2D, texture[nMemPos]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, glFormImg.width(), glFormImg.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, glFormImg.bits());
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // Filtrowanie liniowe
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}
//*********
void CGLwidget::keyPressEvent(QKeyEvent *event)
{
switch(event->key())
{
case Qt::Key_L:
light=!light;
updateGL();
break;
default:
QGLWidget::keyPressEvent(event);
break;
}
}
//----------------
//---Klasa okna---
//----------------
CWindow::CWindow()
{
glScene=new CGLwidget;
QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addWidget(glScene);
setLayout(mainLayout);
}
//*******
CWindow::~CWindow()
{
delete glScene;
}
//*******************
QSize CWindow::minimumSizeHint() const
{
return QSize(100, 100);
}
A jeśli wolałbyś jednak GLUTa zaprzęgnąć na początek to na 4p masz kurs również z przykładami NeHe:
Kurs programowania GLUT
Dzięki :) Będę mieć czas to przekleje to do QT.
Swoją drogą szkoda, że już Turbo C++ bezpłatne do zastosowań komercyjnych nie jest rozwijane...