高级计算机图形学OpenGL纹理映射

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(s,t),由于ax+by+cz+dw与该距离成比例,有 s = a s x + bs y + c s z + ds w t = a t x + bt y + c t z + dt w
25
指定纹理坐标


对象坐标系:纹理固定在对象上 视点坐标系:纹理图案பைடு நூலகம்变换变化,感觉 像对象穿过纹理场
26
纹理对象

OpenGL提供了纹理对象功能
• 纹理对象存储纹理数组和各种纹理参数 • 纹理内存可以保存多个纹理对象 • GLuint mytex; • glGenTextures(1,&mytex); • glActiveTexture(GL_TEXTURE0); • glBindTexture(GL_TEXTURE_2D, mytex); • glTexImage2D(GL_TEXTURE_2D,……); • glTexParameteri( GL_TEXTURE_2D, ……);
32
指定纹理坐标
void quad( int a, int b, int c, int d ) { quad_colors[Index] = colors[a]; points[Index] = vertices[a]; tex_coords[Index] = vec2( 0.0, 0.0 ); index++; quad_colors[Index] = colors[a]; points[Index] = vertices[b]; tex_coords[Index] = vec2( 0.0, 1.0 ); index++; // other vertices }
27
纹理对象

void glGenTextures(GLsizei n, GLuint *textureNames);
• • •
产生n个未使用的纹理对象名称 检查一个纹理名称是否被使用 创建或切换纹理对象,target为GL_TEXTURE_2D等 删除纹理对象 选择活动纹理单元, texture取值GL_TEXTUREi ,默认
18
纹理的Mipmap

Mipmap对纹理位图进行预先滤波,降低分辨率 在纹理定义时声明mipmap的层次,level=0,1,…
glTexImage2D( GL_TEXTURE_2D, level, width, height, … );

OpenGL可以为活动纹理单元自动生成mipmap
• glGenerateMipmap(
纹理(下方)是 256 256 的 图像,它被映射到一个矩形 上,经透视投影后的结果显 示在上方
7
纹理映射与OpenGL流水线

图像与几何分别经过不同的流水线,在片 段处理时合二为一
• “复杂的”纹理并不影响几何的复杂性
几何流水线 片段处理器
顶点
图像
像素流水线
8
指定纹理图像

利用CPU内存中的纹素数组定义纹理图像
33
纹理对象
GLuint textures[1]; glGenTextures( 1, textures ); glBindTexture( GL_TEXTURE_2D, textures[0] ); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, TextureSize, TextureSize, 0, GL_RGB, GL_UNSIGNED_BYTE, image ); 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_MAG_FILTER, GL_NEAREST ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); glActiveTexture( GL_TEXTURE0 );
10
映射纹理

基于参数纹理坐标:为每个顶点指定纹理坐标
纹理空间
对象空间
11
插值


OpenGL应用双线性插值从给定的纹理坐标中求 出适当的纹素 可以只应用纹理的一部分

方法是只应用纹理坐标的一部分,如最大纹理坐标为 (0.5,0.5)
12
变形


对于四边形,从纹理坐标到顶点的对应是比较 直接的 对于一般的多边形,程序员必须决定如何给顶 点赋纹理坐标

本节只讨论从二维纹理到曲面的映射
4
基本策略
应用纹理需要下面三个步骤



• • •
• •
指定纹理
读入或生成图像 赋给纹理 激活纹理映射功能
由应用程序建立适当的映射函数 环绕(wrapping), 滤波(filtering)
5
给每个顶点赋纹理坐标 指定纹理参数
纹理映射
几何体
屏幕
图像
6
纹理示例

几何对象 纹理单元0 纹理单元1 纹理单元2
29
帧缓冲区
使用纹理


通常在片段着色器中通过采样器sampler来访 问纹理 采样器从纹理对象中返回纹理颜色值
in vec4 color; //color from rasterizer in vec2 texCoord; //texure coordinate from rasterizer uniform sampler2D texMap; //texture object from application out vec4 fColor; void main() { fColor = color * texture( texMap, texCoord ); }
• • • • • • • •
target:纹理的类型,如GL_TEXTURE_2D level:用于mipmapping,0表示单分辨率纹理图像 internalFormat:纹素的分量格式,GL_RGB,GL_RGBA等 width和height: pixels的宽度和高度 border:必须为0 format:图像数据pixels的格式, GL_RGB,GL_RGBA等 type:pixels分量的数据类型, GL_BYTE, GL_INT等 pixels:指向纹素数组的指针
高级计算机图形学
中国科学技术大学计算机学院 黄章进 zhuang@ustc.edu.cn
第三节
OpenGL纹理映射
2
基本内容

OpenGL中的纹理函数以及选项
3
OpenGL与纹理

OpenGL支持许多纹理映射选项
• 第一版包含了把一维或二维纹理映射到一维至 •
四维图形对象的函数 现在的版本提供了三维纹理,但需要高端硬件 的支持
target, type, mode )
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
• GLubyte • •
my_texels[512][512][3];

定义纹理图像所用的像素图
扫描图像 由应用程序代码创建

激活纹理映射
• glEnable(GL_TEXTURE_2D); • OpenGL支持一至四维纹理映射
9
把图像定义为纹理
void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);

可能会出现变形
13
纹理参数

OpenGL中有许多参数来确定纹理的应用 方式
• Wrapping参数确定当s, t的值超出[0,1]区间后



的处理方法 Filter模式允许用区域平均方法来代替点采样方 法 Mimmapping技术使得能以不同的分辨率应用 纹理 环境参数确定纹理映射与明暗处理的交互作用
mipmapped 的线性滤波
23
指定纹理坐标

纹理坐标内部表示为四维向 量,可以用纹理变换矩阵进 行变换(缩放、旋转),得 到纹理与对象、照相机或光 源一起运动的效果 给多边形网格赋恰当的纹理 坐标并不容易

24
指定纹理坐标

指定平面a x + b y + c z + d w = 0
• 根据顶点(x,y,z,w)到平面的距离生成纹理坐标 • •
31
棋盘纹理
GLubyte image[64][64][3]; // Create a 64 x 64 checkerboard pattern for ( int i = 0; i < 64; i++ ) { for ( int j = 0; j < 64; j++ ) { GLubyte c = (((i & 0x8) == 0) ^ ((j & 0x8) == 0)) * 255; image[i][j][0] = c; image[i][j][1] = c; image[i][j][2] = c;
glTexParameteri(GL_TEXTURE_2D, GL_TEXURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
20
有无mipmap的对比
无mipmap
有mipmap
21
更多例子
GL_NEAREST
GL_LINEAR
22
示例
点采样
线性滤波
mipmapped 后的点取样
14
Wrapping模式

钳位(截断):若s,t>1就取1,若s,t<0就取0 重复:应用s,t模1的值
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_T O_EDGE) glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT)
GL_TEXTURE_2D );
19
GLubyte image0[64][64][3]; GLubyte image1[32][32][3]; … GLubyte image5[1][1][3]; glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 64, 64, GL_RGB, GL_UNSIGNED_BYTE, image0); … glTexImage2D(GL_TEXTURE_2D, 5, GL_RGB, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, image5);
为GL_TEXTURE0

GLboolean glIsTexture(GLuint textureName);
• •

void glBindTexture(GLenum target, GLuint textureName); void glDeleteTextures(GLsizei n, const GLuint *textureNames);


void glActiveTexture(GLenum texture);
28
多重纹理

通常一个几何对象上只有一个纹理 有许多渲染效果需要多次应用纹理
• •
例:已有纹理的表面上有其它物体的阴影 此时需要给阴影加上纹理
glActiveTexture(GL_TEXTURE0); /* unit 0 */ glBindTexture(GL_TEXTURE_2D, object0); glTexParameteri(…); /* how to apply texture 0 */ glActiveTexture(GL_TEXTURE1); /* unit 1 */ glBindTexture(GL_TEXTURE_2D, object1); glTexParameteri(…); /* how to apply texture 1 */
30
顶点着色器

通常顶点着色器输出纹理坐标到光栅化器 必须执行其他标准任务
• 计算顶点坐标 • 必要时计算顶点颜色
in vec4 vPosition; //vertex position in object coordinates in vec4 vColor; //vertex color from application in vec2 vTexCoord; //texture coordinate from application out vec4 color; //output color to be interpolated out vec2 texCoord; //output tex coordinate to be interpolated
t
s
GL_REPEAT
GL_CLAMP
15
纹理的放大和缩小

放大:多个像素对应一个纹素 缩小:多个纹素对应一个像素
纹理 放大
多边形
纹理 缩小
多边形
16
解决方法

点采样:最近纹素的纹理值 线性滤波:最近点邻域(2 x 2)纹素加权平均 的纹理值
17
滤波模式
滤波模式的指定
•glTexParameteri(
相关文档
最新文档