转载自:http://blog.csdn.net/fallstones/article/details/6287498
1.纹理
纹理映射就是将一张位图贴在3D模型上,让模型更有真实感。比如一颗人头,眼睛鼻子嘴巴头发都由三角形构成,会给系统带来很大的开销。如果用纹理来做,可以由一个球和人脸的纹理组成,真实感也很强。。(只是个例子,真这么做会很恐怖。。。)
OPENGL把纹理坐标规范化到0与1之间,就是说如果一张正方形的纹理,从左下角开始逆时针方向四个顶点的坐标分别是(0, 0), (1, 0), (1, 1), (0, 1)
纹理映射时根据模型每个顶点的纹理坐标进行绘制。
当模型的大小和纹理大小不一致时,OPENGL会根据设置处理纹理,进行放大或缩小。这个叫纹理过滤器(fileter)
OPENGL可以设置3种纹理过滤器。
1.最近点采样,速度最快,效果最低。
直接对纹理进行放大缩小。举个例子,有两个顶点,坐标是(1, 0)和(3, 0),对应的纹理坐标分别是(0, 0), (0.7, 0)(假设这个纹理中一个像素的直径是0.1)。当判断 (2, 0) 的颜色时,根据线性差值,纹理坐标应该是(0.35, 0),可是这个像素是不存在的,根据就近原则,选择了(0.4, 0) 这个像素的颜色值。
OPENGL中的设置如下(NEHE Lesson 7的代码)
- glBindTexture(GL_TEXTURE_2D,texture[0]);
- 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,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data);
2.线性纹理过滤,速度较最近点采样要低,但是效果好
还是举上面的例子,判断(2, 0) 颜色的时候,取(0.3, 0) 和 (0.4, 0) 的颜色值进行插值,得到(2, 0)的颜色
OPENGL中的设置
-
glBindTexture(GL_TEXTURE_2D,texture[1]);
-
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
-
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
-
glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data);
3.多级渐进纹理(mipmap),速度较快,效果好。
OPENGL自动建立几个不同大小的高质量纹理,根据模型的大小选择丢失颜色信息最少的那张纹理。
OPENGL中的设置
- glBindTexture(GL_TEXTURE_2D,texture[2]);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
NEHE 7读取位图的函数已经不能用了,因为缺少 glaux 库。所以修改了下,用windows api读位图
- boolLoadTexture(LPTSTRszFileName,GLuint&texid)
- {
- HBITMAPhBMP;
- BITMAPBMP;
- glGenTextures(1,&texid);
- hBMP=(HBITMAP)LoadImage(GetModuleHandle(NULL),szFileName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);
- if(!hBMP)
- returnFALSE;
- GetObject(hBMP,sizeof(BMP),&BMP);
- glPixelStorei(GL_UNPACK_ALIGNMENT,4);
- glBindTexture(GL_TEXTURE_2D,texid);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_NEAREST);
- gluBuild2DMipmaps(GL_TEXTURE_2D,3,BMP.bmWidth,BMP.bmHeight,GL_BGR_EXT,GL_UNSIGNED_BYTE,BMP.bmBits);
- DeleteObject(hBMP);
- returnTRUE;
- }
2.材质和光照
物体表面的颜色是由物体的反射光来决定的。如果一个物体呈红色,说明他表面的材质把蓝光和绿光都吸收,而把红光反射(前提是入射光同时含有这3中颜色)。
材质属性有3种,环境光反射(Ambient),漫反射(Diffuse),镜面反射(Specular)
OPENGL中光源也有3种属性,环境光,漫反射,镜面反射。
材质决定了反射光的强度,比如一个材质的环境光反射属性为(R, G, B)(0.1, 0.1, 0.9),说明这个材质把大部分红光和绿光都吸收了,而蓝光则大部分反射。
又假设环境光为(R, G, B)(0.5, 0.5, 0.5),反射的光强就是各颜色分量相乘(0.25, 0.25, 0.49),物体表面就显示为蓝色。(注意这只是环境光的计算模型,漫反射和镜面反射模型并不是简单的对颜色分量相乘,还与光源角度有关。纹理颜色与反射的光强也会叠加)
分享到:
相关推荐
OPENGL光照和纹理技术实例.rar OPENGL光照和纹理技术实例.rar
用OpenGL 绘制我校校门 并光照纹理
使用OpenGl完成纹理光照的添加,使用a,b键进行平移,c,d键进行旋转,L键控制光照开关。纹理与源文件放在同一个文件加下。
opengl纹理源码+光照+碰撞检测+详细注释
OpenGL光照效果 OpenGL光照效果 OpenGL光照效果
opengl有纹理有贴图有光照有影子的青花瓷茶壶,影子采用的是光照模型,存在BUG,不足之处多多谅解。
opengles加载3d模型(纹理+光照)
OpenGL实验八犹他茶壶光照、阴影、纹理,光照效果源码、阴影效果源码、纹理效果源码,及实验截图、实验报告。
OPENGL的几个简单例子 分别从颜色 光照 简单纹理 几个方面做出了解释
NURBS曲面的创建,并实现简单纹理映射与光照模型
裁剪,光照,纹理,教师例子,欢迎下载,opengl,opengl vc++
可以交互实现光照颜色变化,交互控制物体位置,旋转,放缩。对比了有无消隐,增加了纹理。可选择多种加载的物体。
用opengl编的,立方体旋转,纹理贴图,光照控制,按键控制
OpenGL中纹理贴图、滤波、光照和雾化效果编程初步 源代码
本程序画了一个地球仪,包含基本图形的绘制,光照的设置,材质的设置,纹理映射,动画等等
此程序使用Opengl绘制了带6个纹理的立方体(立方体的每个面用bezier曲面表示),实现了键盘和鼠标控制,其中键盘控制如下: L :控制光照光照 ←:向左旋转速度增加 →:向右旋转速度增加 ↑:向上旋转速度增加 ↓:向...
Bezier曲面的创建并实现简单的纹理和光照模型
掌握OpenGL光照、材质和纹理的应用和程序实现; 熟悉使用MFC及OPENGL。 2、基本要求: 要求一:利用glShadeModel实现不同的明暗处理(GL_Smooth对应于Gourand明暗处理)。 要求二:利用glMaterial*定义材质属性。 ...
对应blog的一篇文章 把linux吓得源码改变了一下 在win32下运行的 vs2010工程
OPENGL 画地球-纹理贴图 光照 动画 VS2005工程,需要gl glu glut glaux支持。 有任何问题可留言。