⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 This a cube of power of 3D Graphics. Very simple OpenGL example that shows how to create Your s fir
💻 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 + -