首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

法线贴图覆盖DirectX 11中的平滑边

法线贴图(Normal Mapping)是一种在计算机图形学中用于增强模型细节的技术,它通过在纹理中存储法线向量而不是颜色信息,使得在渲染时能够模拟出更复杂的光照效果,而无需增加模型的实际几何复杂度。

基础概念

  • 法线贴图:一种纹理,其中存储了表面每个点的法线向量信息。
  • DirectX 11:微软开发的一套应用程序接口(API),用于在其Windows平台上渲染2D和3D图形。
  • 平滑边:指的是模型边缘处的平滑过渡效果,通常通过高斯模糊或其他平滑技术实现。

相关优势

  • 提高细节:法线贴图可以在不增加多边形数量的情况下,增加模型的细节。
  • 性能优化:相比于增加模型的几何复杂度,使用法线贴图可以显著减少渲染所需的计算资源。
  • 真实感增强:通过模拟光线在不同表面上的反射,法线贴图能够增强场景的真实感。

类型

  • 漫反射贴图(Diffuse Map):存储颜色信息。
  • 法线贴图(Normal Map):存储法线向量信息。
  • 高光贴图(Specular Map):控制模型的高光反射效果。

应用场景

  • 游戏开发:用于增强角色、环境等模型的视觉效果。
  • 虚拟现实:提高虚拟环境的真实感。
  • 电影特效:在电影制作中用于创建复杂的视觉效果。

问题与解决

在DirectX 11中,如果遇到法线贴图无法正确覆盖平滑边的问题,可能是由于以下几个原因:

  1. 贴图坐标问题:确保模型的UV坐标正确无误,否则法线贴图可能无法正确映射到模型表面。
  2. 贴图过滤:检查纹理过滤设置,确保使用了正确的过滤模式(如双线性或三线性过滤)。
  3. 光照计算:确保光照计算正确考虑了法线贴图中的法线向量。

示例代码

以下是一个简单的DirectX 11着色器示例,展示如何使用法线贴图:

代码语言:txt
复制
Texture2D g_DiffuseMap : register(t0);
Texture2D g_NormalMap : register(t1);
SamplerState gsamPointClamp : register(s0);

struct PS_INPUT
{
    float3 Pos : SV_POSITION;
    float2 Tex : TEXCOORD0;
    float3 TangentLightPos : TEXCOORD1;
    float3 TangentViewPos : TEXCOORD2;
    float3 TangentFragPos : TEXCOORD3;
};

float4 PSMain(PS_INPUT Input) : SV_TARGET
{
    float3 normal = normalize(g_NormalMap.Sample(gsamPointClamp, Input.Tex).rgb * 2.0 - 1.0);
    float3 lightDir = normalize(Input.TangentLightPos - Input.TangentFragPos);
    float diff = max(dot(lightDir, normal), 0.0);

    float3 diffuse = diff * g_DiffuseMap.Sample(gsamPointClamp, Input.Tex).rgb;

    return float4(diffuse, 1.0);
}

参考链接

通过以上信息,你应该能够理解法线贴图在DirectX 11中的应用,以及如何解决常见的平滑边覆盖问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【GAMES101-现代计算机图形学课程笔记】Lecture 10 Geometry 1 (介绍)

1.2 凹凸贴图法线贴图) 我们可以看到下图橘子会有坑坑洼洼感觉,那这种效果如何实现呢?...前面我们有介绍过法线方向改变会导致光亮度等变换,这样就等同于像素之间有了明暗变化,所以就有了凹凸感。 上面提到法线贴图方法并不需要改变任何几何信息,即不需要增加二维平面划分成更多三角形。...位移贴图法线贴图使用纹理是一样,只不过位移贴图不再变换法线方向,而是真实地对每个三角形顶点做一定位移。上图中可以看出两种方法区别(虽然右边看起来有点恶心。。)...所以一种权衡方式就是将二者结合起来,即首先用法线贴图构建出一个比较粗糙效果,然后基于这个粗糙结果,将每个三角形划分更加小。这个在windowsDirectX库中有提供。...比如它整体看起来是个六形,然后我们细看每条又是一个六形。其他例子如下图示: 2.2 Explicit representations of geometry 另外一种表示方式则是显式表示。

90630
  • 【GAMES101-现代计算机图形学课程笔记】Lecture 10 Geometry 1 (介绍)

    image.png 1.2 凹凸贴图法线贴图) 我们可以看到下图橘子会有坑坑洼洼感觉,那这种效果如何实现呢?...我们可以看到原来P点法向经过扰动后发生了改变,这样就可以实现法线贴图。那么扰动后法向如何计算呢?...image.png 位移贴图法线贴图使用纹理是一样,只不过位移贴图不再变换法线方向,而是真实地对每个三角形顶点做一定位移。上图中可以看出两种方法区别(虽然右边看起来有点恶心。。)...所以一种权衡方式就是将二者结合起来,即首先用法线贴图构建出一个比较粗糙效果,然后基于这个粗糙结果,将每个三角形划分更加小。这个在windowsDirectX库中有提供。...比如它整体看起来是个六形,然后我们细看每条又是一个六形。

    1.4K40

    基础渲染系列(八)——反射

    (黑色和红色间接镜面颜色,平滑度0.5) 球体呈现红色。这时,红色表示反射率。因此,我们球体从其中心向我们反射了一些环境光。显然,它反射更多。...让我们从仅使用法线向量作为采样方向开始。 ? ? (环境采样) 天空盒出现了,但是太亮了。这是因为立方体贴图包含HDR(高动态范围)颜色,这使其可以包含大于1亮度值。...2.2 凹凸镜 除了使用平滑度表示较粗糙镜像外,你当然还可以使用法线贴图添加较大变形。当我们使用失真的法线来确定反射方向时,这是可行。 ? ? ?...然后创建一个四形并对其进行定位,使其覆盖建筑物内部并接触支柱中点。将其变成镜子并观察反射。 ? (不正确地面反射) 反射根本不匹配!方向看起来正确,但是比例和位置错误。...调整盒子,使其覆盖建筑物内部,覆盖支柱并一直到达最高点。我将其设置得比它大一点,以防止由于场景视图中gizmosZ角冲突而导致闪烁。 ? ?

    3.9K30

    UE4地编基础-材质蓝图篇

    为什么要这样做呢:贴图也是有LOD,场景远处物件贴图会以低分辨率显示,降低硬件损耗。看下图Mip数量(贴图LOD)。 查看贴图相关信息: 打开贴图细节面板:双击贴图打开。...天空盒贴图 为了保留天空盒清晰度,需要把Mip关闭。 2、颜色贴图 不带Alpha颜色贴图必须是8位数RGB颜色贴图。 带Alpha贴图是32位数RGB颜色贴图。...4、材质属性贴图 包括Metallic(金属度)、Roughness(粗糙度)贴图 灰度贴图必须关闭GRB选项。 5、法线贴图 UE4支持Directx法线贴图。...OpenGL法线贴图需要反转法线绿色通道(G通道)。 法线贴图必须关闭GRB选项。...AppendVector(追加矢量) 二、贴图效果调节(蓝图) 1、法线贴图强度调节 2、AO贴图强度调节 3、贴图亮度调节 4、去饱和度(Desaturation) 上图来自官方文档 三、各种材质制作

    2K32

    进阶渲染系列(七)——三向贴图(任意表面纹理化)【进阶篇完结】

    但我们不能只使用最好那个,因为它们会在最好地方突然变化,产生接缝。不过,可以将它们平滑混合。 首选贴图自然是最能与表面方向对齐贴图,该贴图由表面法线表示。...例如,对于我们电路材质,还具有金属贴图,遮挡贴图平滑度和法线贴图。让我们也支持这些。 ? (仅使用电路反照率图) 3.1 MOS 贴图 使用三向贴图时,我们使用三个不同投影对贴图进行采样。...我们已经为电路材质创建了这样贴图,在R通道中存储金属,在G中存储遮挡,在A中存储平滑度。因此,这就是“金属-遮挡-平滑度”贴图或MOS贴图。...这还不是特别明显,因为我们正在根据实际表面法线平滑地在这些法线之间进行混合,但是当我们调整混合时,情况会变得更糟。 通常,我们将依赖于切线到世界转换矩阵来使法线适合几何图形表面。...如果是这样,请添加代码以使用顶部贴图样本覆盖Y投影数据。但这仅适用于指向上方表面,因此当表面法线具有正Y分量时。 ? 如果所有表面都朝上怎么办?

    2.4K30

    Unity通用渲染管线(URP)系列(八)——复杂贴图(Masks, Details, and Normals)

    细节平滑度 · 3.4 淡化细节 · 4 法线贴图 · 4.1 采样法线 · 4.2 切线空间 · 4.3 阴影偏差插值法线 ·...(金属度1,平滑度0.95) 2.1 MODS 我们为金属材质添加一个单独贴图,为平滑度添加另一个贴图,但是两者都只需要一个通道,因此我们可以将它们合并为一个贴图。...HDRP使用ANySNx格式,这意味着它在R中存储反照率调制,在B中存储平滑度调制,并在AG中存储细节法向矢量XY分量。但是我们贴图不会包含法线向量,因此我们仅使用RB通道。...(淡化细节) 4 法线贴图 即使我们已经让表面复杂很多了,它看起来仍然很平坦,因为它确实如此。照明与表面法线交互,该法线在每个三角形上平滑插值。...4.4 细节化法线 我们还可以包含法线贴图以获取细节信息。尽管HDRP在一张贴图中将法线细节与反照率和平滑度结合在一起,但我们这里将使用单独纹理。

    4.3K40

    基础渲染系列(九)——复合材质

    在我们着色器中调整细节纹理显示名称,以匹配标准着色器。 ? ? (次要贴图) 细节法线贴图工作原理与主法线贴图相同。奇怪是,标准着色器GUI不会隐藏细节凹凸比例。...着色器编译器将检测重复代码并对其进行优化。 ? ? (充分发挥贴图平滑度) 沿着金属条边缘那些正方形失真是什么? 这些失真是由法线贴图DXT5nm纹理压缩引起。...(使用未压缩法线贴图) 3.2 将平滑度与反照率相结合 当你同时需要将金属贴图平滑贴图组合为单个纹理时,这很好。金属零件几乎总是比其他零件光滑。...3.6 岩浆材质 以下是反照率和法线贴图示例,它们对冷却岩浆产生了失真现象。该材质不是金属,但具有不同平滑度。因此,平滑度值存储在反照率图Alpha通道中。 ? ?...(反照率带有平滑度,法线正常) 使用albedo source选项为平滑度创建带有这些贴图材质。 ? (岩浆材质) 当使用反照率光源时,与红色带状沟相比,灰色团块明显更光滑。 ? ?

    3.4K10

    基础渲染系列(十三)——延迟着色

    然后,创建级联阴影贴图。第一个灯光阴影贴图最终需要111个Draw Calls,而第二个灯光阴影贴图则需要121个Draw Calls。这些阴影贴图被渲染到执行过滤屏幕空间缓冲区。...由于定向光源会影响所有事物,因此将使用覆盖整个视图单个四形对其进行渲染。 ? (方向光使用一个4形) 该四形使用Internal-DeferredShading着色器渲染。...我们知道镜面反射色调是什么,并且可以使用GetSmoothness检索平滑度值。 ? ? ? (镜面颜色和平滑度) 场景视图使我们可以直接看到平滑度值,因此我们无需使用技巧即可对其进行验证。...法线编码方式类似于常规法线贴图。 ? ? (法线) 2.5 Buffer 3 最终G缓冲区用于累积场景光照。其格式取决于相机是设置为LDR还是HDR。...(绘制延迟反射) 首先渲染天空盒,覆盖整个视图。然后,每个探针都被渲染,就像灯光一样,只是它们使用立方体。 每个探针最终完全覆盖其体积内表面。先前渲染所有反射都将被覆盖

    3K20

    基础渲染系列(六)——凹凸

    但是,单个三角形表面却始终是光滑。它只能在三个法线向量之间插值。因此它不能代表粗糙或变化表面。当放弃反照率纹理并仅使用纯色时,这会变得非常明显。 这种平直度一个很好例子是一个简单形。...在场景视图中找到一个好视角,以便在四形上可以有一些光差异。 ? ? (无环境光,只有主方向光) 我们如何使这个四形看起来不平坦呢? 可以通过将阴影烘焙到反照率纹理中来伪造粗糙度。...但是每个四形只有四个法线,每个顶点一个。这只能产生平滑过渡。如果我们想要变化并且粗糙表面,则需要更多法线。 那么还有一种方法,我们可以将四形细分为更小形,这让我们可以使用更多法线。...最小合理差异将覆盖我们纹理单个纹理像素。可以通过带有_TexelSize后缀float4变量在着色器中检索此信息。Unity设置这些变量,类似于_ST变量。 ?...2.4 结合反照率和凹凸 现在我们有了功能性法线贴图,你可以检查它带来差异。仅使用大理石反照率纹理时,我们形看起来就像是完美抛光石头。添加法线贴图之后,它会变得更加有意思。 ? ?

    3.7K40

    基础渲染系列(十)——更复杂复合材质

    下面就是为此调整法线贴图。 ? (凹陷电路法线图) 使用此法线贴图时,电路材质确实确实凹陷了。但是凹痕最深部分和未凹痕表面一样被照亮。凹痕没有任何自我遮挡现象。结果,这些凹痕看起来并不深。...1.5 合并贴图 由于我们仅使用遮挡图一个通道,即G通道。用于电路金属图存储在R通道中,平滑度存储在alpha通道中。这意味着我们可以将所有三个贴图组合为一个纹理。下面是一张这样贴图。 ?...(在单个贴图中结合金属,遮挡和平滑度) 着色器不知道我们是否正在重复使用纹理,因此它仍将第二次对遮挡贴图进行采样。但是使用单个纹理确实会减少内存和存储需求。...这些细节不能太小,3 x 3tiling效果较好。 ? ? (细节电路板) 2.1 细节遮罩 现在细节会覆盖整个表面,但这看起来并不好。最好是细节不要覆盖金属零件。...它可以做很多事情,但是具有多种使用风格变体。 标准着色器还具有着色器功能,可切换法线贴图和局部贴图使用。当指定主法线贴图或细节法线贴图时,法线贴图将启用。当设置了细节反照率或法线时,将启用细节。

    2.3K30

    基础渲染系列(十六)——静态光照

    这是在到达我们眼睛之前会从多个表面反弹光。由于光线在拐角处反弹,因此本来会被阴影覆盖区域仍会被照亮。间接光虽然无法实时计算,但可以在烘焙时加入反弹光。...转换值为1减去平滑度值平方。从平滑度到粗糙度平方映射最终会产生比线性转换更好结果。 ? ? (调整了反照率) 4 定向光照贴图 光照贴图器仅使用几何图形顶点数据,不考虑法线贴图。...光照贴图分辨率太低,无法捕获典型法线贴图提供细节。这意味着静态照明将是平坦。当使用具有法线贴图材质时,这一点变得非常明显。 ? ?...(使用法线贴图 实时光VS光照贴图化) 4.1 定向 通过将“Directional Mode”改回“Directional”,可以使法线贴图在烘焙光照下工作。...(强度贴图和方向贴图) 当方向图可用时,我们可以使用它来对烘焙光执行简单漫反射着色。这使得可以应用法线贴图。请注意,只有一个光方向是已知,因此阴影将是近似值。

    3.7K20

    基础渲染系列(二十)——视差(基础篇完结)

    我们还会使用法线贴图将表面不规则感添加到平滑三角形。这会影响灯光,但不会影响表面的实际形状。因此,该效果不会显示视差。这限制了我们可以通过法线贴图添加深度幻觉。...使用一个旋转了(90、0、0)形创建一个新场景,使其平放并为其提供材质。 ? ? (四形 没有和有 法线贴图) 如果没有法线贴图,则四形显然是平坦。...添加法线贴图会使它看起来好像具有不规则表面。但是,海拔差异看起来很小。当从平视角观察四形时,这一点变得明显。 如果高程差较大,则表面特征相对视觉位置应由于视差而发生很大变化,但现在不会发生变化。...我们看到视差其实还是平坦表面。 ? (浅视角) 我们可以增加法线贴图强度,但这也不会改变视差。同样,当法线贴图变得太强时,它看起来会很奇怪。灯光表明坡度陡峭,而视差告诉我们它是平坦。...因此,法线贴图仅适用于不会显示明显视差微小变化。 ? (更强法线,但还是平坦) 为了获得真正深度感,我们首先需要确定应该有多少深度。法线贴图不包含此信息。因此,我们需要一个高度图。

    3.1K20

    Unity 水、流体、波纹基础系列(一)——纹理变形(Texture Distortion )

    (Distortion Flow材质在四形上) 1.2 让UV流动 流体UV坐标的代码是通用,因此我们将其放在单独Flow.cginc包含文件中。...(没有压缩) 为什么不使用更高分辨率图? 尽管是可以,但流体贴图通常会覆盖较大区域,因此最终导致有效分辨率很低。只要不使用极端变形,就没有问题。...(模拟平静水面) 4.2 法线贴图 albedo贴图仅是预览,因为流动水主要由其表面垂直变化方式定义,这会改变它与光交互方式。为此,我们需要一个法线贴图。...采样A和B法线贴图,应用它们权重,并将它们归一化总和用作最终表面法线。 ? 将法线贴图添加到我们材质中。还可以将其平滑度增加到大约0.7,然后更改光线,以便获得大量镜面反射。...但是我们不需要原始法线向量,因此我们也可以通过将导数存储在贴图中而不是用法线来跳过转换。 导数贴图工作方式与法线贴图相同,不同之处在于它包含X和Y维度上高度导数。

    4.2K21

    3D 可视化入门:渲染管线原理与实践

    对颜色和法线进行差值,可参考后文 多边形着色 4.2 三角形遍历 - triangle traversal 这一部分,通过各种算法,确定这些图元会覆盖哪些像素,并确保没有一个像素被多个三角形覆盖(节省渲染资源...在绘制时,存储要绘制像素深度,当准备覆盖它时,先测试将要绘制像素深度是否小于已经绘制深度,小于则覆盖并更新深度信息,否则保持不变。...) 计算出每个光照,再差值出每个像素点光照。...获得顶点法线 - 邻多边形均值 获得与像素点光照 - 双线性差值 这种着色方式可以平滑地渲染出物体表面,但是会丢失一些高光信息。...获得顶点法线 - 邻多边形均值(和上面一样) 获得与像素点法线 - 双线性差值 顶点法线,平面着色,高洛德着色,冯氏着色 对比 ThreeJS 示例,了解三种着色方式区别: MeshPhongMaterial

    6.7K21

    进阶渲染系列(一)——平坦和线框着色(导数和几何体)

    我们使用表面法线向量添加曲率幻觉。这样就可以创建看似平滑表面的网格。但是,有时你可能想显示实际上平面三角形,以用于样式或更好地查看网格拓扑。...同样,如果我们可以使用具有任何网格平面着色材质,并覆盖其原始法线(如果有),那将是更好。 除了平面着色,显示网格线框也可能有用或看起来时尚。这使得网格拓扑更加明显。...因此,最终法向向量是这些向量归一化叉积。使用此向量覆盖原始法线。 ? ddx和ddy如何工作? GPU在采样纹理时需要知道纹理坐标的屏幕空间导数,以确定要使用mipmap级别。...它们看起来是多面的,如果你同时使用法线贴图时可能很难看清。所以, 在本教程截图中,会使用标准胶囊网格,材质为灰色。 ? ?...前两个参数a和b定义了过渡应该覆盖范围,而c是要平滑值。这导致,在使用前将其钳位为0-1。 ? ? ? (调整过渡) 2.6 修复线宽度 线框效果开始看起来不错,但仅适用于边长大致相同三角形。

    2.4K21

    Unity Mesh基础系列(一)生成网格(程序生成)

    这是一个纹理贴图,用来表示一个材质球基本颜色。纹理贴图只有长和宽2个维度,而mesh往往是一个三维物体,所以要达到这个目的,我们需要知道如何将这个纹理投射到mesh三角形上。...我们需要一个顶点在每个四四个角上,但相邻形可以共享相同顶点。鉴于此,我们多定义一个维度长度,好过每个顶点都发生冗余。 即 一个2X4矩形,我们其实只要定义3X5顶点即可,如下。...(第一个三角形) 现在有了一个三角形了,位置我们网格第一块瓷砖一半位置。为了能覆盖整个瓷砖,我们所需要第二个三角形。 ? ?...但是,通过在顶点上附加自定义法线并在它们之间进行三角插值,就可以假装我们有一个平滑曲面而不是一堆平坦三角形。这种错觉是能够欺骗普通人感官,但是一些Mesh锐利轮廓可能降低这一表现。...这可以通过调整材质贴图设置来抵消。通过将其设置为(2,1),U坐标将加倍。如果纹理被设置为重复,那么我们将看到它两个方形瓦片。 ? ? ?

    9.9K41

    游戏建模经验分享:模型学习方法

    低模相当于绘画中结构素描,它能很好锻炼模型师概括力;低模行业里有一句话:三分模型,七分贴图,低模行业模型面数要求低,制作相对简单,大部分纹理结构靠贴图表现,所以整个完整模型大部分精力会集中 在贴图绘制上面...低模布线是可以存在三角面的,甚至有必要是需要三角面而不是四面的。相对高模的话高模类似素描长期作业,它能锻炼模型师综合能力, 例如深入刻画能力等。...高模在圆滑后,那些塑造形体时创建三星,三角面,多星,多角面会严重影响模型平滑度和伸展能力。低模则不同,对它来说高 模忌讳东西却是精简面和塑造形体重要组成元素。...高模相对来说流程比较复杂,因为高模需要贴图是比较多,像法线贴图之类需要去烘焙 也比较费时,但是有的高模对绘画要求不是很高,硬表面机械建模可以利用现在发展起来贴图软件直接进行覆盖,像QX;对于游戏建模...,贴图绘制也就是板绘是一定要学,无论你是走低模,走次世代,绘制贴图都是不可避免

    28510

    游戏TA入门指南PDF

    勾选平滑组 有动画的话勾选动画 不勾选摄影机和灯光 勾选嵌入媒体 单位选自动:米 轴向选 Y 轴向上 第二章 贴图制作 Cocos Creator 引擎支持 PBR 材质和纹理。...在使用 PBR 材质进行渲染时,为获得正确渲染效果,至少需要设置材质: 固有色贴图(Albedo) 金属粗糙度贴图(Metallic Roughness) 法线贴图(Normal) 贴图可以使用 Photoshop...会忽略透明贴图渐变,边缘会显示成硬 所以,根据项目需要选择不同透明贴图方式。...使用 PBR 贴图 Albedo 贴图: PBR 贴图: Normal 贴图:Normal Strength 调整法线贴图强度。 关于 PBR 材质导更多信息,请参考文档。...,防止曲面出现锯齿状 PCF 软阴影 百分比渐近过滤(PCF)是一个简单、常见用于实现阴影边缘反走样技术,通过对阴 影边缘进行平滑处理来消除阴影贴图锯齿现象。

    2.5K20
    领券