Texturklasse für OpenGL



  • Hallo, ich habe eine Texturklasse für OpenGL geschrieben.
    Das heißt, dass Meiste habe ich mir von http://nehe.gamedev.net/ lesson 6 zusammenkopiert.
    (Da ist es nur in c gegeben und nicht in c++)

    #include "windows.h"
    #include <Vector>
    
    using namespace std;
    
    #pragma once
    
    class Textur {
    
    AUX_RGBImageRec* image[2];
    vector<GLuint> textur;
    long max_texturen;
    
    public:
    Textur(long max_texturen_): textur(max_texturen_), max_texturen(max_texturen_)
    {
    	memset(image,0,sizeof(void *)*3);           	// Set The Pointer To NULL
    	glGenTextures(max_texturen, &textur[0]);					// Create The Texture
    }
    GLuint get_texture(long x)
    {
    	return textur[x];
    }
    
    private:
    AUX_RGBImageRec *LoadBMP(LPCWSTR Filename)				// Loads A Bitmap Image
    	{
    		FILE *File=NULL;									// File Handle
    
    		if (!Filename)										// Make Sure A Filename Was Given
    		{
    			return NULL;									// If Not Return NULL
    		}
    
    		_wfopen_s(&File,Filename,L"r");							// Check To See If The File Exists
    
    		if (File)											// Does The File Exist?
    		{
    			fclose(File);									// Close The Handle
    			return auxDIBImageLoad(Filename);				// Load The Bitmap And Return A Pointer
    		}
    
    		return NULL;										// If Load Failed Return NULL
    	}
    
    public:
    int LoadGLTextures(LPCWSTR filename,int x)									// Load Bitmaps And Convert To Textures
    	{
    
    		int Status=FALSE;									// Status Indicator
    		// Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
    		if (image[x]=LoadBMP(filename))
    		{
    			Status=TRUE;									// Set The Status To TRUE
    			// Typical Texture Generation Using Data From The Bitmap
    			glBindTexture(GL_TEXTURE_2D, textur[x]);
    			//gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX,TextureImage[0]->sizeY , GL_RGB, GL_UNSIGNED_BYTE,TextureImage[0]->data);
    			glTexImage2D(GL_TEXTURE_2D, 0, 3, image[x]->sizeX, image[x]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image[x]->data);
    			glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    			glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    		}
    		if (image[x])									// If Texture Exists
    		{
    			if (image[x]->data)							// If Texture Image Exists
    			{
    				free(image[x]->data);					// Free The Texture Image Memory
    			}
    			free(image[x]);								// Free The Image Structure
    		}
    		return Status;										// Return The Status
    	}
    };
    

    Ich erzeuge folgendermaßen ein Objekt von Textur:
    Textur textur(2);

    Ich lade die Bilder folgendermaßen:
    textur.LoadGLTextures(L"1.bmp",0);
    textur.LoadGLTextures(L"2.bmp",1);

    Ich bilde die Textur vor dem Zeichnen folgendermaßen:
    glBindTexture(GL_TEXTURE_2D, textur.get_texture(0));
    bzw.
    glBindTexture(GL_TEXTURE_2D, textur.get_texture(1));

    Aber ich bekomme keine Texturen angezeigt. (Die beiden Bilder existieren garantiert).

    (Wenn ich die c Version von http://nehe.gamedev.net/ lesson6 nehme kann ich zumindest ein Bild laden)

    Was ist falsch?



  • Du hast da das totale Durcheinander...

    FILE=>fstream
    ...

    Dann hast du bald c++



  • Ich habe jetzt fstream benutzt und die Klasse so einfach wie irgend möglich gemacht (Es soll nur noch eine Textur geladen werden)

    #include "windows.h"
    #include <fstream>
    
    using namespace std;
    
    #pragma once
    
    class Textur {
    
    GLuint texture[1];
    
    public:
    Textur()
    {
    }
    
    GLuint get_texture()
    {
    	return texture[0];
    }
    
    AUX_RGBImageRec *LoadBMP(LPCWSTR filename)
    {
        fstream file;                          
        file.open(filename, ios::in);  
        if (file) 
    	{
    		file.close();                         
    		return auxDIBImageLoad(filename);  
    	}
    	return NULL;
    }
    
    public:
    int LoadGLTextures(LPCWSTR filename,int x)									// Load Bitmaps And Convert To Textures
    	{
    
    	int Status=FALSE;									// Status Indicator
    
    	AUX_RGBImageRec *TextureImage[1];					// Create Storage Space For The Texture
    
    	memset(TextureImage,0,sizeof(void *)*1);           	// Set The Pointer To NULL
    
    	// Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit
    	if (TextureImage[0]=LoadBMP(filename))
    	{
    		Status=TRUE;									// Set The Status To TRUE
    
    		glGenTextures(1, &texture[0]);					// Create The Texture
    
    		// Typical Texture Generation Using Data From The Bitmap
    		glBindTexture(GL_TEXTURE_2D, texture[0]);
    		glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    	}
    
    	if (TextureImage[0])									// If Texture Exists
    	{
    		if (TextureImage[0]->data)							// If Texture Image Exists
    		{
    			free(TextureImage[0]->data);					// Free The Texture Image Memory
    		}
    
    		free(TextureImage[0]);								// Free The Image Structure
    	}
    
    	return Status;
    }
    
    };
    

    Ich erzeuge ein Objekt von Textur mit:

    Textur textur;
    

    Ich lade eine Textur mit

    textur.LoadGLTextures(L"1.bmp",0);
    

    Ich binde die Textur in der Klasse welche das Objekt von der Klasse Textur hält mit:

    glBindTexture(GL_TEXTURE_2D, textur.get_texture());
    

    Das Programm läuft duch. Der Debugger zeigt keine Probleme an. Aber die Textur wird nicht angezeigt.

    Ich habe die Vermutung, dass die Klasse die Textur richtig lädt. Es aber irgenwie nicht funktioniert texture[0] an die andere Klasse zu übergeben.
    (Weil der code bis auf fstream zu 100% mit lesson 6 von http://nehe.gamedev.net/
    übereinstimmt und fstream nur testet, ob die Datei existiert und dieser Test positiv ausfällt)

    Hat jemand eine Idee was schief läuft?



  • DIESE KLASSE FUNKTIONIERT DOCH:

    Wenn es Jemanden Interessiert. Man darf von der Klasse kein Objekt durch den Konstruktor einer anderen Klasse erzeugen.
    (Ich meine die erzeugung des Objektes darf nicht im Konstuktor der Klasse passieren, die das Objekt von Textur halten soll)

    Ich habe dabei viele komische Fehler gesehen:
    1. Bluescreen (OK ist bei Windows XP nicht so komisch)
    2. Visual c++ 2005 Express Edition hat das Compilieren mit dem Hinweis (Interner Fehler) abgebrochen.
    3. Windows bleibt hängen und zeigt als Fehlermeldung (Ein Interner Treiber befindet sich in einer Endloschleife)



  • Grüss Gott!

    Dein PC ist im Eimer und/oder dein Grafikkartentreiber ist Mist.



  • AUX_RGBImageRec* image[2];
    memset(image,0,sizeof(void *)*3);
    

    Man darf von der Klasse kein Objekt durch den Konstruktor einer anderen Klasse erzeugen

    [...]


Anmelden zum Antworten