TGALoader für OpenGL

3D-Visualisierung mit der Open Graphics Library (OpenGL)
paparoach777
Beiträge: 52
Registriert: Mi Mai 12, 2010 3:48 pm

TGALoader für OpenGL

Beitrag von paparoach777 » Do Dez 30, 2010 1:32 pm

Kennt jemand nen guten TGALoader für OpenGL...

Am besten in C++ geschrieben
return EXIT_FAILURE;

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: TGALoader für OpenGL

Beitrag von Xin » Fr Dez 31, 2010 1:58 am

TGA wird - soweit ich weiß - gerne verwendet, weil es ein sehr primitives Format ist. Die Bitmap versteckt sich direkt hinter dem Header, wenn ich mich recht entsinne.
Von daher brauchst Du Dir nur das Format rauszusuchen, den Header zu laden und Du weißt, wieviele Informationen als Bitmap folgen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

paparoach777
Beiträge: 52
Registriert: Mi Mai 12, 2010 3:48 pm

Re: TGALoader für OpenGL

Beitrag von paparoach777 » Mo Jan 24, 2011 1:47 pm

Also mein TGALoader ist soweit fertig :D

nur momentan zeigt mir opengl gar nichts an...

hier der code vom main programm

Code: Alles auswählen

#include<stdlib.h>
#include"GLheaders.h"
#include"tgaloader.h"

void SetupRC(){

	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

	GLbyte *bytes;
	GLint width, height, components;
	GLenum format;

	glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
	bytes = LoadTGA("test.tga", &width, &height, &components, &format);
	glTexImage2D(GL_TEXTURE_2D, 0, components, width, height, 0, format, GL_UNSIGNED_BYTE, bytes);

	free(bytes);

	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

	glEnable(GL_TEXTURE_2D);

}

void ChangeSize(GLint w, GLint h){

	GLfloat AspectRatio;

	if(h==0){
		h=1;
	}

	glViewport(0, 0, w, h);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	AspectRatio = (GLfloat)w/(GLfloat)h;

	if(w <= h){
		glOrtho(-100.0f, 100.0f, -100/AspectRatio, 100/AspectRatio, 1.0f, -1.0f);
	}

	else{
		glOrtho(-100.0f * AspectRatio, 100.0f * AspectRatio, -100.0f, 100.0f, 1.0f, -1.0f);
	}

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void DrawScene(){

	glClear(GL_COLOR_BUFFER_BIT);

	glBegin(GL_QUADS);

	glTexCoord2f(0.0f, 0.0f);
	glVertex3f(-3.0f, -3.0f, -6.0f);

	glTexCoord2f(1.0f, 0.0f);
	glVertex3f(3.0f, -3.0f, -6.0f);

	glTexCoord2f(1.0f, 1.0f);
	glVertex3f(3.0f, 3.0f, -6.0f);

	glTexCoord2f(0.0f, 1.0f);
	glVertex3f(-3.0f, 3.0f, -6.0f);

	glutSwapBuffers();

}

int main(int argc, char **argv){

	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
	glutInitWindowSize(400, 400);
	glutCreateWindow("TGALoader Test 1");

	SetupRC();

	glutDisplayFunc(DrawScene);
	glutReshapeFunc(ChangeSize);

	glutMainLoop();

	return 0;

}
return EXIT_FAILURE;

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: TGALoader für OpenGL

Beitrag von Kerli » Mo Jan 24, 2011 1:53 pm

Irgendwie finde ich nirgendwo Aufruf von 'glGenTextures' und 'glBindTexture'. Somit hast du auch keinen von OpenGL verwendbaren Platz für eine Textur bzw. hast auch nie eine Textur aktiviert...
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

paparoach777
Beiträge: 52
Registriert: Mi Mai 12, 2010 3:48 pm

Re: TGALoader für OpenGL

Beitrag von paparoach777 » Mo Jan 24, 2011 2:04 pm

ich kenn mich ja mit texturen (noch) nicht so gut aus.

ich habe eigentlich gedacht das würde glTex2D machen
return EXIT_FAILURE;

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: TGALoader für OpenGL

Beitrag von Kerli » Mo Jan 24, 2011 4:15 pm

paparoach777 hat geschrieben:ich kenn mich ja mit texturen (noch) nicht so gut aus.
Kann ja noch werden ;)

Das du gar nichts siehst liegt daran dass dein Viereck außerhalb des sichtbaren Bereichs liegt:

Code: Alles auswählen

glOrtho(-100.0f * AspectRatio, 100.0f * AspectRatio, -100.0f, 100.0f, 1.0f, -1.0f);
// ...
glVertex3f(-3.0f, -3.0f, -6.0f);
Du legst den sichtbaren Bereich auf der z-Achse zuerst zwischen 1.0f und -1.0f fest und zeichnest dann mit z=-6.0f. Außerdem hat den Quadrat die Seitenlänge 6.0f was bei einer Fenstergröße von 200 doch vermutlich sehr klein sein wird.

Wenn du das änderst wirst du wahrscheinlich ein Quadrat in irgendeiner Farbe sehen. Frag mich bitte nicht was die Standardwerte für Farben in OpenGL sind. Am Besten legst du die Farbe zum Löschen (glClearColor(float r, float g, float b, float a)) und zum Zeichnen (glColor3f(float r, float g, float b)) selber fest, dann kann es nicht passieren das Vorder- und Hintergrund die selbe Farbe haben.

Sobald das funktioniert kannst du versuchen die Textur anzuzeigen. Damit in OpenGL Operationen mit Texturen durchgeführt werden muss zuerst die entsprechende Textur festgelegt werden. Dabei gibt es mehrere Typen von Texturen wie GL_TEXTURE_2D oder GL_TEXTURE_3D. Bevor man mit einer Textur einer der Typen arbeiten kann muss man die zu verwendete Textur mit ihrem Namen setzten. Also für eine 2d-Textur zb so:

Code: Alles auswählen

glBindTexture(GL_TEXTURE_2D, texture_id);
wobei 'texture_id' hier ein positiver Integer ist (Namen sind in OpenGL immer positive Integer). Damit man sich nicht selber um die Verwaltung freier Namen kümmern muss kann man mit 'glGenTextures' freie Namen holen und reservieren lassen:

Code: Alles auswählen

glGenTextures(1, &texture_id); // einen Namen holen und in texture_id speichern
Wenn man den/die Namen nicht mehr braucht kann man sie mit 'glDeleteTextures' wieder freigeben:

Code: Alles auswählen

glDeleteTextures(1, &texture_id);
Um also irgendwelche Operationen auf dem Ziel GL_TEXTURE_2D zu machen musst du zuerst einen Namen holen und ihn für dieses Ziel setzen:

Code: Alles auswählen

GLuint texture_id;
glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_2D, texture_id);
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

paparoach777
Beiträge: 52
Registriert: Mi Mai 12, 2010 3:48 pm

Re: TGALoader für OpenGL

Beitrag von paparoach777 » Di Jan 25, 2011 2:08 pm

Standfarbe für OpenGL müsste eigentlich weiß sein...
Na ja egal.

Aber wie bekomm ich jetzt die aus dem TGA geladenen Daten in die Textur???


Post Scriptum:
Danke das mit dem Blickfeld erweitern hat geklappt. jetzt seh ich schonmal ein Viereck
return EXIT_FAILURE;

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: TGALoader für OpenGL

Beitrag von Kerli » Di Jan 25, 2011 8:56 pm

paparoach777 hat geschrieben:Aber wie bekomm ich jetzt die aus dem TGA geladenen Daten in die Textur???
Eigentlich eh so wie du es gezeigt hast. Du musst nur zuerst wie beschrieben einen OpenGL Textur Namen holen und setzen und erst dann die Textur laden.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

paparoach777
Beiträge: 52
Registriert: Mi Mai 12, 2010 3:48 pm

Re: TGALoader für OpenGL

Beitrag von paparoach777 » Mi Jan 26, 2011 3:21 pm

Ok hab ich gemacht.

Aber auf dem Bildschirm ist nur ein schwarzes Quadrat...
return EXIT_FAILURE;

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: TGALoader für OpenGL

Beitrag von Xin » Mi Jan 26, 2011 4:36 pm

paparoach777 hat geschrieben:Ok hab ich gemacht.
Aber auf dem Bildschirm ist nur ein schwarzes Quadrat...
glEnable(GL_TEXTURE_2D)?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten