首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >切线,二法线和其他与阴影相关的东西

切线,二法线和其他与阴影相关的东西
EN

Stack Overflow用户
提问于 2010-11-07 09:35:30
回答 5查看 4K关注 0票数 8

许多映射技术,包括法线凸映射、视差映射等,都需要特殊的每顶点切线空间基(切线、法线、双法/双正态分布)。

这显然意味着我的模型不仅应该导出顶点位置纹理坐标逼近的每一个顶点法线,还应该导出一个切线空间基向量(通常是tangent),因为使用cross(tangent, normal)可以在着色器中直接找到另一个。

请注意,位置,法线,紫外线和切线实际上相互依赖的方式如下(你必须知道其他关于顶点的一切,以准备切线基)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
position -> normal ->  tangents
            uv     ->

现在,在现代3D游戏/渲染引擎中,这类事情是如何处理的?

它们实际上提供了每个顶点的法线__、切线uv坐标,还是可以在运行时计算它们?它们应该是模型数据的一部分,还是应该是只运行时的属性?

我还知道,当使用几何图形着色器使用Direct3D10+时,人们实际上可以在运行时准备法线和切线(显然,因为我们可以访问每个三角形中的顶点)--这值得吗?还是应该总是precomputed__??

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-11-11 10:54:17

我的意见如下:

UV坐标:显然是预先计算出来的。UV展开一个复杂的模型不是一个简单的,算法的任务,通常需要手工放置接缝,以获得最好的效果。另外,如果您的模型带有纹理皮肤,那么UVs需要匹配外观,因此在这种情况下,它们可能不会在运行时进行计算。

Normals:理论上说,您可以在几何着色器中,甚至在加载期间,在CPU上预计算它们。但有一件事:游戏中真正的模型通常不是原始模型,而是多边形计数较低的版本。在游戏中使用的最终模型中,你有较少的顶点,但每个顶点法线从原始的高聚模型(也用于环境遮挡计算等)中计算得更精确。因此,对法线进行预计算也是可行的。

此外,在许多游戏中,纹理与每纹理法线映射(通常在切线空间,AFAIK)与颜色纹理一起为每个模型提供,以便稍后在像素着色器中并行映射。

因此,我的建议似乎很明确--采用预先计算的数据,有更好的细节并节省着色器处理或加载时间--除非您需要担心模型大小(即GPU内存限制)--只有在几何图形着色器中计算法线才能节省一些空间。

票数 6
EN

Stack Overflow用户

发布于 2010-11-14 01:37:48

通常,您需要尽可能多地预计算。大多数引擎将有一个自定义的书面工具,可以接收来自3D软件的原始数据,并将其按摩为运行时的格式(添加切线和双值,等等)。然而..。

在某些情况下,每个顶点内存开销可能是一个特定的性能问题。这是因为与移动系统的数据相关的开销--它是“隐藏的”,因为它不是添加到着色器中的指令的显式,所以它更高级一些。

在这些情况下,双元可能不是预先计算的,而是在运行时构造的(以减小内存中顶点的大小)。Bitangents适用于此,因为它们可以由normal切线方向性标志构建--这些都是单个顶点的属性。

Normals、一些UV映射和其他东西需要了解网格的“拓扑”--而且这种拓扑通常不存在于运行时数据中。他们也需要艺术家额外的标记,比如锋利的边缘和纹理缝,等等。因此,法线UVs和第一个切线几乎总是对所有非常特殊的几何类型进行预先计算。

请记住,在Max、Maya或Blender中模型的表示与运行时版本非常不同。

编辑软件

三角形和四边形的

  • 汤,邻居
  • 标记为锐利/柔软的
  • ,一个顶点可以有多个法线和多个UV和弦

运行时(用于DirectX、OpenGL等)

texture)

  • sometimes
  • 缓存友好的三角条和三角扇子的
  • 边缘是隐式的,没有额外的信息绑定到它们,每个顶点只有一个位置,一个法线和一个UV码(每个

存在于多个细节级的中)。

一般来说,你会丢失很多无法重建的信息。你的艺术家将是最幸福的,如果你做了尽可能多的原始马克斯/玛雅版本的几何。

票数 3
EN

Stack Overflow用户

发布于 2010-11-09 09:52:15

您也可以使用ID3DXMesh在D3D9中完成这一任务。您应该始终提前计算它们,因为在运行时再次计算它们是很浪费的。然而,对于每个网格,您只需要计算它们一次,所以除非您的程序在过程中生成网格,否则它很可能不是在何时何地完成的问题。

这里唯一重要的是在CPU上,而不是在GPU上计算它们,因为你一次又一次地在GPU上做每一个帧,这与CPU上的一次相比是完全浪费的。据我所知,所有3D渲染系统只计算一次法线和CPU上的法线,将其保存到文件中,然后加载它并将其发送到GPU进行工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4118847

复制
相关文章
Unity通用渲染管线(URP)系列(八)——复杂的贴图(Masks, Details, and Normals)
这是有关创建自定义可编程渲染管道的系列教程的第八部分。通过增加对遮罩,细节和法线贴图的支持,可以创建复杂的表面。
放牛的星星
2020/12/24
4.5K0
一些与WordPress相关的东西
其实和blog相关的应用还是蛮多的,比如wp官方的app,有android和ios版本的,上面左边是android的,右边是ios的。其实很多应用对于不同的平台显示的效果确实存在不小的差异,比如那个淘宝的客户端。在安卓系统上有个聚划算,还有什么乱七八糟的东西,但是在ios上却什么都没有,由此看见用iphone的都是有钱人,上面都是什么奢侈品之类的。
obaby
2023/02/23
3250
基础渲染系列(六)——凹凸
(温馨提示:本系列知识是循序渐进的,推荐第一次阅读的同学从第一章看起,链接在文章底部)
放牛的星星
2020/07/10
3.8K0
基础渲染系列(六)——凹凸
基础渲染系列(二十)——视差(基础篇完结)
这是有关渲染的系列教程的第20部分。上一部分介绍了GPU实例化。在这一部分中,我们将添加到目前为止尚不支持的标准着色器的最后一部分,即视差贴图。
放牛的星星
2020/07/10
3.3K0
基础渲染系列(二十)——视差(基础篇完结)
Unity Mesh基础系列(一)生成网格(程序生成)
本教程假设你已经熟悉Unity Scripting的基本知识了。如果不清楚的可以看 时钟 的章节学习Unity的基础知识。而 构建分形 的章节里也提供了协程的基本介绍。
放牛的星星
2020/08/21
10.5K0
Unity Mesh基础系列(一)生成网格(程序生成)
Shader经验分享
流水线 1.应用阶段:(CPU)输出渲染图元,粗粒度剔除等 比如完全不在相机范围内的需要剔除,文件系统的粒子系统实现就用到粗粒度剔除。 2.几何阶段:(GPU)把顶点坐标转换到屏幕空间,包含了模型空间 到世界空间 到观察空间(相机视角view) 到齐次裁剪空间(投影project2维空间,四维矩阵,通过-w<x<w判断是否在裁剪空间) 到归一化设备坐标NDC(四维矩阵通过齐次除法,齐次坐标的w除以xyz实现归一化) 到屏幕空间(通过屏幕宽高和归一化坐标计算)。 a.顶点着色器:坐标变换和逐顶点光照,将顶点空间转换到齐次裁剪空间。 b.曲面细分着色器:可选 c.几何着色器:可选 d.裁剪:通过齐次裁剪坐标的-w<x<w判断不在视野范围内的部分或者全部裁剪,归一化。 e.屏幕映射:把NDC坐标转换为屏幕坐标 3.光栅化阶段:(GPU)把几何阶段传来的数据来产生屏幕上的像素,计算每个图元覆盖了哪些像素,计算他们的颜色、 a.三角形设置:计算网格的三角形表达式 b.三角形遍历:检查每个像素是否被网格覆盖,被覆盖就生成一个片元。 c.片元着色器:对片元进行渲染操作 d.逐片元操作:模板测试,深度测试 混合等 e.屏幕图像 ------------------------------------------------------- 矩阵: M*A=A*M的转置(M是矩阵,A是向量,该公式不适合矩阵与矩阵) 坐标转换: o.pos = mul(UNITY_MATRIX_MVP, v.vertex);顶点位置模型空间到齐次空间 o.worldNormal = mul((float3x3)_Object2World,v.normal);//游戏中正常的法向量转换,转换后法向量可能不与原切线垂直,但是不影响游戏显示,而且大部分显示也是差不多的。一般用这个就行了。 o.worldNormal = mul(v.normal, (float3x3)_World2Object);顶点法向量从模型空间转换到世界空间的精确算法,公式是用_Object2World该矩阵的逆转置矩阵去转换法线。然后通过换算得到该行。 ------------------------------------------------------- API: UNITY_MATRIX_MVP 将顶点方向矢量从模型空间变换到裁剪空间 UNITY_MATRIX_MV 将顶点方向矢量从模型空间变换到观察空间 UNITY_MATRIX_V 将顶点方向矢量从世界空间变换到观察空间 UNITY_MATRIX_P 将顶点方向矢量从观察空间变换到裁剪空间 UNITY_MATRIX_VP 将顶点方向矢量从世界空间变换到裁剪空间 UNITY_MATRIX_T_MV UNITY_MATRIX_MV的转置矩阵 UNITY_MATRIX_IT_MV UNITY_MATRIX_MV的逆转置矩阵,用于将法线从模型空间转换到观察空间 _Object2World将顶点方向矢量从模型空间变换到世界空间,矩阵。 _World2Object将顶点方向矢量从世界空间变换到模型空间,矩阵。 模型空间到世界空间的矩阵简称M矩阵,世界空间到View空间的矩阵简称V矩阵,View到Project空间的矩阵简称P矩阵。 --------------------------------------------- _WorldSpaceCameraPos该摄像机在世界空间中的坐标 _ProjectionParams _ScreenParams _ZBufferParams unity_OrthoParams unity_Cameraprojection unity_CameraInvProjection unity_CameraWorldClipPlanes[6]摄像机在世界坐标下的6个裁剪面,分别是左右上下近远、 ---------------------------- 1.表面着色器 void surf (Input IN, inout SurfaceOutput o) {}表面着色器,unity特殊封装的着色器 Input IN:可以引用外部定义输入参数 inout SurfaceOutput o:输出参数 struct SurfaceOutput//普通光照 { half3 Albedo;//纹理,反射率,是漫反射的颜色值 half3 Normal;//法线坐标 half3 Emission;//自发光颜色 half Specular;//高光,镜面反射系数 half Gloss;//光泽度 half Alpha;//alpha通道 } 基于物理的光照模型:金属工作流Surfa
bering
2019/12/03
2.1K0
谈谈StatusBar相关的东西
2、有导航栏的情况 如果我们使用了导航控制器 UINavigationController, 且它的 navigationBar 没有被隐藏,那么会发现即使重写 preferredStatusBarStyle 方法,这个方法也不会被调用。因为此时状态栏的样式是根据导航栏的样式来自动变换的。
Dwyane
2021/11/24
5440
进阶渲染系列(七)——三向贴图(任意表面纹理化)【进阶篇完结】
执行纹理映射的通常方法是使用网格中每个顶点存储的UV坐标。但这不是唯一的方法。有时,没有可用的UV坐标。例如,当使用任意形状的过程几何时。在运行时创建地形或洞穴系统时,通常无法为适当的纹理展开生成UV坐标。在这些情况下,我们必须使用另一种方式将纹理映射到我们的表面上。其中一种方法是三向贴图。
放牛的星星
2020/07/13
2.5K0
法线贴图
在游戏中经常会有这样的情况,就是一个平面——这个平面在现实中并不是一 个“平”面,例如砖墙的表面带有石质浮雕等等。
李小白是一只喵
2021/06/17
1.7K0
法线贴图
文本阴影和边框阴影
    box-shadow:left top 模糊距离 阴影尺寸 阴影颜色 inset(内阴影);
十月梦想
2018/08/29
9760
Unity通用渲染管线(URP)系列(十)——点光和聚光灯阴影(Perspective Shadows)
这是有关创建定制脚本渲染管道的系列教程的第十部分。它增加了对点光源和聚光灯的实时阴影的支持。
放牛的星星
2021/01/11
3.9K0
Unity通用渲染管线(URP)系列(十)——点光和聚光灯阴影(Perspective Shadows)
【笔记】《计算机图形学》(11)——纹理映射
这系列的笔记来自著名的图形学虎书《Fundamentals of Computer Graphics》,这里我为了保证与最新的技术接轨看的是英文第五版,而没有选择第二版的中文翻译版本。不过在记笔记时多少也会参考一下中文版本
ZifengHuang
2020/12/08
4.4K0
什么是导数和切线?以及他们的关系?
(引自高等数学)设函数y=f(x)在点x0的某个邻域内有定义,当自变量x在x0处有增量Δx,相应地函数取得增量Δy=f(x0+Δx)-f(x0);如果Δy与Δx之比当Δx→0时极限存在,则称函数y=f(x)在点x0处可导,并称这个极限为函数y=f(x)在点x0处的导数。马克-to-win @ 马克java社区: 所以说:函数y=f(x)在x0点的导数f'(x0)的几何意义:表示函数曲线在点P0(x0,f(x0))处的切线的斜率(导数的几何意义是该函数曲线在这一点上的切线斜率)。
马克java社区
2021/06/22
7490
HTTP相关的一些东西
本文作者:IMWeb 存勖闲 原文出处:IMWeb社区 未经同意,禁止转载 这几天一直在看关于HTTP和前端性能优化相关的内容,今天先写一篇关于HTTP的文章,如果时间允许的话再接着把前端性能优
IMWeb前端团队
2019/12/03
3500
HTTP相关的一些东西
Unity 通用透明物体漫反射Shader
对于至今为止Shader学习内容的一个总结,算是一个比较综合通用的shader了,因为是漫反射所以暂时没有计算高光部分,之后再出一个带高光版本的。
汐夜koshio
2020/03/19
8310
Unity Shader常用函数,标签,指令,宏总结(持续更新)
UnityObjectToClipPos(v.vertex); 最基本的顶点变换,模型空间 ==》裁剪空间 mul(unity_ObjectToWorld, v.vertex); 顶点:模型空间 ==》世界空间,多用于顶点着色器 UnityObjectToWorldNormal(v.normal); 法线:模型空间 ==》世界空间,多用于顶点着色器,float3(归一化后fixed3) UnityWorldSpaceLightDir(i.worldPos.xyz); 仅前向渲染,世界空间顶点位置 ==》世界空间光源方向,多用于片元着色器,一般会顺带归一化(fixed3) UnityWorldSpaceViewDir(i.worldPos.xyz); 世界空间顶点位置 ==》世界空间视线方向,多用于片元着色器,一般会顺带归一化(fixed3) P.S.一般[0,1]范围内的尽量用低精度fixed类型,如单位矢量,颜色等 Tags{"lightmode"="forwardbase"}(字符串不区分大小写,编译时会自动转为所有字母大写) 指示光照模型为前向渲染的基本模式 #include "UnityCG.cginc"(字符串不区分大小写,编译时会自动转为所有字母大写) 包含大量基本内置函数,宏等,一般自带 #include "lighting.cginc"(字符串不区分大小写,编译时会自动转为所有字母大写) 包含基本光照属性,如 _LightColor0 UNITY_LIGHTMODEL_AMBIENT(使用大写) 环境光,一般取前三个分量rgb(xyz);基本光照模型需要有环境光,漫反射,高光等 基本纹理&法线贴图: TRANSFORM_TEX(v.uv, _MainTex); 基本纹理变换,用于顶点着色器,相当于v.uv*_MainTex_ST.xy + _MainTex_ST.zw;(其中xy存缩放,zw存偏移,对应面板参数);_MainTex_ST需额外定义 tex2D(_MainTex, i.uv); 基本纹理采样,用于片元着色器;一般会定义染色属性并与之相乘得到反射率(albedo),反射率作为环境光和漫反射计算的因子 UnpackNormalWithScale(packedNormal, _BumpScale); 反映射法线贴图采样结果得到顶点空间中的法线方向,同时计算凹凸映射的缩放;packedNormal为法线贴图直接采样结果,_BumpScale为凹凸缩放值;法线贴图必须进行导入设置为Normal Map UnityObjectToWorldDir(v.tangent.xyz); 方向(切线):模型空间 ==》世界空间,多用于顶点着色器 cross(worldNormal, worldTangent)*v.tangent.w 计算副法线,cross(,)两个向量叉积,用于得知两个坐标轴求第三个坐标轴朝向,w控制朝向的正负;知道三个朝向就可以构造变换矩阵了 TANGENT_SPACE_ROTATION 得到从模型空间到顶点空间的变换矩阵rotation,随后可直接进行如下计算,例如: mul(rotation, ObjSpaceLightDir(v.vertex)); 模型空间顶点位置 ==》模型空间光源方向==》顶点空间光源方向 mul(rotation, ObjSpaceViewDir(v.vertex)); 模型空间顶点位置 ==》模型空间视线方向==》顶点空间视线方向 多光源&前向渲染&光照衰减: Tags{"lightmode"="forwardbase"}(第一个Pass,全局性通用计算,只计算一次,不用开启混合) Tags{"lightmode"="forwardadd"}(第二个Pass,根据光源数目不同可能多次计算,需开启混合) 前向渲染的两种标签,分别位于不同的两个Pass,指示每个Pass的光照模式 #pragma multi_compile_fwdbase #pragma multi_compile_fwdadd 前向渲染的两种指令,只有每个Pass配置正确指令才可能得到正确的光照变量,如光照衰减值 UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos.xyz); 用于第二个Pass分别计算每个光源的衰减,atten为输出的衰减值,i为片元着色器的输入结构体,其内部数学运算根据各个光照的类型不同复杂度不一,具体可参考:https://github.com/candycat1992/Unity_Shaders_Book/issues/47 接收投影: SHADOW_COORDS(idx) 声明阴影纹理采样的坐标,用于顶点着色器输出结构体,idx为下一个可用插值寄存器(TEXCOORD)的索引值 TRANSFER_SHADOW(o); 用于在顶点着色器
汐夜koshio
2020/03/19
2K0
基础渲染系列(十)——更复杂的复合材质
这是关于渲染的系列教程的第十部分。上一次,我们使用了多个纹理来创建复杂的材质。这次我们再增加一些复杂度,并且还支持多材质编辑。
放牛的星星
2020/07/10
2.4K0
【GAMES101-现代计算机图形学课程笔记】Lecture 10 Geometry 1 (介绍)
如下图示,通常一个光滑的表面(比如水晶球)会反射环境光,因此我们可以看到球面上会被映射出其他物体。那么计算机中如何表示这个呢?
marsggbo
2020/06/11
9190
《Unity Shader入门精要》笔记:初级篇(3)
本篇博客主要为个人学习所编写读书笔记,不用于任何商业用途,以及不允许任何人以任何形式进行转载。 本篇博客会补充一些扩展内容(例如其他博客链接)。 本篇博客还会提供一些边读边做的效果截图。文章内所有数学公式都由Latex在线编辑器生成。 本篇博客主要提供一个“glance”,知识点的总结。如有需要请到书店购买正版。 博客提及所有官方文档基于2022.2版本,博客会更新一些书中的旧的知识点到2022.2版本。 如有不对之处欢迎指正。 我创建了一个游戏制作交流群:637959304 进群密码:(CSGO的拆包密
[Sugar]
2022/09/21
6350
点击加载更多

相似问题

法线映射与切线向量

11

椭圆的法线与切线方程

18

具有法线映射的双法线和切线

14

顶点的二法线是它的法线和切线之间的交叉点吗?

50

Three.js法线地图阴影计算照明在切线空间?

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文