📄 main.cpp
字号:
// *************************************************
// ** **
// ** OpenGL Title Application **
// ** **
// *************************************************
// writen by A. Dmitriy
#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>
#pragma warning(disable: 4305)
#pragma warning(disable: 4244)
#define WND_WIDTH 640
#define WND_HEIGHT 480
#define NUM_TEXTURES 3
static GLboolean Init(void);
static void CALLBACK Reshape(int width, int height);
static void CALLBACK Draw(void);
static void CALLBACK IdleFunc(void);
GLint windW, windH;
GLfloat rotX = 0;
GLfloat rotY = 0;
GLfloat rotZ = 0;
GLuint cubeList = 1;
GLuint reflList = 2;
GLuint texobjs[NUM_TEXTURES];
AUX_RGBImageRec *texture_1;
AUX_RGBImageRec *texture_2;
AUX_RGBImageRec *texture_3;
static GLfloat c[6][4][3] = {
{
{
1.0, 1.0, -1.0
},
{
-1.0, 1.0, -1.0
},
{
-1.0, -1.0, -1.0
},
{
1.0, -1.0, -1.0
}
},
{
{
1.0, 1.0, 1.0
},
{
1.0, 1.0, -1.0
},
{
1.0, -1.0, -1.0
},
{
1.0, -1.0, 1.0
}
},
{
{
-1.0, 1.0, 1.0
},
{
1.0, 1.0, 1.0
},
{
1.0, -1.0, 1.0
},
{
-1.0, -1.0, 1.0
}
},
{
{
-1.0, 1.0, -1.0
},
{
-1.0, 1.0, 1.0
},
{
-1.0, -1.0, 1.0
},
{
-1.0, -1.0, -1.0
}
},
{
{
-1.0, 1.0, 1.0
},
{
-1.0, 1.0, -1.0
},
{
1.0, 1.0, -1.0
},
{
1.0, 1.0, 1.0
}
},
{
{
-1.0, -1.0, -1.0
},
{
-1.0, -1.0, 1.0
},
{
1.0, -1.0, 1.0
},
{
1.0, -1.0, -1.0
}
}
};
static GLfloat n[6][3] = {
{
0.0, 0.0, -1.0
},
{
1.0, 0.0, 0.0
},
{
0.0, 0.0, 1.0
},
{
-1.0, 0.0, 0.0
},
{
0.0, 1.0, 0.0
},
{
0.0, -1.0, 0.0
}
};
static GLfloat t[6][4][2] = {
{
{
1.0, 1.0
},
{
0.0, 1.0
},
{
0.0, 0.0
},
{
1.0, 0.0
}
},
{
{
1.0, 1.0
},
{
0.0, 1.0
},
{
0.0, 0.0
},
{
1.0, 0.0
}
},
{
{
0.0, 1.0
},
{
1.0, 1.0
},
{
1.0, 0.0
},
{
0.0, 0.0
}
},
{
{
1.0, 1.0
},
{
0.0, 1.0
},
{
0.0, 0.0
},
{
1.0, 0.0
}
},
{
{
1.0, 1.0
},
{
0.0, 1.0
},
{
0.0, 0.0
},
{
1.0, 0.0
}
},
{
{
1.0, 1.0
},
{
0.0, 1.0
},
{
0.0, 0.0
},
{
1.0, 0.0
}
},
};
static GLboolean Init(void)
{
texture_1 = auxDIBImageLoad("t1.dib");
if (texture_1 == NULL) return GL_FALSE;
texture_2 = auxDIBImageLoad("t2.dib");
if (texture_2 == NULL) return GL_FALSE;
texture_3 = auxDIBImageLoad("t3.dib");
if (texture_2 == NULL) return GL_FALSE;
GLfloat glfLightDiffuse[] = { 1.0f, 0.9f, 0.8f, 1.0f };
GLfloat fogColor[] = {0.4f, 0.2f, 0.1f, 1.0f};
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_DIFFUSE, glfLightDiffuse);
glEnable(GL_LIGHT0);
glEnable(GL_FOG);
glFogi(GL_FOG_MODE, GL_EXP);
glFogfv(GL_FOG_COLOR, fogColor);
glFogf(GL_FOG_DENSITY, 0.4f);
glClearColor(fogColor[0], fogColor[1], fogColor[2], fogColor[3]);
glGenTextures(NUM_TEXTURES, texobjs);
glBindTexture(GL_TEXTURE_2D, texobjs[0]);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, texture_1->sizeX, texture_1->sizeY,
GL_RGB, GL_UNSIGNED_BYTE, texture_1->data);
glBindTexture(GL_TEXTURE_2D, texobjs[1]);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, texture_2->sizeX, texture_2->sizeY,
GL_RGB, GL_UNSIGNED_BYTE, texture_2->data);
glBindTexture(GL_TEXTURE_2D, texobjs[2]);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, texture_3->sizeX, texture_3->sizeY,
GL_RGB, GL_UNSIGNED_BYTE, texture_3->data);
glEnable(GL_TEXTURE_2D);
glNewList(cubeList, GL_COMPILE);
for (GLint i = 0; i < 6; i++) {
glBindTexture(GL_TEXTURE_2D, texobjs[i & 1]);
glBegin(GL_POLYGON);
glNormal3fv(n[i]); glTexCoord2fv(t[i][0]); glVertex3fv(c[i][0]);
glNormal3fv(n[i]); glTexCoord2fv(t[i][1]); glVertex3fv(c[i][1]);
glNormal3fv(n[i]); glTexCoord2fv(t[i][2]); glVertex3fv(c[i][2]);
glNormal3fv(n[i]); glTexCoord2fv(t[i][3]); glVertex3fv(c[i][3]);
glEnd();
}
glEndList();
glNewList(reflList, GL_COMPILE);
for (i = 0; i < 6; i++) {
glBindTexture(GL_TEXTURE_2D, texobjs[2]);
glBegin(GL_POLYGON);
glNormal3fv(n[i]); glTexCoord2fv(t[i][0]); glVertex3fv(c[i][0]);
glNormal3fv(n[i]); glTexCoord2fv(t[i][1]); glVertex3fv(c[i][1]);
glNormal3fv(n[i]); glTexCoord2fv(t[i][2]); glVertex3fv(c[i][2]);
glNormal3fv(n[i]); glTexCoord2fv(t[i][3]); glVertex3fv(c[i][3]);
glEnd();
}
glEndList();
return GL_TRUE;
}
static void CALLBACK Reshape(int width, int height)
{
if (!width) return;
windW = (GLint)width;
windH = (GLint)height;
GLfloat aspect = (GLfloat)windW / (GLfloat)windH;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(75.0f,
aspect,
0.5f,
25.0f);
glViewport (0, 0, windW, windH);
}
static void CALLBACK Draw(void)
{
GLfloat glfMaterialColorSolid[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat glfMaterialColorTrans[] = { 1.0f, 1.0f, 1.0f, 0.4f };
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -3.2f);
glRotatef(rotX, 1.0f, 0.0f, 0.0f);
glRotatef(rotY, 0.0f, 1.0f, 0.0f);
glRotatef(rotZ, 0.0f, 0.0f, 1.0f);
glMaterialfv(GL_FRONT, GL_DIFFUSE, glfMaterialColorSolid);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glCallList(cubeList);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
glMaterialfv(GL_FRONT, GL_DIFFUSE, glfMaterialColorTrans);
glCallList(reflList);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_BLEND);
glFlush();
auxSwapBuffers();
}
static void CALLBACK IdleFunc(void)
{
rotX += 0.1f;
rotY += 0.2f;
rotZ += 0.3f;
Draw();
}
void main(int, char **)
{
windW = WND_WIDTH;
windH = WND_HEIGHT;
auxInitPosition(0, 0, windW, windH);
auxInitDisplayMode(AUX_RGB | AUX_DOUBLE | AUX_DEPTH16);
if (auxInitWindow("OpenGL TEST - The Cube of Power") == GL_FALSE) {
auxQuit();
}
if (Init() == GL_FALSE) {
auxQuit();
}
auxReshapeFunc((AUXRESHAPEPROC)Reshape);
auxIdleFunc((AUXIDLEPROC)IdleFunc);
auxMainLoop(Draw);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -