Seite 1 von 2
TGALoader für OpenGL
Verfasst: Do Dez 30, 2010 1:32 pm
von paparoach777
Kennt jemand nen guten TGALoader für OpenGL...
Am besten in C++ geschrieben
Re: TGALoader für OpenGL
Verfasst: Fr Dez 31, 2010 1:58 am
von Xin
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.
Re: TGALoader für OpenGL
Verfasst: Mo Jan 24, 2011 1:47 pm
von paparoach777
Also mein TGALoader ist soweit fertig
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;
}
Re: TGALoader für OpenGL
Verfasst: Mo Jan 24, 2011 1:53 pm
von Kerli
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...
Re: TGALoader für OpenGL
Verfasst: Mo Jan 24, 2011 2:04 pm
von paparoach777
ich kenn mich ja mit texturen (noch) nicht so gut aus.
ich habe eigentlich gedacht das würde glTex2D machen
Re: TGALoader für OpenGL
Verfasst: Mo Jan 24, 2011 4:15 pm
von Kerli
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:
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:
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);
Re: TGALoader für OpenGL
Verfasst: Di Jan 25, 2011 2:08 pm
von paparoach777
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
Re: TGALoader für OpenGL
Verfasst: Di Jan 25, 2011 8:56 pm
von Kerli
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.
Re: TGALoader für OpenGL
Verfasst: Mi Jan 26, 2011 3:21 pm
von paparoach777
Ok hab ich gemacht.
Aber auf dem Bildschirm ist nur ein schwarzes Quadrat...
Re: TGALoader für OpenGL
Verfasst: Mi Jan 26, 2011 4:36 pm
von Xin
paparoach777 hat geschrieben:Ok hab ich gemacht.
Aber auf dem Bildschirm ist nur ein schwarzes Quadrat...
glEnable(GL_TEXTURE_2D)?