挖掘机团队_Shader从入门到放弃篇(一)

shader分两种

1:表面着色器(Surface Shader) - 为你做了大部分的工作,只需要简单的技巧即可实现很多不错的效果。

2:片段着色器(Fragment Shader) - 可以做的事情更多,可以在比较低的层级上进行更复杂(或者针对目标设备更高效)的开发。

这里的教程主要讲表面着色器

以Diffuse Texture为例直接贴代码加注释

Shader "Custom/Diffuse Texture" {
    Properties//Shader属性定义 
    {
        _Color ("Color"Color) = (1,1,1,1)       //设置一个默认的颜色值
        _MainTex ("Albedo (RGB)"2D) = "white" {}  //默认的白色纹理
        _Glossiness ("Smoothness"Range(0,1)) = 0.5  //默认的光泽度
        _Metallic ("Metallic"Range(0,1)) = 0.0    //金属光泽度
        //定义属性的语法:_Name("Display Name", type) = defaultValue[{options}]
        //_Name - 属性的名字,简单说就是变量名,在之后整个Shader代码中将使用这个名字来获取该属性的内容
        //Display Name - 这个字符串将显示在Unity的材质编辑器中作为Shader的使用者可读的内容
        //type - 这个属性的类
    }
    SubShader//子着色器部分
     {
        //表面着色器可以被若干的标签(tags)所修饰,
        //而硬件将通过判定这些标签来决定什么时候调用该着色器。
        Tags { "RenderType"="Opaque" }
        
        LOD 200
      
        CGPROGRAM//这是一个开始标记,表明从这里开始是一段CG程序
        
        //语法 pragma surface surfaceFunction lightModel [optionalparams]
        //surface - 声明的是一个表面着色器
        //surfaceFunction - 着色器代码的方法的名字,在下面可以找到对应的方法
        //lightModel - 使用的光照模型。
        #pragma surface surf Standard fullforwardshadows
        
        //编译着色器模式3.0:
        #pragma target 3.0 
        
        //在CG模块中重定义属性
        fixed4 _Color;
        half _Glossiness;
        half _Metallic;
        sampler2D _MainTex;//sampler2D类型就是在hlsl中的的2d贴图类型
        
        struct Input//用于作为输入参数的Input,必须命名为Input
        {
            float2 uv_MainTex;
        };

        ///主要渲染函数
        void surf (Input IN, inout SurfaceOutputStandard o)
         {
             //tex2D函数:在一张贴图中对一个点采样,返回float4 
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            //将物体显示的漫反射颜色设置成在纹理的颜色值
            o.Albedo = c.rgb;
            //将物体显示的金属光泽设置成在properties中定义的光泽
            o.Metallic = _Metallic;
            //设置物体显示的光滑度
            o.Smoothness = _Glossiness;
            //设置物体显示的透明度
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

第一篇就到这里,可以对着例子写一个自己的第一个shader了
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
几个星期前,我在想,能否使用Unity来进行地形的实时变化?比如说,如果发生爆炸,它能否在地形中显示一个气泡?我认为学习更多高级的Unity中的地形特征将会是一个好的项目。 这要比我预想的更具挑战性,因为很难在执行这些操作时获得帧率来保持稳定。使用一些技巧,最终实现了我预想的效果。 示例是这样工作的。脚本随机产生“shell”并很快掉落到地面。每一个shell都依附着一个onTrigger对撞机。如果它和拥有 TerrainDeformer组件的地形相冲突的话,shell将告诉组件它的位置和爆炸的作用力。shell然后实例化一个爆炸(explosion)(由Ben Throop great Detonator framework提供),然后移除它自身。 TerrainDeformer脚本然后将那个位置翻译成相对地形的正确位置,并修改heightmap(地形高度)和alphamap(地形纹理)。一点儿数学知识用来在影响圆周内部查找所有的heightmap和alphamap位置。 被用于在影响范围重绘质地的纹理,是从基于传递到脚本(Terrain Deformation Texture Num)中的数字顺序索引值的地形纹理列表中选择的。在这个例子中,它被设置为1,因此它将使用列表中的第二个纹理来重绘质地。 在创建你自己的地形时,有必要将地形的高度设置为大于0米,从而形成弹坑。我建议深度至少为3米。这可以通过将地形高度设为大于3米的任何值,然后点击Terrain->Flatten Heightmap并输入3米。 出于执行的原因,保持你的Terrain Size为small是非常重要的,以及更重要的是保持Heightmap Resolution为low。在这个例子中,设置为33。 目前版本没有想缺乏地形边缘检测的局限性,并提供多个地形。这个例子表明它不仅能够工作,而且不会有大的性能损失。 感谢Calin创建一个泥土纹理。 为检测示例,<http://blog.almostlogical.com/workingExamples/RealTimeTerrainDeformation/index.html> 为获得源码(unitypackage), 源码要求:Unity 2.6 以及 Detonator Framework。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值