在三维空间中,实现物体表面纹理的绘制,通过菜单完成:
#include <iostream>
#include <cmath>
#include<windows.h>
#include<stdlib.h>
#include<gl/glut.h>
#include<stdio.h>
#include<math.h> //X86
#include<glaux.h>
#pragma comment(lib, "glaux")
#define Width 32
#define Height 32
GLubyte texImage[Height][Width][3];
float rot = 0;
GLuint texture[6];
GLuint texture2[1];
int yourselect;
void Init();
void Reshape(int w, int h);
void LoadGLTextures();
void Loadfunctt();
void makeTexture();
void myDisplay();
void idle();
void menu(int menultem);
void Init()
{
glClearColor(0.0f, 0.0f,0.1f, 0);//清除颜色函数。会清除(即绘制)的背景色。
glCullFace(GL_BACK);//背面不可见
glEnable(GL_CULL_FACE);//裁剪
glEnable(GL_TEXTURE_2D);//开启纹理
}
void Reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
//glMatrixMode设置接下来的矩阵操作为投影矩阵或模型视图矩阵
//GL_PROJECTION参数用于设置接下来的操作为投影矩阵,GL_MODELVIEW参数则用于设置接下来的操作为模型视图矩阵。
//投影矩阵定义了从视点到裁剪平面的映射,决定了哪些物体可以被渲染以及它们在窗口中的位置。
// 模型视图矩阵则定义了物体在空间中的位置、旋转和缩放。
glLoadIdentity();
glOrtho(-w / 2, w / 2, -h / 2, h / 2, -300, 300);//设置一个二维的正交投影矩阵。void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void LoadGLTextures()
{
AUX_RGBImageRec* someImage[6];//几幅图
memset(someImage, 0, sizeof(void*) * 6);
someImage[0] = auxDIBImageLoad("picture_of_bmp\\bzh.bmp");
someImage[1] = auxDIBImageLoad("picture_of_bmp\\bzhs.bmp");
someImage[2] = auxDIBImageLoad("picture_of_bmp\\bzhh.bmp");
someImage[3] = auxDIBImageLoad("picture_of_bmp\\bzhc.bmp");
someImage[4] = auxDIBImageLoad("picture_of_bmp\\bzhc.bmp");
someImage[5] = auxDIBImageLoad("picture_of_bmp\\bzhh.bmp");
/*for (int i = 0; i < 6; i++) {
someImage[i] = auxDIBImageLoad("picture_of_bmp\\bzhbzh.bmp");
}*/
for (int i = 0; i < 6; i++) {
if (someImage[i]) //纹理是否存在********
{
/*printf("times of for :%d\n",i);///ttt
printf("2\n");///ttttt*/
glGenTextures(1, &texture[i]); //创建纹理
glBindTexture(GL_TEXTURE_2D, texture[i]); //绑定纹理
glTexImage2D(GL_TEXTURE_2D, 0, 3, someImage[i]->sizeX, someImage[i]->sizeY, 0,GL_RGB, GL_UNSIGNED_BYTE, someImage[i]->data);//GL_TEXTURE_2D用于渲染2D图像或贴图到3D模型上。//纹理对象的类型,分辨率级别,3代表rgb,长,款,边框,数据格式和数据类型,一个指向内存中图像数据的指针。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);//设置纹理参数//纹理对象的类型,纹理参数的名称,
free(someImage[i]); //someImage[i] = NULL;//释放图像结构变量占用的内存
}//glGenTextures函数创建纹理对象,然后使用glBindTexture函数将纹理对象绑定到当前的纹理单元上。接着使用glTexImage2D函数将图像数据传递给纹理对象,其中包括图像的分辨率、格式和数据。//最后使用glTexParameteri函数设置纹理参数,例如纹理过滤器和纹理环绕方式。最后使用free函数释放图像结构变量占用的内存。
else {
printf("不存在");
}
}
}
void makeTexture() {
int c;
for (int i = 0; i < Height; i++)
{
for (int j = 0; j < Width; j++) {
c = (((i & 0x32) == 0) ^ ((j & 0x32)) == 0) * 255;
texImage[i][j][0] = (GLubyte)c;
texImage[i][j][1] = (GLubyte)c;
texImage[i][j][2] = (GLubyte)c;
}
}
}
void Loadfunctt() { //函数纹理
makeTexture();
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);//像素传输
glGenTextures(1, &texture2[0]);
glBindTexture(GL_TEXTURE_2D, texture2[0]); //绑定纹理
glTexImage2D(GL_TEXTURE_2D, 0, 3, Width, Height, 0, GL_RGB, GL_UNSIGNED_BYTE, texImage);//贴图
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
}
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glRotatef(rot, 1, 0, 0);
glRotatef(rot, 0, 1, 0);
glRotatef(rot, 0, 0, 1);
glutWireCube(200);
if (yourselect == 1) {
LoadGLTextures();
glBindTexture(GL_TEXTURE_2D, texture[0]);//front
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-100, -100, 100);
glTexCoord2f(1.0f, 0.0f); glVertex3f(100, -100, 100);
glTexCoord2f(1.0f, 1.0f); glVertex3f(100, 100, 100);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-100, 100, 100);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[1]);//back
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-100, -100, -100);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-100, 100, -100);
glTexCoord2f(0.0f, 1.0f); glVertex3f(100, 100, -100);
glTexCoord2f(0.0f, 0.0f); glVertex3f(100, -100, -100);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[2]);//top
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-100, 100, -100);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-100, 100, 100);
glTexCoord2f(1.0f, 0.0f); glVertex3f(100, 100, 100);
glTexCoord2f(1.0f, 1.0f); glVertex3f(100, 100, -100);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[3]);//bottom
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-100, -100, -100);
glTexCoord2f(0.0f, 1.0f); glVertex3f(100, -100, -100);
glTexCoord2f(0.0f, 0.0f); glVertex3f(100, -100, 100);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-100, -100, 100);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[4]);//right
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f); glVertex3f(100, -100, -100);
glTexCoord2f(1.0f, 1.0f); glVertex3f(100, 100, -100);
glTexCoord2f(0.0f, 1.0f); glVertex3f(100, 100, 100);
glTexCoord2f(0.0f, 0.0f); glVertex3f(100, -100, 100);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[5]);//left
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-100, -100, -100);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-100, -100, 100);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-100, 100, 100);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-100, 100, -100);
glEnd();
glFlush();
glutSwapBuffers();
//glutWireSphere(100, 16, 16);
//LoadGLTextures();
//for (int i = 0; i < 6; i++) {
// glClear(GL_COLOR_BUFFER_BIT);
// //printf("5\n");
// if (i <= 1) {
// printf("6\n");
// glBindTexture(GL_TEXTURE_2D, texture[i]);//绑定
// glBegin(GL_QUADS);//平面四边形
// glTexCoord2f(0, 0);//z=+-100的面
// glVertex3f(-100, -100, pow(-1, i) * 100);
// glTexCoord2f(1, 0);
// glVertex3f(100, -100, pow(-1, i) * 100);
// glTexCoord2f(1, 1);
// glVertex3f(100, 100, pow(-1, i) * 100);
// glTexCoord2f(0, 1);
// glVertex3f(-100, 100, pow(-1, i) * 100);
// glEnd();
// //glFlush();
// //glutSwapBuffers();//在双缓冲窗口系统中交换前缓冲区和后缓冲区
// }
// else if (i > 1 && i <= 3) {
// glBindTexture(GL_TEXTURE_2D, texture[i]);
// printf("7\n");
// glBegin(GL_QUADS);//平面四边形
// glTexCoord2f(1, 0);//x=100的面
// glVertex3f(pow(-1, i) * 100, -100, 100);
// glTexCoord2f(0, 0);//
// glVertex3f(pow(-1, i) * 100, -100, -100);
// glTexCoord2f(1, 1);
// glVertex3f(pow(-1, i) * 100, 100, -100);
// glTexCoord2f(0, 1);
// glVertex3f(pow(-1, i) * 100, 100, 100);
// glEnd();
// //glFlush();
// //glutSwapBuffers();//在双缓冲窗口系统中交换前缓冲区和后缓冲区
// }
// else if (i > 3 && i <= 5) {
// glBindTexture(GL_TEXTURE_2D, texture[i]);
// printf("8\n");
// glBegin(GL_QUADS);//平面四边形
// glTexCoord2f(1, 0);//y=100的面
// glVertex3f(-100, 100, pow(-1, i) * 100);
// glTexCoord2f(0, 0);//
// glVertex3f(-100, -100, pow(-1, i) * 100);
// glTexCoord2f(1, 1);
// glVertex3f(100, -100, pow(-1, i) * 100);
// glTexCoord2f(0, 1);
// glVertex3f(100, 100, pow(-1, i) * 100);
// glEnd();
// //glFlush();
// //glutSwapBuffers();//在双缓冲窗口系统中交换前缓冲区和后缓冲区
// }
// //在双缓冲窗口系统中交换前缓冲区和后缓冲区
//}
//glFlush();
//glutSwapBuffers();
}
else if (yourselect == 2) {
//glClear(GL_COLOR_BUFFER_BIT);
Loadfunctt();//函数纹理
glutSolidTeapot(200);
//glutWireCube(200);
glutSwapBuffers();
}
else if (yourselect == 3) {
exit('End');
}
// glScalef(1.5*k, 1.5*k, 1.5*k);
// glutWireSphere(100, 16, 16);
// glRotatef(10*k, 0.0, 0.0, 1.0);
//printf("9\n");
}
void idle()
{
rot += 1;
glutPostRedisplay();//
Sleep(50);
}
void menu(int menultem) {
yourselect = menultem;
glutPostRedisplay();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
// 在这里设置双缓冲区。
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(600, 600);
glutCreateWindow("TEXTURE");
//glutMouseFunc(myMouse);
Init();
int menuld = glutCreateMenu(menu);
glutAddMenuEntry("picture_grain", 1);
glutAddMenuEntry("functon_grain", 2);
glutAddMenuEntry("End", 3);
glutAttachMenu(GLUT_RIGHT_BUTTON);
//glutIdleFunc(RenderScene);
glutDisplayFunc(myDisplay);
glutReshapeFunc(Reshape);
glutIdleFunc(idle);
glutMainLoop();//
return 0;
}
结果展示: