• Advertisement
Sign in to follow this  

OpenGL Problem with texturing

This topic is 4612 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
Now it's working but texture is display only at one wall of box.

Share this post


Link to post
Share on other sites
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.


Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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 Triangles

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[i].alpha;
MyMaterial (GL_AMBIENT, materials[i].ambient,alpha);
MyMaterial (GL_DIFFUSE, materials[i].diffuse,alpha);
MyMaterial (GL_SPECULAR, materials[i].specular,alpha);
MyMaterial (GL_EMISSION, materials[i].emission,alpha);
glMaterialf (GL_FRONT_AND_BACK,GL_SHININESS,materials[i].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[i][j];
int ni=face_indicies[i][j+3];//Normal index
int ti=face_indicies[i][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[i].peRed =
(((i >> pfd.cRedShift) & byRedMask) * 255) / byRedMask;
lpPalette->palPalEntry[i].peGreen =
(((i >> pfd.cGreenShift) & byGreenMask) * 255) / byGreenMask;
lpPalette->palPalEntry[i].peBlue =
(((i >> pfd.cBlueShift) & byBlueMask) * 255) / byBlueMask;
lpPalette->palPalEntry[i].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);
};

Share this post


Link to post
Share on other sites
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 Triangles
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;
}
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[i].alpha;
MyMaterial (GL_AMBIENT, materials[i].ambient,alpha);
MyMaterial (GL_DIFFUSE, materials[i].diffuse,alpha);
MyMaterial (GL_SPECULAR, materials[i].specular,alpha);
MyMaterial (GL_EMISSION, materials[i].emission,alpha);
glMaterialf (GL_FRONT_AND_BACK,GL_SHININESS,materials[i].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[i][j];
int ni=face_indicies[i][j+3];//Normal index
int ti=face_indicies[i][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[i].peRed =
(((i >> pfd.cRedShift) & byRedMask) * 255) / byRedMask;
lpPalette->palPalEntry[i].peGreen =
(((i >> pfd.cGreenShift) & byGreenMask) * 255) / byGreenMask;
lpPalette->palPalEntry[i].peBlue =
(((i >> pfd.cBlueShift) & byBlueMask) * 255) / byBlueMask;
lpPalette->palPalEntry[i].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]

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
  • Advertisement
  • Popular Now

  • Advertisement
  • Similar Content

    • By khawk
      We've just released all of the source code for the NeHe OpenGL lessons on our Github page at https://github.com/gamedev-net/nehe-opengl. code - 43 total platforms, configurations, and languages are included.
      Now operated by GameDev.net, NeHe is located at http://nehe.gamedev.net where it has been a valuable resource for developers wanting to learn OpenGL and graphics programming.

      View full story
    • By TheChubu
      The Khronos™ Group, an open consortium of leading hardware and software companies, announces from the SIGGRAPH 2017 Conference the immediate public availability of the OpenGL® 4.6 specification. OpenGL 4.6 integrates the functionality of numerous ARB and EXT extensions created by Khronos members AMD, Intel, and NVIDIA into core, including the capability to ingest SPIR-V™ shaders.
      SPIR-V is a Khronos-defined standard intermediate language for parallel compute and graphics, which enables content creators to simplify their shader authoring and management pipelines while providing significant source shading language flexibility. OpenGL 4.6 adds support for ingesting SPIR-V shaders to the core specification, guaranteeing that SPIR-V shaders will be widely supported by OpenGL implementations.
      OpenGL 4.6 adds the functionality of these ARB extensions to OpenGL’s core specification:
      GL_ARB_gl_spirv and GL_ARB_spirv_extensions to standardize SPIR-V support for OpenGL GL_ARB_indirect_parameters and GL_ARB_shader_draw_parameters for reducing the CPU overhead associated with rendering batches of geometry GL_ARB_pipeline_statistics_query and GL_ARB_transform_feedback_overflow_querystandardize OpenGL support for features available in Direct3D GL_ARB_texture_filter_anisotropic (based on GL_EXT_texture_filter_anisotropic) brings previously IP encumbered functionality into OpenGL to improve the visual quality of textured scenes GL_ARB_polygon_offset_clamp (based on GL_EXT_polygon_offset_clamp) suppresses a common visual artifact known as a “light leak” associated with rendering shadows GL_ARB_shader_atomic_counter_ops and GL_ARB_shader_group_vote add shader intrinsics supported by all desktop vendors to improve functionality and performance GL_KHR_no_error reduces driver overhead by allowing the application to indicate that it expects error-free operation so errors need not be generated In addition to the above features being added to OpenGL 4.6, the following are being released as extensions:
      GL_KHR_parallel_shader_compile allows applications to launch multiple shader compile threads to improve shader compile throughput WGL_ARB_create_context_no_error and GXL_ARB_create_context_no_error allow no error contexts to be created with WGL or GLX that support the GL_KHR_no_error extension “I’m proud to announce OpenGL 4.6 as the most feature-rich version of OpenGL yet. We've brought together the most popular, widely-supported extensions into a new core specification to give OpenGL developers and end users an improved baseline feature set. This includes resolving previous intellectual property roadblocks to bringing anisotropic texture filtering and polygon offset clamping into the core specification to enable widespread implementation and usage,” said Piers Daniell, chair of the OpenGL Working Group at Khronos. “The OpenGL working group will continue to respond to market needs and work with GPU vendors to ensure OpenGL remains a viable and evolving graphics API for all its customers and users across many vital industries.“
      The OpenGL 4.6 specification can be found at https://khronos.org/registry/OpenGL/index_gl.php. The GLSL to SPIR-V compiler glslang has been updated with GLSL 4.60 support, and can be found at https://github.com/KhronosGroup/glslang.
      Sophisticated graphics applications will also benefit from a set of newly released extensions for both OpenGL and OpenGL ES to enable interoperability with Vulkan and Direct3D. These extensions are named:
      GL_EXT_memory_object GL_EXT_memory_object_fd GL_EXT_memory_object_win32 GL_EXT_semaphore GL_EXT_semaphore_fd GL_EXT_semaphore_win32 GL_EXT_win32_keyed_mutex They can be found at: https://khronos.org/registry/OpenGL/index_gl.php
      Industry Support for OpenGL 4.6
      “With OpenGL 4.6 our customers have an improved set of core features available on our full range of OpenGL 4.x capable GPUs. These features provide improved rendering quality, performance and functionality. As the graphics industry’s most popular API, we fully support OpenGL and will continue to work closely with the Khronos Group on the development of new OpenGL specifications and extensions for our customers. NVIDIA has released beta OpenGL 4.6 drivers today at https://developer.nvidia.com/opengl-driver so developers can use these new features right away,” said Bob Pette, vice president, Professional Graphics at NVIDIA.
      "OpenGL 4.6 will be the first OpenGL release where conformant open source implementations based on the Mesa project will be deliverable in a reasonable timeframe after release. The open sourcing of the OpenGL conformance test suite and ongoing work between Khronos and X.org will also allow for non-vendor led open source implementations to achieve conformance in the near future," said David Airlie, senior principal engineer at Red Hat, and developer on Mesa/X.org projects.

      View full story
    • By _OskaR
      Hi,
      I have an OpenGL application but without possibility to wite own shaders.
      I need to perform small VS modification - is possible to do it in an alternative way? Do we have apps or driver modifictions which will catch the shader sent to GPU and override it?
    • By xhcao
      Does sync be needed to read texture content after access texture image in compute shader?
      My simple code is as below,
      glUseProgram(program.get());
      glBindImageTexture(0, texture[0], 0, GL_FALSE, 3, GL_READ_ONLY, GL_R32UI);
      glBindImageTexture(1, texture[1], 0, GL_FALSE, 4, GL_WRITE_ONLY, GL_R32UI);
      glDispatchCompute(1, 1, 1);
      // Does sync be needed here?
      glUseProgram(0);
      glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
      glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                                     GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, texture[1], 0);
      glReadPixels(0, 0, kWidth, kHeight, GL_RED_INTEGER, GL_UNSIGNED_INT, outputValues);
       
      Compute shader is very simple, imageLoad content from texture[0], and imageStore content to texture[1]. Does need to sync after dispatchCompute?
    • By Jonathan2006
      My question: is it possible to transform multiple angular velocities so that they can be reinserted as one? My research is below:
      // This works quat quaternion1 = GEQuaternionFromAngleRadians(angleRadiansVector1); quat quaternion2 = GEMultiplyQuaternions(quaternion1, GEQuaternionFromAngleRadians(angleRadiansVector2)); quat quaternion3 = GEMultiplyQuaternions(quaternion2, GEQuaternionFromAngleRadians(angleRadiansVector3)); glMultMatrixf(GEMat4FromQuaternion(quaternion3).array); // The first two work fine but not the third. Why? quat quaternion1 = GEQuaternionFromAngleRadians(angleRadiansVector1); vec3 vector1 = GETransformQuaternionAndVector(quaternion1, angularVelocity1); quat quaternion2 = GEQuaternionFromAngleRadians(angleRadiansVector2); vec3 vector2 = GETransformQuaternionAndVector(quaternion2, angularVelocity2); // This doesn't work //quat quaternion3 = GEQuaternionFromAngleRadians(angleRadiansVector3); //vec3 vector3 = GETransformQuaternionAndVector(quaternion3, angularVelocity3); vec3 angleVelocity = GEAddVectors(vector1, vector2); // Does not work: vec3 angleVelocity = GEAddVectors(vector1, GEAddVectors(vector2, vector3)); static vec3 angleRadiansVector; vec3 angularAcceleration = GESetVector(0.0, 0.0, 0.0); // Sending it through one angular velocity later in my motion engine angleVelocity = GEAddVectors(angleVelocity, GEMultiplyVectorAndScalar(angularAcceleration, timeStep)); angleRadiansVector = GEAddVectors(angleRadiansVector, GEMultiplyVectorAndScalar(angleVelocity, timeStep)); glMultMatrixf(GEMat4FromEulerAngle(angleRadiansVector).array); Also how do I combine multiple angularAcceleration variables? Is there an easier way to transform the angular values?
  • Advertisement