可以让OpenGL自动生成纹理坐标,而不是使用glTexCoord*()函数显示地分配纹理坐标
void glTexGeni (GLenum coord, GLenum pname, GLint param);
coord | pname | param |
{GL_S,GL_T}或{GL_R,GL_Q} | GL_TEXTURE_GEN_MODE | GL_OBJECT_LINEAR GL_EYE_LINEAR GL_SPHERE_MAP GL_NORMAL_MAP GL_REFLECTION_MAP |
GL_OBJECT_PLANE | 浮点型数值 | |
GL_EYE_PLANE | 浮点型数值 |
GL_OBJECT_LINEAR:物体模式,纹理会跟随物体的转动而转动(左图)
GL_EYE_LINEAR:视觉模式,纹理部会跟随物体的转动而转动,始终保持原状(右图)
GL_SPHERE_MAP:环境纹理(球体贴图)具有很好的反射效果
GL_REFLECTION_MAP:环境纹理(反射纹理)可替换GL_SPHERE_MAP
GL_NORMAL_MAP:常用于立方体贴图,或者散射与反射的场景
GL_NORMAL_MAP球体贴图 GL_REFLECTION_MAP球体贴图
纹理贴图做法
1设置纹理环绕模式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
2.设置纹理生成模式
glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR);
3.启用自动生成纹理
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
立方图纹理
立方图纹理是一种比较特殊的纹理技术,它用6幅二维图像构成一个以原点为中心的纹理立方体,对于每个片段,纹理坐标(S,T,R)被当做方向向量看待,每个纹理单元都表示从原点所看到的纹理立方体上的图像
可以调用glTexImage2D函数6次,分别使用他target参数表示立方体的各个面(+X,-X,+Y,-Y,+Z,-Z)从而创建一个立方体
glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT, 0, GL_RGBA, imageSize, imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image1); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT, 0, GL_RGBA, imageSize, imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image4); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT, 0, GL_RGBA, imageSize, imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image2); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT, 0, GL_RGBA, imageSize, imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image5); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT, 0, GL_RGBA, imageSize, imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image3); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT, 0, GL_RGBA, imageSize, imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image6); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT); glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);
#include "header.h" #define stripeImageWidth 16 #define checkImageWidth 16 #define checkImageHeight 16 #define imageSize 4 static GLubyte image1[imageSize][imageSize][4]; static GLubyte image2[imageSize][imageSize][4]; static GLubyte image3[imageSize][imageSize][4]; static GLubyte image4[imageSize][imageSize][4]; static GLubyte image5[imageSize][imageSize][4]; static GLubyte image6[imageSize][imageSize][4]; static GLubyte checkImage[checkImageWidth][checkImageHeight][4]; static GLubyte stripeImage[4*stripeImageWidth]; static GLuint texName; static GLfloat xequalzero[] = {1.0, 0.0, 0.0, 0.0}; static GLfloat slanted[] = {1.0, 1.0, 1.0, 0.0}; static GLfloat *currentCoeff; static GLenum currentPlane; static GLint currentGenMode; double angle=0.0; enum Shape { CUBE, SPHERE, TEAPOT, CONE }shape; shape=TEAPOT; void makeImage() { int i,j,c; for ( i=0;i<checkImageWidth;i++) { for (j = 0; j < checkImageHeight; j++) { if(j%4==0) { checkImage[i][j][0]=0; checkImage[i][j][1]=255; checkImage[i][j][2]=0; checkImage[i][j][3]=255;; j++; if(j>=checkImageHeight) { break; } checkImage[i][j][0]=0; checkImage[i][j][1]=255; checkImage[i][j][2]=0; checkImage[i][j][3]=255;; }else { checkImage[i][j][0]=255; checkImage[i][j][1]=0; checkImage[i][j][2]=0; checkImage[i][j][3]=255; } } } for (i = 0; i < imageSize; i++) { for (j = 0; j < imageSize; j++) { //c = ((((i&0x1)==0)^((j&0x1))==0))*255; image1[i][j][0] = (GLubyte) 255; image1[i][j][1] = (GLubyte) 0; image1[i][j][2] = (GLubyte) 0; image1[i][j][3] = (GLubyte) 255; image2[i][j][0] = (GLubyte) 0; image2[i][j][1] = (GLubyte) 255; image2[i][j][2] = (GLubyte) 0; image2[i][j][3] = (GLubyte) 255; image3[i][j][0] = (GLubyte) 0; image3[i][j][1] = (GLubyte) 0; image3[i][j][2] = (GLubyte) 255; image3[i][j][3] = (GLubyte) 255; image4[i][j][0] = (GLubyte) 255; image4[i][j][1] = (GLubyte) 255; image4[i][j][2] = (GLubyte) 0; image4[i][j][3] = (GLubyte) 255; image5[i][j][0] = (GLubyte) 255; image5[i][j][1] = (GLubyte) 0; image5[i][j][2] = (GLubyte) 255; image5[i][j][3] = (GLubyte) 255; image6[i][j][0] = (GLubyte) 0; image6[i][j][1] = (GLubyte) 255; image6[i][j][2] = (GLubyte) 255; image6[i][j][3] = (GLubyte) 255; } } } void display(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); //glRotated(-90,1,0,0); glRotated(angle,0,1,1); glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_CUBE_MAP_EXT); glBindTexture(GL_TEXTURE_2D,texName); if(shape==TEAPOT) { glEnable(GL_TEXTURE_2D); glutSolidTeapot(100); }else if(shape==SPHERE) { glEnable(GL_TEXTURE_2D); glutSolidSphere(100,50,32); }else if(shape==CUBE) { glEnable(GL_TEXTURE_CUBE_MAP_EXT); glutSolidCube(100); }else if(shape==CONE) { glEnable(GL_TEXTURE_2D); glutWireCone(200,200,16,16); } glutSwapBuffers(); glFlush(); } void init() { makeImage(); glClearColor(0,0,0,0); glClearDepth(1.0); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glShadeModel(GL_SMOOTH); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glGenTextures(1,&texName); glBindTexture(GL_TEXTURE_2D,texName); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight,0,GL_RGBA, GL_UNSIGNED_BYTE, checkImage); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); } void reshape(int w, int h) { glViewport(0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-400,400,-300,300,-1000,1000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void keyboard(unsigned char key,int x,int y) { switch (key) { case 't': shape=TEAPOT; //glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); //glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); glutPostRedisplay(); break; case 's': shape=SPHERE; glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP); glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP); glutPostRedisplay(); break; case 'c': shape=CUBE; glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_R, GL_REPEAT); glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT, 0, GL_RGBA, imageSize, imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image1); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT, 0, GL_RGBA, imageSize, imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image4); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT, 0, GL_RGBA, imageSize, imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image2); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT, 0, GL_RGBA, imageSize, imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image5); glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT, 0, GL_RGBA, imageSize, imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image3); glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT, 0, GL_RGBA, imageSize, imageSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, image6); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT); glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_GEN_R); //glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP); //glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP); glutPostRedisplay(); break; case 'n': shape=CONE; //glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); //glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); glutPostRedisplay(); break; case 'e': glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR); glutPostRedisplay(); break; case 'o': glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); glutPostRedisplay(); break; } } void rotate() { angle+=0.1; glutPostRedisplay(); } void mouse(int button,int state,int x,int y) { switch(button) { case GLUT_LEFT_BUTTON: if(GLUT_DOWN==state) { glutIdleFunc(rotate); } break; case GLUT_RIGHT_BUTTON: if(GLUT_DOWN==state) { glutIdleFunc(0); } break; } } int main(int argc,char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(800,600); glutInitWindowPosition(100,100); glutCreateWindow("纹理坐标自动生成"); glewInit(); init(); glutDisplayFunc(display); glutKeyboardFunc(keyboard); glutReshapeFunc(reshape); glutMouseFunc(mouse); glutMainLoop(); }
相关推荐
opengl 纹理坐标自动产生 自动产生纹理坐标 标准opengl
自动生成纹理坐标的小茶壶,由VC++6.0 opengl完成的
实验一 OpenGL+GLUT开发平台搭建 5 小实验1: 开发环境设置 5 小实验2: 控制窗口位置和大小 6 小实验3:默认的可视化范围 6 小实验4:自定义可视化...小实验14:纹理映射—纹理坐标的自动生成(基于参考面距离) 61
总的来说,OpenGL中的纹理应用是通过创建纹理对象、设置纹理坐标、加载图像数据以及在着色器中采样来实现的。通过熟练掌握这些技术,开发者可以创造出具有高度真实感和视觉吸引力的3D场景。在地球映射到茶壶的例子中...
GLAD是一个自动生成OpenGL函数加载代码的工具,可以简化OpenGl函数的获取过程。 **3.5.1 设置GLAD** 设置GLAD包括以下步骤: - 下载并安装GLAD。 - 配置GLAD生成所需的头文件和源文件。 - 将生成的文件包含到项目...
在OpenGL中,可以通过glTexGen()函数为纹理生成自动生成的纹理坐标。它是一种自动化的技术,可以按照一定的方式计算出纹理坐标,从而减轻程序员的工作负担。 环境映射(Environment Mapping)是一种特殊的纹理映射...
在绘制过程中,OpenGL会自动将纹理坐标与纹理对象结合,完成纹理贴图。 7. **清理资源**:完成渲染后,记得解除纹理绑定并删除纹理对象,以释放GPU资源。 在提供的`Win32Program-VA-Texture`文件中,应该包含了一...
### OpenGL纹理映射详解 #### 一、简介 OpenGL 是一种用于渲染 2D 和 3D 图形的标准规范,广泛应用于游戏开发、虚拟现实、科学可视化等领域。纹理映射是 OpenGL 中的一项关键技术,它允许将图像(纹理)贴附在 3D ...
在绘制物体时,使用`glEnable`开启纹理坐标传递,并调用`glTexCoord2f`指定每个顶点的纹理坐标。然后,使用`glDrawArrays`或`glDrawElements`绘制物体,OpenGL会自动完成纹理映射。 在`8textureex1`这个示例中,...
5. 在着色器中应用纹理:在顶点着色器中定义纹理坐标,片段着色器中采样纹理并计算颜色。 三、OpenGL着色器 GLSL着色器是运行在GPU上的小程序,分为顶点着色器和片段着色器: 1. 顶点着色器:处理每个顶点,计算其...
5. 绘制球体:在绘制球体时,同时传递顶点坐标和纹理坐标,OpenGL会自动将纹理应用到球体表面。 在实际编程中,我们可能还需要考虑光照、投影和视口变换等问题,以获得更好的视觉效果。光照模型控制着物体表面如何...
顶点着色器通常会处理位置和纹理坐标,而片段着色器则会根据纹理坐标从环境贴图中采样颜色,并将其应用到像素上。 5. **设置着色器**:使用`glUseProgram`激活着色器程序,并通过`glUniform`传递必要的 uniforms,...
OpenGL纹理图是计算机图形学中的一个关键概念,用于在3D场景中添加视觉细节和真实感。OpenGL(Open Graphics Library)是一种跨语言、跨平台的编程接口,它允许程序员高效地绘制复杂的3D图形和图像。纹理图是OpenGL...
1. **加载纹理**:使用库如SOIL或stb_image等加载图像文件,生成OpenGL纹理对象。这个过程包括读取图像数据,分配纹理ID,并设置纹理参数,如过滤模式(minification和magnification filter)和包裹模式(wrapping ...
OpenGL是计算机图形学中的一种广泛应用的编程接口,用于在各种操作系统和硬件上生成二维和三维图像。本项目涉及的关键知识点包括OpenGL的平移、缩放、旋转操作,以及纹理映射和消隐技术。 首先,平移、缩放和旋转是...
总之,这个项目为初学者提供了一个学习OpenGL纹理映射和动态效果的良好起点。通过这个实践,你可以逐步掌握如何在Windows环境下结合MFC进行图形编程,并为未来的三维建模和动画制作打下坚实的基础。同时,与其他爱好...
5. 生成Mipmaps:使用`glGenerateMipmap()`函数自动生成所有缺失的mipmap级别。这是一个方便的函数,可以省去手动创建每个级别的麻烦。 6. 绑定纹理到几何对象:将纹理绑定到OpenGL顶点着色器中定义的纹理坐标,...
OpenGL会自动根据纹理坐标和已绑定的纹理进行贴图。 在你的例子中,"纹理显示文字"可能是指将文字作为纹理映射到一个四边形面片上。这通常涉及到创建一个包含文字的BMP图像,然后按照上述步骤进行纹理处理。也可以...
OpenGL的`glGenerateMipmap()`函数可以自动生成MIP贴图。 总结,OpenGL纹理映射是3D图形渲染的关键技术,它使得我们在六面体或其他3D模型上实现复杂的视觉效果成为可能。通过对纹理的加载、坐标设置、绑定以及各种...
2. **纹理坐标**:每个顶点需要一个对应的纹理坐标,以确定纹理应该如何覆盖在3D模型上。纹理坐标在[0,1]范围内,(0,0)表示纹理左下角,(1,1)表示右上角。 3. **纹理过滤**:为了处理纹理缩放或拉伸时的像素化问题...