如何在 Unity Shader 中实现简单的高度图

2023-12-30

首先我要说的是我对着色器编程知之甚少。我这里的很多内容都是由在线资源和现有资产拼接而成的。我只需要知道如何将高度图正确集成到统一着色器中。它不必比标准 Unity 着色器更复杂。我无法使用标准着色器,因为我需要一个将多个纹理平铺在一起的着色器,这可能就是我尚未找到此问题的解决方案的原因。

我混合并移动了代码,删除了一些变量,重命名了一些变量,并在网上查找了有类似问题的人。

Shader "Unlit/TRUE_EARTH"
{
    Properties
    {
        _TexA1 ("Tex A1", 2D) = "white" {}
        _TexA2 ("Tex A2", 2D) = "white" {}
        _TexB1 ("Tex B1", 2D) = "white" {}
        _TexB2 ("Tex B2", 2D) = "white" {}
        _TexC1 ("Tex C1", 2D) = "white" {}
        _TexC2 ("Tex C2", 2D) = "white" {}
        _TexD1 ("Tex D1", 2D) = "white" {}
        _TexD2 ("Tex D2", 2D) = "white" {}
    _BumpScale("Scale", Float) = 1.0
    [Normal] _BumpMap("Normal Map", 2D) = "bump" {}

    _Height("Height Scale", Range(0.005, 0.08)) = 0.02
    _HeightMap("Height Map", 2D) = "black" {}

    _OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0
    _OcclusionMap("Occlusion", 2D) = "white" {}
}
SubShader
{
    Tags { "RenderType"="Opaque" }
    Lighting Off
    ZWrite Off

    Pass
    {
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        // make fog work
        #pragma multi_compile_fog

        #include "UnityCG.cginc"

        sampler2D _TexA1;
        sampler2D _TexA2;   
        sampler2D _TexB1;
        sampler2D _TexB2;
        sampler2D _TexC1;
        sampler2D _TexC2;   
        sampler2D _TexD1;
        sampler2D _TexD2;
        sampler2D _NormalMap;
        sampler2D _HeightMap;
        half _BumpAmount;
        half _Height;

        struct v2f
        {
           float4 pos     : SV_POSITION;
           float2 uv      : TEXCOORD0;
           half3 normal: TEXCOORD1;
           #if WPM_BUMPMAP_ENABLED
           half3 tspace0 : TEXCOORD2; // tangent.x, bitangent.x, normal.x
           half3 tspace1 : TEXCOORD3; // tangent.y, bitangent.y, normal.y
           half3 tspace2 : TEXCOORD4; // tangent.z, bitangent.z, normal.z
           #endif
        };


        v2f vert (float4 vertex : POSITION, half3 normal : NORMAL, half4 tangent : TANGENT, float2 uv : TEXCOORD5, appdata_full v) {
            v2f o;
            float4 heightMap = tex2Dlod(_HeightMap, float4(v.texcoord.xy, 0, 0));
            vertex.z += heightMap.b * _Height;
            o.pos               = UnityObjectToClipPos (vertex);
            o.uv                = uv;
            half3 wNormal       = UnityObjectToWorldNormal(normal);
            o.normal            = wNormal;


            #if WPM_BUMPMAP_ENABLED
            half3 wTangent = UnityObjectToWorldDir(tangent.xyz);
            half tangentSign = tangent.w * unity_WorldTransformParams.w;
            half3 wBitangent = cross(wNormal, wTangent) * tangentSign;
            //output the tangent space matrix
            o.tspace0 = half3(wTangent.x, wBitangent.x, wNormal.x);
            o.tspace1 = half3(wTangent.y, wBitangent.y, wNormal.y);
            o.tspace2 = half3(wTangent.z, wBitangent.z, wNormal.z);
            #endif

            return o;
        }

        half4 frag (v2f i) : SV_Target
        {
            // compute Earth pixel color
                half4 color;

                // compute Earth pixel color
                if (i.uv.x<0.25) 
                {
                    if (i.uv.y>0.4999) 
                    {
                        color = tex2Dlod(_TexA1, float4(i.uv.x * 4.0, (i.uv.y - 0.5) * 2.0, 0, 0));
                    } 
                    else 
                    {
                        color = tex2Dlod(_TexA2, float4(i.uv.x * 4.0, i.uv.y * 2.0, 0, 0));
                    }
                } 
                else if (i.uv.x < 0.5) 
                {
                    if (i.uv.y>0.4999) 
                    {
                        color = tex2Dlod(_TexB1, float4((i.uv.x - 0.25) * 4.0f, (i.uv.y - 0.5) * 2.0, 0, 0));
                    } 
                    else 
                    {
                        color = tex2Dlod(_TexB2, float4((i.uv.x - 0.25) * 4.0f, i.uv.y * 2.0, 0, 0));
                    }
                }
                else if (i.uv.x < 0.75) 
                {
                    if (i.uv.y>0.4999) 
                    {
                        color = tex2Dlod(_TexC1, float4((i.uv.x - 0.50) * 4.0f, (i.uv.y - 0.5) * 2.0, 0, 0));
                    } 
                    else 
                    {
                        color = tex2Dlod(_TexC2, float4((i.uv.x - 0.50) * 4.0f, i.uv.y * 2.0, 0, 0));
                    }
                }
                else if (i.uv.x < 1.01) 
                {
                    if (i.uv.y>0.4999) 
                    {
                        color = tex2Dlod(_TexD1, float4((i.uv.x - 0.75) * 4.0f, (i.uv.y - 0.5) * 2.0, 0, 0));
                    } 
                    else 
                    {
                        color = tex2Dlod(_TexD2, float4((i.uv.x - 0.75) * 4.0f, i.uv.y * 2.0, 0, 0));
                    }
                }

                // sphere normal (without bump-map)
                half3 snormal = normalize(i.normal);

                // transform normal from tangent to world space
                #if WPM_BUMPMAP_ENABLED
                half3 tnormal = UnpackNormal(tex2D(_NormalMap, i.uv)); 
                half3 worldNormal;
                worldNormal.x = dot(i.tspace0, tnormal);
                worldNormal.y = dot(i.tspace1, tnormal);
                worldNormal.z = dot(i.tspace2, tnormal);
                half3 normal = normalize(lerp(snormal, worldNormal, _BumpAmount));
                #else
                half3 normal = snormal;
                #endif

                return color;
        }
        ENDCG
    }
}
}

纹理效果很好,但没有高度贴图。一切都是平的。


有 3 个部分需要更改。

  1. 确保您的属性与变量匹配:

    _Height("Height Scale", Range(0.005, 0.08)) = 0.02
    _HeightMap("Height Map", 2D) = "black" {}
    
    ....
    
    sampler2D _HeightMap;
    half _Height;
    
  2. 在将顶点存储到之前对其进行修改o

  3. 修改顶点的 y 分量而不是 z:

    float4 heightMap = tex2Dlod(_HeightMap, float4(v.texcoord.xy, 0, 0));
    vertex.y += heightMap.b * _Height;
    o.pos               = UnityObjectToClipPos (vertex);
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Unity Shader 中实现简单的高度图 的相关文章

  • 如何使用 zlib 制作 .zip 文件

    我正在阅读zlib的文档 它相当详细 但我读到了这一行 输出数据将位于zlib格式 与 gzip 或zip formats http www zlib net zlib how html http www zlib net zlib how
  • 为什么大多数平台上没有“aligned_realloc”?

    MSVC有自己的非标准函数 aligned malloc aligned realloc and aligned free C 17和C11引入了 std aligned alloc 其结果可以是de分配有free or realloc B
  • 选择列表逻辑应位于 ASP.NET MVC、视图、模型或控制器中的什么位置?

    我觉得我的问题与这个问题很接近 但我想对这样的代码应该放在哪里进行更一般的讨论 Asp Net MVC SelectList 重构问题 https stackoverflow com questions 2149855 asp net mv
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • 2D morton 码编码/解码 64 位

    如何将给定 x y 的莫顿代码 z 顺序 编码 解码为 32 位无符号整数 生成 64 位莫顿代码 反之亦然 我确实有 xy2d 和 d2xy 但仅适用于 16 位宽的坐标 产生 32 位莫顿数 在网上查了很多 但没有找到 请帮忙 如果您可
  • 预处理后解析 C++ 源文件

    我正在尝试分析c 使用我定制的解析器的文件 写在c 在开始解析之前 我想摆脱所有 define 我希望源文件在预处理后可以编译 所以最好的方法是运行C Preprocessor在文件上 cpp myfile cpp temp cpp or
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • tabcontrol selectedindex 更改事件未被触发 C#

    嘿伙计们 我有一个很小的问题 请参阅下面的代码 this is main load private void Form1 Load object sender EventArgs e tabAddRemoveOperator Selecte
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • asp.net网格分页的SQL查询

    我在用iBatis and SQLServer 使用偏移量和限制进行分页查询的最佳方法是什么 也许我添加该列ROW NUMBER OVER ORDER BY Id AS RowNum 但这只会阻止简单查询的数据访问 在某些情况下 我使用选择
  • WPF。如何从另一个窗口隐藏/显示主窗口

    我有两个窗口 MainWindow 和 Login 显示登录的按钮位于主窗口 this Hide Login li new Login li Show 登录窗口上有一个检查密码的按钮 如果密码正确 我如何显示主窗口 将参数传递给 MainW
  • 使用 mingw32 在 Windows 上构建 glew 时“DllMainCRTStartup@12”的多个定义

    我关注了这个主题 使用 mingw 使建筑物在 Windows 上闪闪发光 https stackoverflow com questions 6005076 building glew on windows with mingw 6005
  • C 中带有指针的结构的内存开销[重复]

    这个问题在这里已经有答案了 我意识到当我的结构包含指针时 它们会产生内存开销 这里有一个例子 typedef struct int num1 int num2 myStruct1 typedef struct int p int num2
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过

随机推荐

  • 使用 GPU 加速 MATLAB 代码?

    AccelerEyes 于 2012 年 12 月宣布与 Mathworks 合作开发 GPU 代码 并已停止生产 Jacket for MATLAB http blog accelereyes com blog 2012 12 12 ex
  • 构建maven项目时编译错误

    我们正在尝试从 Jenkins 构建并部署一个 Maven 工件到我们的 Nexus 存储库管理器中 但我们在构建过程中遇到了编译错误 这是我们收到的错误 错误 未能执行目标 org apache maven plugins maven c
  • 如何在 Chrome 上调试 JavaScript

    我有一个奇怪的问题 jquery load 有时在 chrome 上失败 我不会用细节来打扰你们 我只是在寻找如何调试这样的问题的指导者 我想也许 firebug 可以提供帮助 但问题只发生在 chrome 上 甚至适用于 IE 我做类似的
  • 使用 XMLHttpRequest 上传文件

    我正在尝试使用拖放插件 http pascalprecht github com DnD js 在javascript中使用ajax上传文件
  • 从 HTML 表单到 PDF

    有没有一种简单的方法可以在网页上创建 HTML 表单 当用户提交时 将数据放入 PDF 文件并将其发送给接收者 该网页在 net 上运行 Thanks Umbraco http our umbraco org projects websit
  • 如何使用 C# 或 XAML 创建自动动画轮播循环图像?

    我已经在 Web 开发中完成了轮播 但通过 XAML 或 C 在 WPF 中为它们设置动画对我来说是新鲜事 网上有一些例子 但它们要么已经过时 要么不是我想要的 即使当我玩弄其他项目的源代码时 这也不是我所希望的 我想让图像自动从左到右 水
  • Android webview中的无限滚动

    我有一些本地 html 文件 我想用无限滚动方法显示它们 NOTE 我无法更改 html 内容 所以请不要建议向其中添加 javascript 我必须在运行时执行此操作 所以 我发现我可以执行javascript在运行时通过loadUrl
  • 生成的 pdf 中的文本是反向的

    我正在使用 pdfbox 向 pdf 文件添加一行 但我添加的文字是相反的 File file new File filePath PDDocument document PDDocument load file PDPage page d
  • 如何从 Magento-1 价格中删除小数点?

    我在搜索中找到的只是一个编程解决方案 我知道我们可以修改 lib Zend Locale Data en xml 以用于英语商店 en xml中有这部分
  • 我们可以在每个 上方的 table 内添加 div 吗?

    您好 我正在尝试在每个上面添加一个 div tr 但是当我查看 html 控制台时 div 显示在表格之外 下面是html代码 table div tr td td tr div div tr td td tr div table 这是不允
  • 计算方法的执行时间

    可能的重复 如何测量函数运行的时间 https stackoverflow com questions 10107140 how to measure how long is a function running 我有一个 I O 计时方法
  • 如何在Google App Engine灵活环境中运行TensorFlow?

    之前我问为什么GAE在这里找不到TensorFlow libhttps stackoverflow com questions 40241846 why googleappengine gives me importerror no mod
  • Rails 5 处理 ActionController::ParameterMissing 的方法

    如果使用强参数缺少所需的参数 Rails 服务器将使用 HTTP 500 进行响应 这并不能让我控制向用户反馈到底出了什么问题 能够向他们发送缺少所需参数的消息是否没有意义 提供适当用户反馈的 Rails 方式 是什么ActionContr
  • SQLite 中的“如果不存在则插入”语句

    我有一个 SQLite 数据库 我正在尝试插入值 users id lessoninfo id 表中bookmarks 仅当两者之前不连续存在时 INSERT INTO bookmarks users id lessoninfo id VA
  • 如何更改另一个进程的内存空间中的值

    如果你能帮助我解决这个困境 现在 我知道C C 我知道asm 我知道dll注入 我知道虚拟内存寻址 但我就是不知道如何 像 CheatEngine 等软件可以在另一个进程中更改变量的值 对于那些不知道的人来说 第 3 方作弊引擎工具可以扫描
  • Python 的单元测试可以像鼻子一样并行测试吗?

    Python的NOSE测试框架有以下概念并行运行多个测试 https nose readthedocs io en latest plugins multiprocess html 这样做的目的不是为了测试代码中的并发性 而是为了让 没有副
  • 在 Eclipse 中禁用“下载源代码和 javadoc”

    我正在使用 Eclipse 20210312 0638 我已从首选项 第一张图片 中取消选中 下载工件源 和 下载工件 javadoc 它仍在下载它们 第二张图片 我还应该更改其他配置吗 有人已经修复了 Eclipse 中的一个错误 htt
  • 仅当字符串中存在小写字母时,使用一个正则表达式匹配所有大写单词

    我偶然发现了这个看似微不足道的问题 但我却被困住了 我有一个字符串 我想在其中匹配在一个正则表达式中全部大写单词only如果字符串中的某个位置至少有一个小写字母 基本上 我希望每一行 我们可以考虑将正则表达式分别应用于每一行 不需要进行一些
  • 致命:不是有效的对象名称:'master'

    我有一个运行 git 1 7 的私人服务器 当我 git init 它不会创建主分支的文件夹 因为当我这样做时 git branch 它没有列出任何内容 当我做 git bare init 它创建文件 当我打字时 git branch ma
  • 如何在 Unity Shader 中实现简单的高度图

    首先我要说的是我对着色器编程知之甚少 我这里的很多内容都是由在线资源和现有资产拼接而成的 我只需要知道如何将高度图正确集成到统一着色器中 它不必比标准 Unity 着色器更复杂 我无法使用标准着色器 因为我需要一个将多个纹理平铺在一起的着色