8.5为面片添加纹理
Code:
glBegin(GL_QUADS);
glTexCoord2f(0.0,0.0);glVertex3f(1.0,2.5,1.5);
glTexCoord2f(0.0,0.6);glVertex3f(1.0,3.7,1.5);
glTexCoord2f(0.8,0.6);glVertex3f(2.0,3.7,1.5);
glTexCoord2f(0.8,0.0);glVertex3f(2.0,2..5,1.5);
glEnd();
注意:纹理坐标值不能超过1.0,否则按裁剪算法进行裁剪
为网格模型添加纹理坐标
1.纹理坐标列表
2.模型中纹理信息的组织方法
(1)面片顶点的数量
面片法向的索引
顶点索引的列表
纹理坐标索引的列表
(2)面片顶点的数量
顶点索引的列表
渲染纹理
理性线性绘制 rational linear rendering
双曲线插值 hyperbolic interpolation
视锥 view volume
纹理的卷绕和剪裁
卷绕 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
设置t方向上 将GL_TEXTURE_WRAP_T
关掉平铺 将GL_REPEAT替换为GL_CLAMP
纹理调和
创建一个发光体 可见亮度等于纹理值
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
改进 Phong镜面反射的颜色是光源的颜色,高光不依赖纹理
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE) ;
8_5_4例子的代码如下:
运行结果如下:
新学过的接口函数: glPixelStorei(GL_UNPACK_ALIGNMENT,1); glDrawPixels(nCols,nRows,GL_RGB,GL_UNSIGNED_BYTE,pixel); glReadPixels(x,y,nCols,nRows,GL_RGB,GL_UNSIGNED_BYTE,pixel); glutPostRedisplay(); glBindTexture(GL_TEXTURE_2D,textureName); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,nCols,nRows,0,GL_RGB,GL_UNSIGNED_BYTE,pixel); glutIdleFunc(spinner); glHint(GL_PERSPECTIVE,GL_NICEST); //此函数要求OpenGL正确的(使双曲线插值)渲染纹理,这样当面片相对观察者旋转地时候,纹理才会正确的贴在面片之上 反射映射 铬映射 chrome mapping 环境映射 environment mapping 对于纹理包裹在一个大的包围立方体的情况,OpenGL提供了进行这种近似环境映射的工具 glTexGenf(GL_S,GL_TEXTURE_GEN_MODE,GL_CUBE_MAP) ; glTexGenf(GL_T,GL_TEXTURE_GEN_MODE,GL_CUBE_MAP) ; glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T) ;