1.什么是UV?  

对于三维模型,有两个最重要的坐标系统,一是顶点的位置(X,Y,Z)坐标,另一个就是UV坐标。什么是UV?简单的说,就是贴图影射到模型表面的依据。 完整的说,其实应该是UVW(因为XYZ已经用过了,所以另选三个字母表示)。U和V分别是图片在显示器水平、垂直方向上的坐标,取值一般都是0~1,也 就是(水平方向的第U个像素/图片宽度,垂直方向的第V个像素/图片高度)。那W呢?贴图是二维的,何来三个坐标?嗯嗯,W的方向垂直于显示器表面,一般 用于程序贴图或者某些3D贴图技术(记住,确实有三维贴图这种概念!),对于游戏而言不常用到,所以一般我们就简称UV了。

所有的图象文件都是二维的一个平面。水平方向是U,垂直方向是V,通过这个平面的,二维的UV坐标系。我们可以定位图象上的任意一个象素。但是一个问题是如何把这个二维的平面贴到三维的NURBS表面和多边形表面呢? 对于NURBS表面。由于他本身具有UV参数,尽管这个UV值是用来定位表面上的点的参数,但由于它也是二维的,所以很容易通过换算把表面上的点和平面图象上的象素对应起来。所以把图象贴带NURBS是很直接的一件事。但是对于多变形模型来讲,贴图就变成一件麻烦的事了。所以多边形为了贴图就额外引进了一个UV坐标,以便把多边形的顶点和图象文件上的象素对应起来,这样才能在多边形表面上定位纹理贴图。所以说多边形的顶点除了具有三维的空间坐标外。还具有二维的UV坐标。

UV" 这里是指u,v纹理贴图坐标的简称(它和空间模型的X, Y, Z轴是类似的). 它定义了图片上每个点的位置的信息. 这些点与3D模型是相互联系的, 以决定表面纹理贴图的位置. UV就是将图像上每一个点精确对应到模型物体的表面. 在点与点之间的间隙位置由软件进行图像光滑插值处理. 这就是所谓的UV贴图.  
那为什么用UV坐标而不是标准的投影坐标呢? 通常给物体纹理贴图最标准的方法就是以planar(平面),cylindrical(圆柱), spherical(球形),cubic(方盒)坐标方式投影贴图.  
Planar projection(平面投影方式)是将图像沿x,y或z轴直接投影到物体. 这种方法使用于纸张, 布告, 书的封面等 - 也就是表面平整的物体.平面投影的缺点是如果表面不平整, 或者物体边缘弯曲, 就会产生如图A的不理想接缝和变形. 避免这种情况需要创建带有alpha通道的图像, 来掩盖临近的平面投影接缝, 而这会是非常烦琐的工作. 所以不要对有较大厚度的物体和不平整的表面运用平面投影方式. 对于立方体可以在x, y方向分别进行平面投影, 但是要注意边缘接缝的融合. 或者采用无缝连续的纹理, 并使用cubic投影方式. 多数软件有图片自动缩放功能, 使图像与表面吻合. 显然, 如果你的图像与表面形状不同, 自动缩放就会改变图像的比例以吻合表面. 这通常会产生不理想的效果, 所以制作贴图前先测量你的物体尺寸.

2、uv纹理坐标设定与贴图规则  

当opengl对一个四方形进行贴图时,会定义纹理贴图坐标,一串数组,相信初学openggl es者看到后会很头疼,不知道写得是什么东西。现在就将我的研究成果与大家分享下!

当纹理映射启动后绘图时,你必须为OpenGL ES提供其他数据,即顶点数组中各顶点的纹理坐标。纹理坐标定义了图像的哪一部分将被映射到多边形。它的工作方式有点奇怪。

下面看下在android平台下Opengl纹理系统坐标,左下角为原点。

我们现在讨论怎样使用这些纹理坐标。当我们指定顶点数组中的顶点时,我们需要在另一个数组中提供纹理坐标,它称为纹理坐标数组。这里需要注意定义坐标数组顺序,这很关键。

float texCoords[] = new float[] {
        // FRONT
        0.0f, 0.0f,
        1.0f, 0.0f,
        0.0f, 1.0f,
        1.0f, 1.0f,
  };

效果如下:

如果我们想截取图片有上角不分做纹理,按照上面方法可获的数组

float texCoords[] = new float[] {
   // FRONT
           0.5f, 0.5f,
          1f, 0.5f,
          0.5f, 1f,
          1f, 1f
  };

效果如下:

我们看下贴图的原始文件

你会发现截屏中的图片y轴是颠倒的,其实这是android图像坐标系统与Opengl es 坐标系统不一致导致的。最简单的修正办法将原始图片用工具翻转过来,这样会比用程序翻转节省很多性能,资源是宝贵的。

三角形纹理映射,只要按照我们的映射规则,便可以顺利完成映射。

float texCoords[] = new float[] {   
     0.0f, 0.0f,
     1.0f, 0.0f,
     0.5f, 1.0f,
};

效果:

看到这里应该知道纹理坐标数组规则定义的意义了吧。

平铺与箔拉

我们的纹理坐标系统在两个轴上都是从0.0 到 1.0,如果设置超出此范围的值会怎么样?根据视图的设置方式有两种选择。

平铺(也叫重复)
一种选择是平铺纹理。按OpenGL的术语,也叫“重复”。如果我们将第一个纹理坐标数组的所有1.0改为2.0:
    static const GLfloat texCoords[] = {
        0.0, 2.0,
        2.0, 2.0,
        0.0, 0.0,
        2.0, 0.0
    };

我们可以通过glTexParameteri()函数设置。

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);

箝位
另一种可能的选择是让OpenGL ES简单地将超过1.0的值限制为1.0,任何低于0.0的值限制为 0.0。这实际会引起边沿像素重复。

我们可以通过glTexParameteri()函数设置。

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

uv纹理坐标设定与贴图规则相关推荐

  1. C++模拟OpenGL库——图片处理及纹理系统(四):UV纹理坐标

    目录 引入UV纹理坐标及三角形绘制设置 纹理过滤 引入UV纹理坐标及三角形绘制设置 上图其实不是很直观. UV坐标要解决的问题就是: 假设我有一张500×500的纹理图片: 我要把它映射到一张200× ...

  2. CR渲染器全景图如何渲染颜色通道_C4D中,什么是UV纹理以及如何展UV

    前言 之前有一篇文章整体介绍了C4D中如何给一个模型添加纹理贴图的几种方式,在应对简单的模型上,我们可以根据需要选择合适的投射方式达到我们想要的效果. 而对于比较复杂的模型,默认的投射方式往往都达不到 ...

  3. 如何在Unity实现从纹理中生成法线贴图?

    本文主要讲解从纹理中生成法线贴图的基本方法,并在 Unity 中进行实现和测试. 预备知识 法线贴图和基本的图形学知识,基本的向量和极限的知识. 高度图或灰度图 一张二维纹理有两个维度 u 和 v,但 ...

  4. iOS OpenGL 纹理坐标详解

    //顶点着色器 //v.shader//顶点着色器是一个可编程的处理单元,执行顶点变换.纹理坐标变换.光照.材质等顶点的相关操作,每顶点执行一次.替代了传统渲染管线中顶点变换.光照以及纹理坐标的处理, ...

  5. 【OpenGL从入门到精通(六)】纹理对象与纹理坐标

    1.在OpenGL想要显示一张图片,需要先绘制一个自定义的几何体. 2.把图片加载到纹理对象中= 3.当进行纹理贴图时候,使用纹理坐标来设置纹理对象. 2.

  6. 3D游戏建模入门初级教学:制作纹理逼真的法线贴图

    下图是一只恐龙的低模布线,细心的朋友估计会看到恐龙头部的布线密度是要远远高于身体和四肢的,这种布线的好处就是可以在你需要着重刻画的部位经过细分后生成的模型面数会远远高于那些次要部分,会使你的细节刻画更 ...

  7. OpenGL中纹理坐标和顶点坐标表示

    纹理坐标:(s,t,r,q),注意纹理分为1维,2维,3维,在纹理贴图的时候,如果顶点发生变化,相应的纹理坐标会发生相应的变化. 顶点坐标:(x,y,z,w),注意变换方式以及相应的利用.OpenGL ...

  8. 使用blender做一个地球模型,贴上UV纹理,导出Obj格式

    使用blender做一个地球模型,贴上UV纹理,导出Obj格式 Table of Contents 1 blender 1.1 图文教程 1.2 export to objloader, coordi ...

  9. D3D12渲染技术之纹理坐标

    Direct3D使用纹理坐标系,该坐标系包含一个水平延伸到图像的u轴和一个垂直于图像运行的v轴. 坐标(u,v)使得0≤u,v≤1,纹理上称为纹理像素的元素. 请注意,v轴在"向下" ...

  10. android 纹理坐标原点,OpenGL顶点坐标与纹理坐标

    引言 这里先给自己打个广告,前些天闲来无事,在GitHub Pages上搭建了个博客,基于Jekyll模板搭建的,参考了码志作者的博客模板,在此表示感谢.同时欢迎大家来我的博客捧场. 顶点坐标系 这里 ...

最新文章

  1. Quartus和Modelsim中使用`include包含头文件的对比
  2. 如何查看服务器一个端口的占用情况(netstat -an)
  3. MAC安装mysql8.0.11以及修改root密码
  4. 性能测试(06)-逻辑控制器
  5. sqlserver 2008 多表更新
  6. 【转】代码里的命名规则:错误的和正确的对比
  7. linux配置mysql数据库_Linux下配置mysql数据库
  8. 分组背包(信息学奥赛一本通-T1272)
  9. 阿里开源大规模分布式图学习框架:专为Graph嵌入,无缝对接TF/PyTorch
  10. linux vi 编辑器用法
  11. centos安装mysql5.6系统崩溃_CentOS中安装MySQL5.6报错的解决方法
  12. 常用 API 函数(7): 位图、图标和光栅运算函数
  13. Inno Setup入门(三)——指定压缩方式
  14. MacOS Big Sur 11.5.2 (20G95) OC 0.7.2 / Cl 5138 / PE 三分区原版黑苹果镜像
  15. Windows 利用DbgView 查看内核打印日志
  16. GoComb.com搜索引擎问世:改进搜索体验
  17. 高精度低功耗RC振荡器设计
  18. 安卓版微信自带浏览器和IE6浏览器ajax请求abort错误处理
  19. 时间与时间戳之间的转换
  20. 用于fast scnn的cityscape数据集制作

热门文章

  1. 东方财富股吧评论爬虫和情绪分析
  2. Android 打开应用商店评分
  3. 关闭计算机休眠文件,电脑垃圾清理关闭休眠文件夹hiberfil.sys
  4. java中的match函数_js 正则表达式中的match函数
  5. xinput1_3.dll丢失怎么修复win10_有什么好的修复方法推荐?
  6. C语言中整型变量四舍五入,怎样将整型变量按四舍五入转换成整数
  7. sourcetree添加gitignore不生效解决方案
  8. CWDM SFP彩光模块知识百科
  9. destoon标签大集合
  10. 企业支付宝转账到银行卡开发导引