(noob) problem mit multitexturing opengl



  • hi leute,

    meine opengl textruen werden schief gerendert und ich hab schon alle möglichen kombis in den positionen ausprobiert (obwohls das so eigendlich passen müsste).

    hier der code, hat jemand eine ahnung danke schonmal:

    #include <windows.h>
    #include <GL/gl.h>
    #include <GL/glut.h>
    #include <GL/glext.h>
    #include <GL/glaux.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB;
    PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
    
    typedef int (*compfn)(const void*, const void*);				
    
    struct objects {
    	GLuint	rot;												
    	bool	hit;												
    	GLuint	frame;												
    	GLuint	dir;												
    	GLuint	texid;												
    	GLfloat	x;													
    	GLfloat y;													
    	GLfloat	spin;												
    	GLfloat	distance;											
    };
    
    typedef struct													
    {
    	GLubyte	*imageData;											
    	GLuint	bpp;												
    	GLuint	width;												
    	GLuint	height;												
    	GLuint	texID;												
    } TextureImage;													
    
    TextureImage textures[500];										
    
    objects	object[30];												
    
    struct dimensions {												
    	GLfloat	w;													
    	GLfloat h;													
    };
    
    dimensions size[5] = { {1.0f,1.0f}, {1.0f,1.0f}, {1.0f,1.0f}, {0.5f,1.0f}, {0.75f,1.5f} };
    
    void gltexture(TextureImage *texture, char *filename)
    {
        	GLubyte		TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0};
    	GLubyte		TGAcompare[12];								
    	GLubyte		header[6];									
    	GLuint		bytesPerPixel;								
    	GLuint		imageSize;									
    	GLuint		temp;										
    	GLuint		type=GL_RGBA;
    
    	FILE *file = fopen(filename, "rb");						
    
    	if(	file==NULL ||										
    		fread(TGAcompare,1,sizeof(TGAcompare),file)!=sizeof(TGAcompare) ||	
    		memcmp(TGAheader,TGAcompare,sizeof(TGAheader))!=0				||	
    		fread(header,1,sizeof(header),file)!=sizeof(header))				
    	{
    		if (file == NULL)										
    			exit(0);								
    		else										
    		{
    			fclose(file);							
    			exit(0);								
    		}
    	}
    
    	texture->width  = header[1] * 256 + header[0];	
    	texture->height = header[3] * 256 + header[2];	
    
     	if(	texture->width	<=0	||						
    		texture->height	<=0	||						
    		(header[4]!=24 && header[4]!=32))			
    	{
    		fclose(file);								
    		exit(0);									
    	}
    
    	texture->bpp	= header[4];					
    	bytesPerPixel	= texture->bpp/8;				
    	imageSize		= texture->width*texture->height*bytesPerPixel;
    
    	texture->imageData=(GLubyte *)malloc(imageSize);			
    
    	if(	texture->imageData==NULL ||								
    		fread(texture->imageData, 1, imageSize, file)!=imageSize)
    	{
    		if(texture->imageData!=NULL)							
    			free(texture->imageData);							
    
    		fclose(file);											
    		exit(0);									
    	}
    
    	for(GLuint i=0; i<int(imageSize); i+=bytesPerPixel)
    	{												
    		temp=texture->imageData[i];					
    		texture->imageData[i] = texture->imageData[i + 2];
    		texture->imageData[i + 2] = temp;				
    	}
    
    	fclose (file);										
    
    	glGenTextures(1, &texture[0].texID);						
    
    	glBindTexture(GL_TEXTURE_2D, texture[0].texID);				
    	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    
    	if (texture[0].bpp==24)					
    	{
    		type=GL_RGB;						
    	}
    
    	glTexImage2D(GL_TEXTURE_2D, 0, type, texture[0].width, texture[0].height, 0, type, GL_UNSIGNED_BYTE, texture[0].imageData);
    }
    int we=0,he=0;
    float are=0;
    static void resize(int w1, int h1)
    	{
    
    	if(h1 == 0)
    		h1 = 1;
    
    	we = w1;
    	he = h1;
    	are = 1.0f * we / he;
    	glMatrixMode(GL_PROJECTION);
    	glLoadIdentity();
    
        glViewport(0, 0, we, he);
    
    	gluPerspective(45,are,0.1,1000);
    
    	glMatrixMode(GL_MODELVIEW);
    
    	glLoadIdentity();
    }
    
    static void display(void)
    {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
        glPushMatrix();
            glTranslatef(0,0,-6);
            glBegin(GL_QUADS); 
                glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 1.0f);
                glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 1.0f);
                glVertex3f(-1.0f, 1.0f, 0.0f);                    
                glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1.0f, 1.0f);
                glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 1.0f);
                glVertex3f(1.0f, 1.0f, 0.0f);
                glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1.0f, 0.0f);
                glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 0.0f);
                glVertex3f(1.0f, -1.0, 0.0f);
                glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 0.0f);
                glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 0.0f);
                glVertex3f(-1.0f, -1.0, 0.0f);
            glEnd();
        glPopMatrix();
    
        glutSwapBuffers(); 
    }
    
    static void key(unsigned char key, int x, int y)
    {
        switch (key) 
        {
            case 27 : 
            case 'q':
                exit(0);
                break;
        }
    
        glutPostRedisplay();
    }
    
    static void idle(void)
    {
        glutPostRedisplay();
    }
    
    int main(int argc, char *argv[])
    {
        TextureImage tex1, tex2;
    
        glutInit(&argc, argv);  
        glutInitWindowSize(800,600);
        glutInitWindowPosition(10,10);
        glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    
        glutCreateWindow("Multi-Texturing Example (by InternetNightmare)"); 
    
        gltexture(&tex1,"textures/wall.tga");
        gltexture(&tex2,"textures/backwall.tga");
    
        glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC)wglGetProcAddress("glActiveTextureARB");
        glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC)wglGetProcAddress("glMultiTexCoord2fARB");
    
        glActiveTextureARB(GL_TEXTURE0_ARB);
        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, tex1.texID); 
    
        glActiveTextureARB(GL_TEXTURE1_ARB);
        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, tex2.texID);
    
        glutReshapeFunc(resize);
        glutDisplayFunc(display);
        glutKeyboardFunc(key);	
        glutIdleFunc(idle);		
    
        glClearColor(1,1,1,1);	
    
        glutMainLoop();			
    
        return EXIT_SUCCESS;
    }
    

Anmelden zum Antworten