(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; }