Problem with texturing

Started by
8 comments, last by Arczi 18 years, 10 months ago
Hi, I made 3d model in 3ds max and then I convert model in PolyTrans to OpenGL C code. I have a problem to add texture to object. I explore tutorials on GameDev.Net but I don't find any solution of my problem. Could anybody help me, please. This is a C code of my object. #include <math.h> #include <stdio.h> #include <windows.h> #include <gl\gl.h> #include <gl\glu.h> #include <gl\glaux.h> HDC hDC=NULL; HGLRC hRC=NULL; HWND hWnd=NULL; bool keys[256]; bool active=TRUE; bool fullscreen=false; const float pi180 = 0.0174532925f; float kat,dlobrotu=1; float x,y,z; float pozx, pozy, pozz; float dlkroku=1; GLuint texture[1]; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); AUX_RGBImageRec *LoadBMP(char *Filename) { FILE *File=NULL; if (!Filename) { return NULL; } File=fopen(Filename,"r"); if (File) { fclose(File); return auxDIBImageLoad(Filename); } return NULL; } int LoadGLTextures() { int Status=FALSE; AUX_RGBImageRec *TextureImage[1]; memset(TextureImage,0,sizeof(void *)*1); if (TextureImage[0]=LoadBMP("Limesto1.bmp")) { Status=TRUE; glGenTextures(1, &texture[0]); 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 (TextureImage[0]->data) { free(TextureImage[0]->data); } free(TextureImage[0]); } return Status; } GLvoid ReSizeGLScene(GLsizei width, GLsizei height) { if (height==0) { height=1; } glViewport(0,0,width,height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int InitGL(GLvoid) {if (!LoadGLTextures()) { return FALSE; } glShadeModel(GL_SMOOTH); glClearColor(0.0f, 0.0f, 0.0f, 0.5f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); return TRUE; } void OGL_Set_Current_Material_Parameters(float shininess, float r_diffuseColor, float g_diffuseColor, float b_diffuseColor, float r_specularColor, float g_specularColor, float b_specularColor) { GLfloat glfModelSpecular[4]; glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess); glfModelSpecular[0] = r_specularColor; glfModelSpecular[1] = g_specularColor; glfModelSpecular[2] = b_specularColor; glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, glfModelSpecular); glColor3f(r_diffuseColor, g_diffuseColor, b_diffuseColor); } void OGL_Set_Current_Texture_Map(char *texture_map_name, float u_scale, float v_scale, float u_offset, float v_offset) { } void rysuj() { glBindTexture(GL_TEXTURE_2D, texture[0]); static GLfloat VertexData[] = { -50.0000f, -45.8175f, -2.00275e-006f, 50.0000f, -45.8175f, -2.00275e-006f, -50.0000f, 45.8175f, 2.00275e-006f, 50.0000f, 45.8175f, 2.00275e-006f, -50.0000f, -45.8175f, 38.4030f, 50.0000f, -45.8175f, 38.4030f, -50.0000f, 45.8175f, 38.4030f, 50.0000f, 45.8175f, 38.4030f, -50.0000f, -45.8175f, -2.00275e-006f, 50.0000f, -45.8175f, -2.00275e-006f, 50.0000f, -45.8175f, 38.4030f, 50.0000f, -45.8175f, 38.4030f, -50.0000f, -45.8175f, 38.4030f, -50.0000f, -45.8175f, -2.00275e-006f, 50.0000f, 45.8175f, 2.00275e-006f, 50.0000f, -45.8175f, 38.4030f, 50.0000f, 45.8175f, 2.00275e-006f, -50.0000f, 45.8175f, 2.00275e-006f, -50.0000f, 45.8175f, 38.4030f, -50.0000f, 45.8175f, 38.4030f, 50.0000f, 45.8175f, 38.4030f, 50.0000f, 45.8175f, 2.00275e-006f, -50.0000f, 45.8175f, 2.00275e-006f, -50.0000f, -45.8175f, 38.4030f, -50.0000f, -45.8175f, 38.4030f, -50.0000f, 45.8175f, 2.00275e-006f }; static GLfloat NormalData[] = { 0.000000f, 4.37114e-008f, -1.00000f, 0.000000f, -4.37114e-008f, 1.00000f, 0.000000f, -1.00000f, -4.37114e-008f, 1.00000f, -6.46120e-017f, -2.82428e-024f, 0.000000f, 1.00000f, 4.37114e-008f, -1.00000f, 0.000000f, 0.000000f }; static GLfloat TexCoordData[] = { 0.000000f, 0.000000f, 0.000000f, 1.00000f, 1.00000f, 0.000000f, 1.00000f, 1.00000f }; static GLint Indices[] = { 0, 2, 3, 3, 1, 0, 4, 5, 7, 7, 6, 4, 8, 9, 10, 11, 12, 13, 1, 14, 7, 7, 15, 1, 16, 17, 18, 19, 20, 21, 22, 0, 23, 24, 6, 25 }; glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, 0, TexCoordData); glEnableClientState(GL_NORMAL_ARRAY); glNormalPointer(GL_FLOAT, 0, NormalData); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, VertexData); OGL_Set_Current_Material_Parameters(15.0000f, 1.00000f, 1.00000f, 1.00000f, 0.898039f, 0.898039f, 0.898039f); OGL_Set_Current_Texture_Map("limesto1.jpg", 1.00000f, 1.00000f, 0.000000f, 0.000000f); glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[0]); glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[3]); glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[6]); glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[9]); glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[12]); glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[15]); glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[18]); glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[21]); glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[24]); glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[27]); glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[30]); glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[33]); } int DrawGLScene(GLvoid) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0,0,-20); pozx=x+8*sin((kat*pi180)); pozz=z+8*cos((kat*pi180)); pozy=y; gluLookAt(x,y,z,pozx,pozy,pozz,0,1,0); rysuj(); return true; } GLvoid KillGLWindow(GLvoid) { if (hRC) { if (!wglMakeCurrent(NULL,NULL)) { MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); } if (!wglDeleteContext(hRC)) { MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); } hRC=NULL; } if (hDC && !ReleaseDC(hWnd,hDC)) { MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); hDC=NULL; } if (hWnd && !DestroyWindow(hWnd)) { MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); hWnd=NULL; } if (fullscreen) { ChangeDisplaySettings(NULL,0); ShowCursor(TRUE); } } BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag) { GLuint PixelFormat; HINSTANCE hInstance; WNDCLASS wc; DWORD dwExstyle; DWORD dwstyle; fullscreen=fullscreenflag; hInstance = GetModuleHandle(NULL); wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = "OpenGL"; if (!RegisterClass(&wc)) { MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; } if (fullscreen) { DEVMODE dmScreenSettings; memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); dmScreenSettings.dmSize=sizeof(dmScreenSettings); dmScreenSettings.dmPelsWidth = width; dmScreenSettings.dmPelsHeight = height; dmScreenSettings.dmBitsPerPel = bits; dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL) { if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES) { fullscreen=FALSE; } else { MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP); return FALSE; } } } if (fullscreen) { dwExstyle=WS_EX_APPWINDOW; dwstyle=WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; ShowCursor(FALSE); } else { dwExstyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; dwstyle=WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; } if (!(hWnd=CreateWindowEx( dwExstyle, "OpenGL", title, dwstyle, 0, 0, width, height, NULL, NULL, hInstance, NULL))) { KillGLWindow(); MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; } static PIXELFORMATDESCRIPTOR pfd= { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, bits, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 }; if (!(hDC=GetDC(hWnd))) { KillGLWindow(); MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; } if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) { KillGLWindow(); MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; } if(!SetPixelFormat(hDC,PixelFormat,&pfd)) { KillGLWindow(); MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; } if (!(hRC=wglCreateContext(hDC))) { KillGLWindow(); MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; } if(!wglMakeCurrent(hDC,hRC)) { KillGLWindow(); MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; } ShowWindow(hWnd,SW_SHOW); SetForegroundWindow(hWnd); SetFocus(hWnd); ReSizeGLScene(width, height); if (!InitGL()) { KillGLWindow(); MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; } return TRUE; } LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_ACTIVATE: { if (!HIWORD(wParam)) { active=TRUE; } else { active=FALSE; } return 0; } case WM_SYSCOMMAND: { switch (wParam) { case SC_SCREENSAVE: case SC_MONITORPOWER: return 0; } break; } case WM_CLOSE: { PostQuitMessage(0); return 0; } case WM_KEYDOWN: { keys[wParam] = TRUE; return 0; } case WM_KEYUP: { keys[wParam] = FALSE; return 0; } case WM_SIZE: { ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); return 0; } } return DefWindowProc(hWnd,uMsg,wParam,lParam); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; BOOL done=FALSE; if (!CreateGLWindow("¯uraw Mostostal 120/160",1024,768,16,fullscreen)) { return 0; } while(!done) { if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if (msg.message==WM_QUIT) { done=TRUE; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { if ((active && !DrawGLScene()) || keys[VK_ESCAPE]) { done=TRUE; } else { SwapBuffers(hDC); } if(keys[VK_LEFT]==true) {if(kat>360.0f){kat=0.0f;};kat+=dlobrotu;} if(keys[VK_RIGHT]==true) {if(kat<-360.0f){kat=0.0f;};kat-=dlobrotu;} if(keys[VK_UP]==true) { y=0; x=x+dlkroku*sin((kat*pi180)); z=z+dlkroku*cos((kat*pi180)); } if(keys[VK_DOWN]==true) { y=0; x=x-dlkroku*sin((kat*pi180)); z=z-dlkroku*cos((kat*pi180));} } } KillGLWindow(); return (msg.wParam); } Could anybody correct this code, please. Thanks in advance, Arczi
Advertisement
Hi,
Try to use this tag next time ,if you don't mind :)
[*source]code[*/source]
remove *.

you forget to enable GL_TEXTURE_2D just put glEnable(GL_TEXTURE_2D); somewhere in your code.
bye
If you do this whole point of glDrawElements is lost. Just do it once.

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[0]);glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[3]);glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[6]);glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[9]);glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[12]);glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[15]);glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[18]);glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[21]);glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[24]);glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[27]);glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[30]);glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &Indices[33]);


Do it once only

glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, &Indices[0]);


For now you can put glEnable(GL_TEXTURE_2D) in you initGL code.

The more applications I write, more I find out how less I know
Now it's working but texture is display only at one wall of box.
Quote:Original post by Arczi
Now it's working but texture is display only at one wall of box.


Thats probably because here you have info only for 1 triangle/quad

static GLfloat TexCoordData[] = {0.000000f, 0.000000f, 0.000000f, 1.00000f, 1.00000f, 0.000000f,1.00000f, 1.00000f};


The number of texture coordinates should be equal to number of vertices. So if you have 24 vertices, you need 24 texture coordinates. Currently this looks like a cube so make a copy of the same data. Generally vertices have 3 values - x, y, z so they have total number of values = 72 while texture coordinates are generally have only s, t values so they would be 48 values in total in the array ie if you have 24 vertices. Same goes for normals -> they have 3 values, x, y, z so they also will have to be 72 values ie if you want to use glDrawElements but if you use immediate mode then what you have should probably suffice.


The more applications I write, more I find out how less I know
Holly molly check the length of that code, dude seriously!!!
Next time, please use the source tags to encapsulate your code layout.
Thank you
PS: You can check the FAQ to get to know how to use the said tag.
Hallo again
I,ve seriously problem to put texture on the Box so I exported *.3ds to c++ in another aplication and I've the same problem like in the topic: how to add texture to the box ?

It's realy important to me because I've 4 days to exam so if you could help me, please.

My texture name is limesto1.bmp
#include <windows.h>#include <GL\gl.h>#include <GL\glu.h>struct sample_MATERIAL{ GLfloat ambient[3]; GLfloat diffuse[3]; GLfloat specular[3]; GLfloat emission[3]; GLfloat alpha; GLfloat phExp; int   texture;};static sample_MATERIAL materials [1] = { {{0.117647f,0.117647f,0.117647f},	{0.752941f,0.752941f,0.752941f},	{0.752941f,0.752941f,0.752941f},	{0.0f,0.0f,0.0f},	1.0f,8.0f,-1} //Explorer Default};// 8 Verticies// 4 Texture Coordinates// 6 Normals// 12 Trianglesstatic BYTE face_indicies[12][9] = {// Object #-1	{0,2,3 ,0,0,0 ,0,1,2 }, {3,1,0 ,0,0,0 ,2,3,0 }, {4,5,7 ,1,1,1 ,3,0,1 },	{7,6,4 ,1,1,1 ,1,2,3 }, {0,1,5 ,2,2,2 ,3,0,1 }, {5,4,0 ,2,2,2 ,1,2,3 },	{1,3,7 ,3,3,3 ,3,0,1 }, {7,5,1 ,3,3,3 ,1,2,3 }, {3,2,6 ,4,4,4 ,3,0,1 },	{6,7,3 ,4,4,4 ,1,2,3 }, {2,0,4 ,5,5,5 ,3,0,1 }, {4,6,2 ,5,5,5 ,1,2,3 }};static GLfloat vertices [8][3] = {{-0.5f,0.256356f,-0.430085f},{0.5f,0.256356f,-0.430085f},{-0.5f,0.256356f,0.430085f},{0.5f,0.256356f,0.430085f},{-0.5f,-0.256356f,-0.430085f},{0.5f,-0.256356f,-0.430085f},{-0.5f,-0.256356f,0.430085f},{0.5f,-0.256356f,0.430085f}};static GLfloat normals [6][3] = {{0.0f,1.0f,4.37114e-008f},{0.0f,-1.0f,-4.94219e-008f},{0.0f,8.29145e-008f,-1.0f},{1.0f,0.0f,0.0f},{0.0f,-8.29145e-008f,1.0f},{-1.0f,0.0f,0.0f}};static GLfloat textures [4][2] = {{1.0f,0.0f},{1.0f,1.0f},{0.0f,1.0f},{0.0f,0.0f}};/*Material indicies*//*{material index,face count}*/static int material_ref [1][2] = {{0,12}};void MyMaterial(GLenum mode,GLfloat *f,GLfloat alpha){ GLfloat d[4]; d[0]=f[0]; d[1]=f[1]; d[2]=f[2]; d[3]=alpha; glMaterialfv (GL_FRONT_AND_BACK,mode,d);}/* *  SelectMaterial uses OpenGL commands to define facet colors. * *  Returns: *    Nothing */void SelectMaterial(int i){  //  // Define the reflective properties of the 3D Object faces.  //  glEnd();  GLfloat alpha=materials.alpha;  MyMaterial (GL_AMBIENT, materials.ambient,alpha);  MyMaterial (GL_DIFFUSE, materials.diffuse,alpha);  MyMaterial (GL_SPECULAR, materials.specular,alpha);  MyMaterial (GL_EMISSION, materials.emission,alpha);  glMaterialf (GL_FRONT_AND_BACK,GL_SHININESS,materials.phExp);  glBegin(GL_TRIANGLES);};GLint Gen3DObjectList(){ int i; int j; GLint lid=glGenLists(1);	int mcount=0;	int mindex=0;   glNewList(lid, GL_COMPILE);    glBegin (GL_TRIANGLES);      for(i=0;i<sizeof(face_indicies)/sizeof(face_indicies[0]);i++)       {      if(!mcount)       {        SelectMaterial(material_ref[mindex][0]);        mcount=material_ref[mindex][1];        mindex++;       }       mcount--;       for(j=0;j<3;j++)        {          int vi=face_indicies[j];          int ni=face_indicies[j+3];//Normal index          int ti=face_indicies[j+6];//Texture index           glNormal3f (normals[ni][0],normals[ni][1],normals[ni][2]);           glTexCoord2f(textures[ti][0],textures[ti][1]);           glVertex3f (vertices[vi][0],vertices[vi][1],vertices[vi][2]);        }       }    glEnd ();   glEndList();   return lid;};float sizex,sizey;LONG WINAPI WndProc (HWND, UINT, WPARAM, LPARAM);GLsizei glnWidth, glnHeight;GLdouble gldAspect;void SetDCPixelFormat (HWND,HDC);void InitializeRC (void);void DrawScene (HDC, UINT,UINT);HPALETTE hPalette = NULL;GLfloat nSize = 0.0f;GLfloat nCol = 0.0f;GLfloat nTop = 1.0f;GLfloat nBottom = 0.0f;int bFlag = 1;char wndname[256]="";GLint hlist=0;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,                    LPSTR lpszCmdLine, int nCmdShow){    static char szAppName[] = "3D Exploration Open GL test application";    WNDCLASS wc;    HWND hwnd;    MSG msg;    wc.style = CS_HREDRAW | CS_VREDRAW;    wc.lpfnWndProc = (WNDPROC) WndProc;    wc.cbClsExtra = 0;    wc.cbWndExtra = 0;    wc.hInstance = hInstance;    wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);    wc.hCursor = LoadCursor (NULL, IDC_ARROW);    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);    wc.lpszMenuName = NULL;    wc.lpszClassName = szAppName;    RegisterClass (&wc);    hwnd = CreateWindow (szAppName, szAppName,        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,        CW_USEDEFAULT, CW_USEDEFAULT, 200, 200,        HWND_DESKTOP, NULL, hInstance, NULL);    hlist=Gen3DObjectList();    ShowWindow (hwnd, nCmdShow);    UpdateWindow (hwnd);    while (GetMessage (&msg, NULL, 0, 0)) {        TranslateMessage (&msg);        DispatchMessage (&msg);    }    return msg.wParam;}/* *  WndProc processes messages to the main window. */LONG WINAPI WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){    static HDC hdc;    static HGLRC hrc;    PAINTSTRUCT ps;    static UINT nAngle = 0;    static UINT nAngle2 = 0;    static UINT nTimer;    int n;                    switch (msg) {        case WM_CREATE:        //        // Create a rendering context and set a timer.        //        hdc = GetDC (hwnd);        SetDCPixelFormat (hwnd,hdc);        hrc = wglCreateContext (hdc);        wglMakeCurrent (hdc, hrc);        InitializeRC ();        nTimer = SetTimer (hwnd, 1, 1, NULL);        return 0;    case WM_SIZE:        //        // Redefine the viewing volume and viewport when the window size        // changes.        //        glnWidth = (GLsizei) LOWORD (lParam);        glnHeight = (GLsizei) HIWORD (lParam);        return 0;    case WM_PAINT:{        //        // Draw the scene.        //        BeginPaint (hwnd, &ps);        DrawScene (hdc, nAngle,nAngle2);        EndPaint (hwnd, &ps);        }return 0;    case WM_TIMER:        //        // Update the rotation angle and force a repaint.        //        nAngle += 2;        if (nAngle >= 360)            nAngle -= 360;        nAngle2 += 1;        if (nAngle2 >= 360)            nAngle2 -= 360;		if (bFlag == 1)			nSize += 0.05f;			nCol += 0.01f;			if (nSize >= nTop)				bFlag = 0;		if (bFlag == 0)			nSize -= 0.05f;			nCol -= 0.01f;			if (nSize <= nBottom)				bFlag = 1;		InvalidateRect (hwnd, NULL, FALSE);        return 0;    case WM_QUERYNEWPALETTE:        //        // If the program is using a color palette, realize the palette        // and update the client area when the window receives the input        // focus.        //        if (hPalette != NULL) {            if (n = RealizePalette (hdc))                InvalidateRect (hwnd, NULL, FALSE);            return n;        }        break;    case WM_PALETTECHANGED:        //        // If the program is using a color palette, realize the palette        // and update the colors in the client area when another program        // realizes its palette.        //        if ((hPalette != NULL) && ((HWND) wParam != hwnd)) {            if (RealizePalette (hdc))                UpdateColors (hdc);            return 0;        }        break;    case WM_DESTROY:        //        // Clean up and terminate.        //        wglMakeCurrent (NULL, NULL);        wglDeleteContext (hrc);        ReleaseDC (hwnd, hdc);        if (hPalette != NULL)            DeleteObject (hPalette);        KillTimer (hwnd, nTimer);        PostQuitMessage (0);        return 0;    }    return DefWindowProc (hwnd, msg, wParam, lParam);}/* *  SetDCPixelFormat sets the pixel format for a device context in *  preparation for creating a rendering context. * *  Input parameters: *    hdc = Device context handle * *  Returns: *    Nothing */void SetDCPixelFormat (HWND hwnd,HDC hdc){    HANDLE hHeap;    int nColors, i;    LPLOGPALETTE lpPalette;    BYTE byRedMask, byGreenMask, byBlueMask;    static PIXELFORMATDESCRIPTOR pfd = {        sizeof (PIXELFORMATDESCRIPTOR),             // Size of this structure        1,                                          // Version number        PFD_DRAW_TO_WINDOW |                        // Flags        PFD_SUPPORT_OPENGL |        PFD_GENERIC_ACCELERATED|        PFD_DOUBLEBUFFER,        PFD_TYPE_RGBA,                              // RGBA pixel values        24,                                         // 24-bit color        0, 0, 0, 0, 0, 0,                           // Don't care about these        0, 0,                                       // No alpha buffer        0, 0, 0, 0, 0,                              // No accumulation buffer        32,                                         // 32-bit depth buffer        0,                                          // No stencil buffer        0,                                          // No auxiliary buffers        PFD_MAIN_PLANE,                             // Layer type        0,                                          // Reserved (must be 0)        0, 0, 0                                     // No layer masks    };    int nPixelFormat;    nPixelFormat = ChoosePixelFormat (hdc, &pfd);    SetPixelFormat (hdc, nPixelFormat, &pfd);    if (pfd.dwFlags & PFD_NEED_PALETTE) {        nColors = 1 << pfd.cColorBits;        hHeap = GetProcessHeap ();        (LPLOGPALETTE) lpPalette = (LPLOGPALETTE)HeapAlloc (hHeap, 0,            sizeof (LOGPALETTE) + (nColors * sizeof (PALETTEENTRY)));        lpPalette->palVersion = 0x300;        lpPalette->palNumEntries = nColors;        byRedMask = (1 << pfd.cRedBits) - 1;        byGreenMask = (1 << pfd.cGreenBits) - 1;        byBlueMask = (1 << pfd.cBlueBits) - 1;        for (i=0; i<nColors; i++) {            lpPalette->palPalEntry.peRed =                (((i >> pfd.cRedShift) & byRedMask) * 255) / byRedMask;            lpPalette->palPalEntry.peGreen =                (((i >> pfd.cGreenShift) & byGreenMask) * 255) / byGreenMask;            lpPalette->palPalEntry.peBlue =                (((i >> pfd.cBlueShift) & byBlueMask) * 255) / byBlueMask;            lpPalette->palPalEntry.peFlags = 0;        }        hPalette = CreatePalette (lpPalette);        HeapFree (hHeap, 0, lpPalette);        if (hPalette != NULL) {            SelectPalette (hdc, hPalette, FALSE);            RealizePalette (hdc);        }    }}/* *  InitializeRC initializes the current rendering context. * *  Input parameters: *    None * *  Returns: *    Nothing */void InitializeRC (void){    GLfloat glfLightAmbient[] = { 0.1f, 0.1f, 0.1f, 1.0f };    GLfloat glfLightDiffuse[] = { 1.2f, 1.2f, 1.2f, 1.0f };    GLfloat glfLightSpecular[] = { 0.9f, 0.9f, 0.9f, 1.0f };    //    // Add a light to the scene.    //    glLightfv (GL_LIGHT0, GL_AMBIENT, glfLightAmbient);    glLightfv (GL_LIGHT0, GL_DIFFUSE, glfLightDiffuse);    glLightfv (GL_LIGHT0, GL_SPECULAR, glfLightSpecular);    glEnable (GL_LIGHTING);    glEnable (GL_LIGHT0);    //    // Enable depth testing and backface culling.    //    glEnable (GL_DEPTH_TEST);        glDisable (GL_CULL_FACE);    glLightModeli(GL_LIGHT_MODEL_TWO_SIDE ,1);}/* *  DrawScene uses OpenGL Display list to draw a object. * *  Input parameters: *    hdc = Device context handle *    nAngle = Angle of rotation for object * *  Returns: *    Nothing */void DrawScene (HDC hdc, UINT nAngle,UINT nAngle2){        sizex=glnWidth;        sizey=glnHeight;        gldAspect = (GLdouble) glnWidth / (GLdouble) glnHeight;        glMatrixMode (GL_PROJECTION);        glLoadIdentity ();        gluPerspective (30.0,           // Field-of-view angle                        gldAspect,      // Aspect ratio of viewing volume                        1.0,            // Distance to near clipping plane                        10.0);          // Distance to far clipping plane        glViewport (0, 0, glnWidth, glnHeight);    //    // Clear the color and depth buffers.    //    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    //    // Define the modelview transformation.    //    glMatrixMode (GL_MODELVIEW);    glLoadIdentity ();    glTranslatef (0.0f, 0.0f, -8.0f);    glRotatef (30.0f, 1.0f, 0.0f, 0.0f);    glRotatef ((GLfloat) nAngle, 0.0f, 1.0f, 0.0f);    glRotatef ((GLfloat) nAngle2, 1.0f, 0.0f, 0.0f);    glScalef (nSize+2.5f,nSize+2.5f,nSize+2.5f);  	int mcount=0;	int mindex=0;	    glCallList(hlist);    //    // Swap the buffers.    //    glFlush();    SwapBuffers (hdc);};
Nobody know's how to correct my code?
Hi,
#include <stdio.h>#include <windows.h> #include <gl\gl.h> #include <gl\glu.h> #include <gl\glaux.h> struct sample_MATERIAL{ GLfloat ambient[3]; GLfloat diffuse[3]; GLfloat specular[3]; GLfloat emission[3]; GLfloat alpha; GLfloat phExp; int   texture;};GLuint texture[1];int LoadGLTextures();static sample_MATERIAL materials [1] = { {{0.117647f,0.117647f,0.117647f},	{0.752941f,0.752941f,0.752941f},	{0.752941f,0.752941f,0.752941f},	{0.0f,0.0f,0.0f},	1.0f,8.0f,-1} //Explorer Default};// 8 Verticies// 4 Texture Coordinates// 6 Normals// 12 TrianglesAUX_RGBImageRec *LoadBMP(char *Filename) {FILE *File=NULL; if (!Filename) {return NULL; }File=fopen(Filename,"r"); if (File) {fclose(File); return auxDIBImageLoad(Filename); }return NULL; }static BYTE face_indicies[12][9] = {// Object #-1	{0,2,3 ,0,0,0 ,0,1,2 }, {3,1,0 ,0,0,0 ,2,3,0 }, {4,5,7 ,1,1,1 ,3,0,1 },	{7,6,4 ,1,1,1 ,1,2,3 }, {0,1,5 ,2,2,2 ,3,0,1 }, {5,4,0 ,2,2,2 ,1,2,3 },	{1,3,7 ,3,3,3 ,3,0,1 }, {7,5,1 ,3,3,3 ,1,2,3 }, {3,2,6 ,4,4,4 ,3,0,1 },	{6,7,3 ,4,4,4 ,1,2,3 }, {2,0,4 ,5,5,5 ,3,0,1 }, {4,6,2 ,5,5,5 ,1,2,3 }};static GLfloat vertices [8][3] = {{-0.5f,0.256356f,-0.430085f},{0.5f,0.256356f,-0.430085f},{-0.5f,0.256356f,0.430085f},{0.5f,0.256356f,0.430085f},{-0.5f,-0.256356f,-0.430085f},{0.5f,-0.256356f,-0.430085f},{-0.5f,-0.256356f,0.430085f},{0.5f,-0.256356f,0.430085f}};static GLfloat normals [6][3] = {{0.0f,1.0f,4.37114e-008f},{0.0f,-1.0f,-4.94219e-008f},{0.0f,8.29145e-008f,-1.0f},{1.0f,0.0f,0.0f},{0.0f,-8.29145e-008f,1.0f},{-1.0f,0.0f,0.0f}};static GLfloat textures [4][2] = {{1.0f,0.0f},{1.0f,1.0f},{0.0f,1.0f},{0.0f,0.0f}};/*Material indicies*//*{material index,face count}*/static int material_ref [1][2] = {{0,12}};void MyMaterial(GLenum mode,GLfloat *f,GLfloat alpha){ GLfloat d[4]; d[0]=f[0]; d[1]=f[1]; d[2]=f[2]; d[3]=alpha; glMaterialfv (GL_FRONT_AND_BACK,mode,d);}/* *  SelectMaterial uses OpenGL commands to define facet colors. * *  Returns: *    Nothing */void SelectMaterial(int i){  //  // Define the reflective properties of the 3D Object faces.  //  glEnd();  GLfloat alpha=materials.alpha;  MyMaterial (GL_AMBIENT, materials.ambient,alpha);  MyMaterial (GL_DIFFUSE, materials.diffuse,alpha);  MyMaterial (GL_SPECULAR, materials.specular,alpha);  MyMaterial (GL_EMISSION, materials.emission,alpha);  glMaterialf (GL_FRONT_AND_BACK,GL_SHININESS,materials.phExp);  glBegin(GL_TRIANGLES);};GLint Gen3DObjectList(){ int i; int j; GLint lid=glGenLists(1);	int mcount=0;	int mindex=0;   glNewList(lid, GL_COMPILE);    glBegin (GL_TRIANGLES);      for(i=0;i<sizeof(face_indicies)/sizeof(face_indicies[0]);i++)       {      if(!mcount)       {        SelectMaterial(material_ref[mindex][0]);        mcount=material_ref[mindex][1];        mindex++;       }       mcount--;       for(j=0;j<3;j++)        {          int vi=face_indicies[j];          int ni=face_indicies[j+3];//Normal index          int ti=face_indicies[j+6];//Texture index           glNormal3f (normals[ni][0],normals[ni][1],normals[ni][2]);           glTexCoord2f(textures[ti][0],textures[ti][1]);           glVertex3f (vertices[vi][0],vertices[vi][1],vertices[vi][2]);        }       }    glEnd ();   glEndList();   return lid;};float sizex,sizey;LONG WINAPI WndProc (HWND, UINT, WPARAM, LPARAM);GLsizei glnWidth, glnHeight;GLdouble gldAspect;void SetDCPixelFormat (HWND,HDC);void InitializeRC (void);void DrawScene (HDC, UINT,UINT);HPALETTE hPalette = NULL;GLfloat nSize = 0.0f;GLfloat nCol = 0.0f;GLfloat nTop = 1.0f;GLfloat nBottom = 0.0f;int bFlag = 1;char wndname[256]="";GLint hlist=0;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,                    LPSTR lpszCmdLine, int nCmdShow){    static char szAppName[] = "3D Exploration Open GL test application";    WNDCLASS wc;    HWND hwnd;    MSG msg;    wc.style = CS_HREDRAW | CS_VREDRAW;    wc.lpfnWndProc = (WNDPROC) WndProc;    wc.cbClsExtra = 0;    wc.cbWndExtra = 0;    wc.hInstance = hInstance;    wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);    wc.hCursor = LoadCursor (NULL, IDC_ARROW);    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);    wc.lpszMenuName = NULL;    wc.lpszClassName = szAppName;    RegisterClass (&wc);    hwnd = CreateWindow (szAppName, szAppName,        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,        CW_USEDEFAULT, CW_USEDEFAULT, 200, 200,        HWND_DESKTOP, NULL, hInstance, NULL);    hlist=Gen3DObjectList();    ShowWindow (hwnd, nCmdShow);    UpdateWindow (hwnd);    while (GetMessage (&msg, NULL, 0, 0)) {        TranslateMessage (&msg);        DispatchMessage (&msg);    }    return msg.wParam;}/* *  WndProc processes messages to the main window. */LONG WINAPI WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){    static HDC hdc;    static HGLRC hrc;    PAINTSTRUCT ps;    static UINT nAngle = 0;    static UINT nAngle2 = 0;    static UINT nTimer;    int n;                    switch (msg) {        case WM_CREATE:        //        // Create a rendering context and set a timer.        //        hdc = GetDC (hwnd);        SetDCPixelFormat (hwnd,hdc);        hrc = wglCreateContext (hdc);        wglMakeCurrent (hdc, hrc);        InitializeRC ();        nTimer = SetTimer (hwnd, 1, 1, NULL);        return 0;    case WM_SIZE:        //        // Redefine the viewing volume and viewport when the window size        // changes.        //        glnWidth = (GLsizei) LOWORD (lParam);        glnHeight = (GLsizei) HIWORD (lParam);        return 0;    case WM_PAINT:{        //        // Draw the scene.        //        BeginPaint (hwnd, &ps);        DrawScene (hdc, nAngle,nAngle2);        EndPaint (hwnd, &ps);        }return 0;    case WM_TIMER:        //        // Update the rotation angle and force a repaint.        //        nAngle += 2;        if (nAngle >= 360)            nAngle -= 360;        nAngle2 += 1;        if (nAngle2 >= 360)            nAngle2 -= 360;		if (bFlag == 1)			nSize += 0.05f;			nCol += 0.01f;			if (nSize >= nTop)				bFlag = 0;		if (bFlag == 0)			nSize -= 0.05f;			nCol -= 0.01f;			if (nSize <= nBottom)				bFlag = 1;		InvalidateRect (hwnd, NULL, FALSE);        return 0;    case WM_QUERYNEWPALETTE:        //        // If the program is using a color palette, realize the palette        // and update the client area when the window receives the input        // focus.        //        if (hPalette != NULL) {            if (n = RealizePalette (hdc))                InvalidateRect (hwnd, NULL, FALSE);            return n;        }        break;    case WM_PALETTECHANGED:        //        // If the program is using a color palette, realize the palette        // and update the colors in the client area when another program        // realizes its palette.        //        if ((hPalette != NULL) && ((HWND) wParam != hwnd)) {            if (RealizePalette (hdc))                UpdateColors (hdc);            return 0;        }        break;    case WM_DESTROY:        //        // Clean up and terminate.        //        wglMakeCurrent (NULL, NULL);        wglDeleteContext (hrc);        ReleaseDC (hwnd, hdc);        if (hPalette != NULL)            DeleteObject (hPalette);        KillTimer (hwnd, nTimer);        PostQuitMessage (0);        return 0;    }    return DefWindowProc (hwnd, msg, wParam, lParam);}/* *  SetDCPixelFormat sets the pixel format for a device context in *  preparation for creating a rendering context. * *  Input parameters: *    hdc = Device context handle * *  Returns: *    Nothing */void SetDCPixelFormat (HWND hwnd,HDC hdc){    HANDLE hHeap;    int nColors, i;    LPLOGPALETTE lpPalette;    BYTE byRedMask, byGreenMask, byBlueMask;    static PIXELFORMATDESCRIPTOR pfd = {        sizeof (PIXELFORMATDESCRIPTOR),             // Size of this structure        1,                                          // Version number        PFD_DRAW_TO_WINDOW |                        // Flags        PFD_SUPPORT_OPENGL |        PFD_GENERIC_ACCELERATED|        PFD_DOUBLEBUFFER,        PFD_TYPE_RGBA,                              // RGBA pixel values        24,                                         // 24-bit color        0, 0, 0, 0, 0, 0,                           // Don't care about these        0, 0,                                       // No alpha buffer        0, 0, 0, 0, 0,                              // No accumulation buffer        32,                                         // 32-bit depth buffer        0,                                          // No stencil buffer        0,                                          // No auxiliary buffers        PFD_MAIN_PLANE,                             // Layer type        0,                                          // Reserved (must be 0)        0, 0, 0                                     // No layer masks    };    int nPixelFormat;    nPixelFormat = ChoosePixelFormat (hdc, &pfd);    SetPixelFormat (hdc, nPixelFormat, &pfd);    if (pfd.dwFlags & PFD_NEED_PALETTE) {        nColors = 1 << pfd.cColorBits;        hHeap = GetProcessHeap ();        (LPLOGPALETTE) lpPalette = (LPLOGPALETTE)HeapAlloc (hHeap, 0,            sizeof (LOGPALETTE) + (nColors * sizeof (PALETTEENTRY)));        lpPalette->palVersion = 0x300;        lpPalette->palNumEntries = nColors;        byRedMask = (1 << pfd.cRedBits) - 1;        byGreenMask = (1 << pfd.cGreenBits) - 1;        byBlueMask = (1 << pfd.cBlueBits) - 1;        for (i=0; i<nColors; i++) {            lpPalette->palPalEntry.peRed =                (((i >> pfd.cRedShift) & byRedMask) * 255) / byRedMask;            lpPalette->palPalEntry.peGreen =                (((i >> pfd.cGreenShift) & byGreenMask) * 255) / byGreenMask;            lpPalette->palPalEntry.peBlue =                (((i >> pfd.cBlueShift) & byBlueMask) * 255) / byBlueMask;            lpPalette->palPalEntry.peFlags = 0;        }        hPalette = CreatePalette (lpPalette);        HeapFree (hHeap, 0, lpPalette);        if (hPalette != NULL) {            SelectPalette (hdc, hPalette, FALSE);            RealizePalette (hdc);        }    }}/* *  InitializeRC initializes the current rendering context. * *  Input parameters: *    None * *  Returns: *    Nothing */void InitializeRC (void){    GLfloat glfLightAmbient[] = { 0.1f, 0.1f, 0.1f, 1.0f };    GLfloat glfLightDiffuse[] = { 1.2f, 1.2f, 1.2f, 1.0f };    GLfloat glfLightSpecular[] = { 0.9f, 0.9f, 0.9f, 1.0f };	glEnable(GL_TEXTURE_2D);	LoadGLTextures();    //    // Add a light to the scene.    //        glLightfv (GL_LIGHT0, GL_AMBIENT, glfLightAmbient);    glLightfv (GL_LIGHT0, GL_DIFFUSE, glfLightDiffuse);    glLightfv (GL_LIGHT0, GL_SPECULAR, glfLightSpecular);    glEnable (GL_LIGHTING);    glEnable (GL_LIGHT0);    //    // Enable depth testing and backface culling.    //    glEnable (GL_DEPTH_TEST);        glDisable (GL_CULL_FACE);    glLightModeli(GL_LIGHT_MODEL_TWO_SIDE ,1);}/* *  DrawScene uses OpenGL Display list to draw a object. * *  Input parameters: *    hdc = Device context handle *    nAngle = Angle of rotation for object * *  Returns: *    Nothing */int LoadGLTextures() {int Status=FALSE; AUX_RGBImageRec *TextureImage[1]; memset(TextureImage,0,sizeof(void *)*1); if (TextureImage[0]=LoadBMP("Limesto1.bmp")){Status=TRUE; glGenTextures(1, &texture[0]); 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 (TextureImage[0]->data) {free(TextureImage[0]->data); }free(TextureImage[0]); }return Status; }void DrawScene (HDC hdc, UINT nAngle,UINT nAngle2){        sizex=glnWidth;        sizey=glnHeight;        gldAspect = (GLdouble) glnWidth / (GLdouble) glnHeight;        glMatrixMode (GL_PROJECTION);        glLoadIdentity ();        gluPerspective (30.0,           // Field-of-view angle                        gldAspect,      // Aspect ratio of viewing volume                        1.0,            // Distance to near clipping plane                        10.0);          // Distance to far clipping plane        glViewport (0, 0, glnWidth, glnHeight);    //    // Clear the color and depth buffers.    //    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    //    // Define the modelview transformation.    //    glMatrixMode (GL_MODELVIEW);    glLoadIdentity ();    glTranslatef (0.0f, 0.0f, -8.0f);    glRotatef (30.0f, 1.0f, 0.0f, 0.0f);    glRotatef ((GLfloat) nAngle, 0.0f, 1.0f, 0.0f);    glRotatef ((GLfloat) nAngle2, 1.0f, 0.0f, 0.0f);    glScalef (nSize+2.5f,nSize+2.5f,nSize+2.5f);  	int mcount=0;	int mindex=0;	    glCallList(hlist);    //    // Swap the buffers.    //    glFlush();    SwapBuffers (hdc);};

Have a fun! :)
Rate me if you don't mind :P

[Edited by - ff8 on June 3, 2005 4:32:08 PM]
it's working :), Thank you very much

This topic is closed to new replies.

Advertisement