OpenCASCADE Texture Mapping
OpenCASCADE Texture Mapping
Abstract. 纹理贴图技术的出现和流行是图形显示技术的一个非常重要的里程碑,直接影响3D技术从工业进入娱乐领域。本文结合OpenCASCADE中纹理贴图的源码,来说明纹理贴图在OpenCASCADE中实现。
Key Words. OpenCASCADE 纹理贴图, Texture Mapping
1.Introduction
纹理贴图技术的出现和流行是图形显示技术的一个非常重要的里程碑,直接影响了3D技术从工业界进入娱乐领域。在OpenGL中面片的着色方法很有限,只能在顶点设定颜色,每个面片上像素的颜色使用各个顶点颜色的插值。这就导致了显示的图像不真实。可以想象画一个有砖墙,每个砖面都需要用一个多边形表示,砖与砖连接的水泥也要用多边形表示,并且设计者要精心摆放这些多边形,还要为不同的多边形设定各自的颜色。即使工作量如此之大,也不能更加真实地绘制出砖面上的裂纹、凹槽等更加丰富的细节。
Figure 1. Textured Box in OpenCASCADE Viewer
而有了纹理贴图一切就简单了,设计者只需要准备好一小砖面的图片,然后画一个矩形表示墙面,就可以将图片贴到矩形面上。这个砖块的图片文件称为纹理或者纹理图像。因为这个方法核心思想就是把图片和图形对应起来,所以也称为纹理映射(Texture Mapping)。
本文主要介绍OpenCASCADE中纹理映射的实现。理解了其实现原理,就可以理解其优势和局限性,在此基础上便于去扩展,实现一些个性化的功能。
2.Texture Mapping
Texture mapping is a method for defining high frequency detail, surface texture or color information on a computer-generated graphic or 3d mode. Its application to 3d graphics was pioneered by Edwin Catmull in 1974. Texture mapping originally referred to a method that simply wrapped and mapped pixels from a texture to a 3d surface.
A texture map is an image applied(mapped) to the surface of a shape or polygon. This may be a bitmap image or procedural texture.
They may have 1~3 dimensions, although 2 dimensions are most common for visible surfaces.
以上内容来自wikipedia,原文链接:https://en.wikipedia.org/wiki/Texture_mapping
纹理映射的原理就是将二维的图片映射到三维的面上去。这个过程和参数曲面类似,就是一个二元函数,则纹理坐标就与参数曲面的参数u,v的含义一致了。
Figure 2. Applying a 2d texture to a quad
3.OpenCASCADE Texture Mapping
OpenCASCADE中提供类AIS_TexturedShape来实现带纹理的模型,通过构造函数来设置模型,通过函数SetTextureFileName()来指定纹理贴图。当纹理贴图的文件名是个数字时,则使用内置的贴图文件,也就是如下enum定义的标准纹理贴图:
//! Types of standard textures.
enum Graphic3d_NameOfTexture2D
{
Graphic3d_NOT_2D_MATRA,
Graphic3d_NOT_2D_ALIENSKIN,
Graphic3d_NOT_2D_BLUE_ROCK,
Graphic3d_NOT_2D_BLUEWHITE_PAPER,
Graphic3d_NOT_2D_BRUSHED,
Graphic3d_NOT_2D_BUBBLES,
Graphic3d_NOT_2D_BUMP,
Graphic3d_NOT_2D_CAST,
Graphic3d_NOT_2D_CHIPBD,
Graphic3d_NOT_2D_CLOUDS,
Graphic3d_NOT_2D_FLESH,
Graphic3d_NOT_2D_FLOOR,
Graphic3d_NOT_2D_GALVNISD,
Graphic3d_NOT_2D_GRASS,
Graphic3d_NOT_2D_ALUMINUM,
Graphic3d_NOT_2D_ROCK,
Graphic3d_NOT_2D_KNURL,
Graphic3d_NOT_2D_MAPLE,
Graphic3d_NOT_2D_MARBLE,
Graphic3d_NOT_2D_MOTTLED,
Graphic3d_NOT_2D_RAIN,
Graphic3d_NOT_2D_CHESS,
Graphic3d_NOT_2D_UNKNOWN
};
这些enum变量分别对应环境变量CSF_MDTVTexturesDirectory文件夹中的那些以2d开头的rgb文件。如下图所示:
Figure 3. OpenCASCADE Standard Textures
在类AIS_TexturedShape的函数Compute()中通过类StdPrs_ShadedShape来计算纹理坐标UV,相关代码如下:
StdPrs_ShadedShape::Add (thePrs, myshape, myDrawer,
Standard_True,
myIsCustomOrigin ? myUVOrigin : gp_Pnt2d (0.0, 0.0),
myUVRepeat,
myToScale ? myUVScale : gp_Pnt2d (1.0, 1.0));
updateAttributes (thePrs);
在类StdPrs_ShadedShape中有个静态函数fillTriangles()来生成显示数据,其中计算纹理坐标相关的代码列出如下所示:
if (theHasTexels)
{
BRepTools::UVBounds (aFace, aUmin, aUmax, aVmin, aVmax);
dUmax = (aUmax - aUmin);
dVmax = (aVmax - aVmin);
}
const Standard_Integer aDecal = anArray->VertexNumber();
for (Standard_Integer aNodeIter = aNodes.Lower(); aNodeIter <= aNodes.Upper(); ++aNodeIter)
{
aPoint = aNodes (aNodeIter);
const Standard_Integer anId = 3 * (aNodeIter - aNodes.Lower());
gp_Dir aNorm (aNormArr[anId + 0], aNormArr[anId + 1], aNormArr[anId + 2]);
if (aFace.Orientation() == TopAbs_REVERSED)
{
aNorm.Reverse();
}
if (!aLoc.IsIdentity())
{
aPoint.Transform (aTrsf);
aNorm.Transform (aTrsf);
}
if (theHasTexels && aUVNodes.Upper() == aNodes.Upper())
{
const gp_Pnt2d aTexel = gp_Pnt2d ((-theUVOrigin.X() + (theUVRepeat.X() * (aUVNodes (aNodeIter).X() - aUmin)) / dUmax) / theUVScale.X(),
(-theUVOrigin.Y() + (theUVRepeat.Y() * (aUVNodes (aNodeIter).Y() - aVmin)) / dVmax) / theUVScale.Y());
anArray->AddVertex (aPoint, aNorm, aTexel);
}
else
{
anArray->AddVertex (aPoint, aNorm);
}
}
从上述代码中可以看到,OpenCASCADE中计算纹理UV坐标的方法就是对Shape的每个面,取出其几何参数曲面,并将曲面的参数空间单位化后作为纹理坐标。
4.Draw Test Harness
OpenCASCADE在Draw Test Harness中提供了命令vtexture来生成纹理贴图的模型。如本文开始的那个地板贴图的长方体可以用如下命令来实现:
box b 1 2 3
vdisplay b
vtexture b 11
Figure 4. OpenCASCADE Standard Texture
当贴图使用数字时,使用的是opencascade内置的贴图文件。也可以指定自定义的贴图文件,如下所示:
psphere ps 100
vdisplay ps
vtexture ps d:/earth.jpg
其中d:/earth.jpg为D盘的一个贴图文件。
Figure 5. Map world texture to Sphere
5.Conclusion
OpenGL的纹理贴图可以理解为参数曲面的参数空间,即是一个二维UV空间,通过参数UV可以计算出曲面上对应的三维点,即将二维的贴图映射到三维的曲面上去。
OpenCASCADE中纹理贴图使用类AIS_TexturedShape,其对纹理坐标UV的计算使用类StdPrs_ShadedShape,就是将Shape中每个面对应的几何参数曲面的参数空间单位化后作为纹理坐标。
在Draw Test Harness中有命令vtexture来生成纹理贴图。当纹理贴图文件是数字时,会使用OpenCASCADE内置的贴图文件,也可以指定自定义的贴图文件。
在OpenCASCADE的官网论坛上有个关于纹理贴图的问题:
https://www.opencascade.com/comment/20458 将其中KGV的答复摘出如下:
You shape consists of 3 Faces (see attached screenshot from CAD Assistant).
Standard presentation builder StdPrs_ShadedShape (used by AIS_TexturedShape) defines texture mapping UV coordinates from Surface parametric space individually for each Face.
To achieve desired result, either you have to create a single Face instead of 3 Faces in this specific place (I don't know if you are going to texture other shapes and in which way),
or compute UV texture coordinates manually using some alternative mapping logic (like projecting triangle nodes onto plane).
In general case (complex shape definition), you might need creating a mesh Unfolding to be able generating a texture coordinates considering seam edges:
https://www.opencascade.com/content/unfolding-library
There are also visualization-only solutions for generating texture UV coordinates on GPU, depending on what you are trying to achieve
(Graphic3d_Texture2Dplane/Graphic3d_TextureEnv, though these are rarely used due to limited use cases where such mapping makes sense).
其中也提到OpenCASCADE中纹理坐标的生成方式。
其实纹理坐标UV的处理是三维软件的一个功能,像Blender中就专门有UV Editing来编辑UV坐标,以实现个性化的要求。
Figure 7. UV Editing in Blender
6.References
1. https://www.opencascade.com/comment/20458
2. https://www.bilibili.com/video/av18054281?from=search&seid=231681022662274909
3. https://en.wikipedia.org/wiki/World_map
4. OpenGL Programming Guide
5. OpenGL Super Bible
OpenCASCADE Texture Mapping的更多相关文章
- 投影纹理映射(Projective Texture Mapping)
摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人” 投影纹理映射( Projective ...
- OpenGL 4.0 GLSL 实现 投影纹理映射(Projective Texture Mapping) (转)
http://blog.csdn.net/zhuyingqingfen/article/details/19331721 分类: GLSL 投影纹理映射 (projective texture ...
- 投影纹理映射(Projective Texture Mapping) 【转】
摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人” 投影纹理映射( Projective ...
- Method for sub-pixel texture mapping and filtering
BACKGROUND OF THE INVENTION 1. Field of the Invention The present invention relates to a method for ...
- Projective Texture Mapping - 投影纹理
昨天导师让写一个投影纹理,将一个相机渲染的图片的一部分投影到另外一个相机里面,目的是无缝的拼接. 投影纹理就和shadow map一样,都是将片元转换到另外一个相机/光源坐标系下,投影后找到对应的纹素 ...
- Direct3D 11 Tutorial 7:Texture Mapping and Constant Buffers_Direct3D 11 教程7:纹理映射和常量缓冲区
概述 在上一个教程中,我们为项目引入了照明. 现在我们将通过向我们的立方体添加纹理来构建它. 此外,我们将介绍常量缓冲区的概念,并解释如何使用缓冲区通过最小化带宽使用来加速处理. 本教程的目的是修改中 ...
- Texture tiling and swizzling
Texture tiling and swizzling 原帖地址:http://fgiesen.wordpress.com If you’re working with images in your ...
- OpenGL阴影,Shadow Mapping(附源程序)
实验平台:Win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): 本文描述图形学的两个最常用的阴影技术之一,Shadow Mapping方法(另一种是Sh ...
- anisotropy texture filtering
http://www.extremetech.com/computing/51994-the-naked-truth-about-anisotropic-filtering 1. 为什么在纹理采样时需 ...
随机推荐
- JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习
JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中 ...
- Linux的文件系统及其硬盘分区挂载原理
如果您是一位新手,也许 您还不知道如何把文件从Windows拷贝到Linux上吧?下面,我们将说明Unix文件系统以及mount的工作过程,然后再比较详细地讨论. mount的使用和有关选项.如果您已 ...
- 海量数据挖掘MMDS week2: Association Rules关联规则与频繁项集挖掘
http://blog.csdn.net/pipisorry/article/details/48894977 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- 主线程中也不绝对安全的 UI 操作
从最初开始学习 iOS 的时候,我们就被告知 UI 操作一定要放在主线程进行.这是因为 UIKit 的方法不是线程安全的,保证线程安全需要极大的开销.那么问题来了,在主线程中进行 UI 操作一定是安全 ...
- java中log的应用
log的简单应用 备忘 加入jar包commons-logging-1.1.jar log4j.properties 如下(就放在src根目录底下 名字和位置都不要变) #OFF.FATAL.ERRO ...
- 【公开课】【阿里在线技术峰会】何登成:AliSQL性能优化与功能突破的演进之路
MySQL的公开课,可能目前用不上这些,但是往往能在以后想解决方案的时候帮助到我.以下是阿里对公开课的整理 摘要: 本文根据阿里高级数据库专家何登成在首届阿里巴巴在线技术峰会上的分享整理而成.他主要介 ...
- MPEG-7 视觉描述符
本文节选自<基于MPEG-7与内容的图像检索技术的研究>. MPEG-7 标准中视觉描述工具包括基本结构和描述符.本文主要介绍各描述符. (1)颜色描述符 MPEG-7 主要定义了七种颜色 ...
- SQLServer 基础
1当设计表时,对表进行结构性的修改(如将原来可以null的改为不可null),直接改则不允许保存修改,需要选择 工具----选项----designers—表设计器和数据库设计器---阻止保持要求重新 ...
- 升级CentOS5.6_X64 python2.4.3到2.7
本文转自:http://hxl2009.blog.51cto.com/779549/1031310 升级CentOS 5.6 64位版python到2.7.31. 背景CentOS 5.6自带的Pyt ...
- 报表软件公司高价悬赏BUG,100块1个我真是醉了
一直在用帆软的报表软件FineReport来做项目,也一直关注着这个公司的发展. 看到<提BUG,拿奖金>的这个活动,有些疑问和思考. 一般FineReport新版本在正式发布前,都会经过 ...