[OpenGL] Skąd pobrać biblioteki OpenGL dla C/C++ ?

0

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/

0

A co się dzieje, że się nie kompilują?

0
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.

0

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 ?

0

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.

0

W QT też do końca nie działa... :/
QT jakieś swoje biblioteki OpenGL ma... troche inne niż standardowe...

0

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.

0

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++

0

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.

0
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 :(

0
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

0

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...

1 użytkowników online, w tym zalogowanych: 0, gości: 1