shader之——单光源,法线,高光,+天空盒环境反射(hdr)

author author     2022-10-01     183

关键词:

Shader "baicai/me02" {
    Properties {
        _MainTex ("MainTex", 2D) = "white" {}
        _Bump ("Bump", 2D) = "bump" {}
        _Intension ("强度", Range(0, 10)) = 10
        _Scale ("范围", Range(0, 1)) = 0.5969197
    _SpecularColor("SpecularColor",Color) = (1,1,1,1)

    }
    SubShader {
        Tags {
            "RenderType"="Opaque"
        }
        Pass {
            Tags {
                "LightMode"="ForwardBase"
            }
            
            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #define UNITY_PASS_FORWARDBASE
            #include "UnityCG.cginc"
            #include "AutoLight.cginc"
            #pragma multi_compile_fwdbase_fullshadows
            #pragma target 3.0

             float4 _LightColor0;
             sampler2D _MainTex;
         float4 _MainTex_ST;
             sampler2D _Bump; 
         float4 _Bump_ST;
             float _Intension;
             float _Scale;
         float4 _SpecularColor;


            struct VertexInput {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float4 tangent : TANGENT;
                float2 uv : TEXCOORD0;
            };
            struct v2f {
                float4 pos : SV_POSITION;
                float2 uv : TEXCOORD0;
                float4 posWorld : TEXCOORD1;
                float3 normal : TEXCOORD2;
                float3 tangentDir : TEXCOORD3;
                float3 bitangentDir : TEXCOORD4;
                LIGHTING_COORDS(5,6)

            };
            v2f vert (VertexInput v) {
                v2f o ;
        o.pos = UnityObjectToClipPos(v.vertex );
                o.uv =TRANSFORM_TEX(v.uv, _MainTex);
                o.normal =normalize( UnityObjectToWorldNormal(v.normal));
                o.tangentDir = normalize( mul( unity_ObjectToWorld, float4( v.tangent.xyz, 0.0 ) ).xyz );//切线方向
                o.bitangentDir = normalize(cross(o.normal, o.tangentDir) * v.tangent.w);//双切线
                o.posWorld = mul(unity_ObjectToWorld, v.vertex);
                TRANSFER_VERTEX_TO_FRAGMENT(o)
                return o;
            }
            float4 frag(v2f i) : COLOR {
                float3 nVert = i.normal;//顶点法线,不支持法线贴图的时候 ,是把这个当做最终法线
                float3x3 tangentTransform = float3x3( i.tangentDir, i.bitangentDir, nVert);
                float3 BumpMap = UnpackNormal(tex2D(_Bump,i.uv));
                float3 N = normalize(mul( BumpMap.rgb, tangentTransform )); // 法线贴图 模型法线 切线 相结合,得到最终的法线
        float3 V = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz); //视向量
                float3 L = normalize(_WorldSpaceLightPos0.xyz);
                float3 speL = normalize(V+L); //视向量 + 光向量,得到一个高光的光向量
////// Lighting:
                float atten = LIGHT_ATTENUATION(i);
///////// Gloss:
                float Gloss = exp2( _Scale * 10.0+1.0);
////// Specular:
                float NdotSpeL = saturate(dot (speL,N)); //高光强度
                float4 col = tex2D(_MainTex,i.uv);
                float3 specular0 = atten * _LightColor0.xyz * pow(NdotSpeL,Gloss) * _SpecularColor * _Intension*col.a;
///////worldRefl
        half3 worldRefl = reflect (-V,N);/////
        half4 skyData = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, worldRefl);/////
        half3 skyColor = DecodeHDR (skyData, unity_SpecCube0_HDR);/////
/////// Diffuse:
        float NdotL = saturate(dot( N, L )); //漫反射强            
                col.rgb= col.rgb * (NdotL *_LightColor0.xyz * atten + UNITY_LIGHTMODEL_AMBIENT.rgb);
                
/// Final Color:
        col.rgb = col.rgb * 0.5 + skyColor*col.a*0.5 + specular0 ;/////
            
                return col;
            }
            ENDCG
        }
   }
   FallBack "Diffuse"
}

 

shaderlab学习小结漫反射+高光+点光源

场景中有一个平行光,一个×××点光源,设高光颜色为绿,效果如下:Shader代码:Shader"Custom/DifSpecPoint"{Properties{_Spec("Spec",Color)=(1,1,1,1)//高光颜色_Shin("Shin",range(1,32))=2//高光强度系数}SubShader{pass{tags{"lightmode"="forwardbase"}CGP 查看详情

shader之——多光源漫反射以及阴影

Shader"Unlit/MulLight"{Properties{_MainTex("Texture",2D)="white"{}}SubShader{//一盏主灯Pass{//Always:总是渲染;没有光照模式。//ForwardBase:适用于前渲染、环境、主要方向灯、光/sh光和烘焙图。//ForwardAdd:适用于前渲染,叠加每一盏灯,每一盏灯就多... 查看详情

带法线贴图的高光着色

...空间矩阵//片元函数采样法线贴图并且反隐射再计算光照Shader"Tang/617/BlinnTexNormal" Properties _Color("TinColor",Color)=(1,1,1,1) _MainTex 查看详情

翻译8unityreflections(代码片段)

...ing一块完美的镜子是不会发生漫反射,但现在我们自己的Shader包含的[光照:环境光、漫反射、高光反射]、纹理、阴影,结果看起来蛮好。但是当把Metallic设为1,Smoothness设位0.95,看起来很亮就很不自然了。从下图看尽管颜色是... 查看详情

怎么使用深空盒子材质

...下操作:1.从菜单栏中,单击Assets>Create>Material。2.在Shader下拉选单中,单击Skybox,然后单击要使用的天空盒着色器。3.现在可以填写材质的属性以设置天空盒。材质的可用属性取决于材质使用的天空盒着色器。注意:每个天... 查看详情

Unity 自定义天空盒,如 Unity 天空盒

...何运气,我对着色器完全陌生。这是我到现在为止的代码Shader"Custom/fundido"Proper 查看详情

通过使用unityshader实现基础光照效果(代码片段)

...多少辐射量;高光反射部分,用于描述当光线从光源照射到模型表面时,该表面会在完全镜面反射方向散射多少辐射量;漫反射部分,当光线从光源照射到环境表面时,该表面会向每个方向散射多少辐射量... 查看详情

OpenGL:天空盒放大太多

...这样:这是我创建天空盒的代码:SkyBox::SkyBox()programID=LoadShaders("Resources/Shaders/skybox.vert", 查看详情

cesium之天空盒对应方位(代码片段)

下文讲解一下关于Cesium的天空盒具体方位。天空盒对应图一个立方体展开图,相当于一个站在negz的位置,背对电脑屏幕,对应关系如下negz→downposx→rightnegx→leftposy→backposz→upnegy→front分享一个天空盒网址www.custommapmakers.o... 查看详情

unity之pbr材质流程与材质制作实践

...一套基于物理的着色(PhysicallyBasedShading,PBS)的多功能Shader,叫做标准着色器(StandardShader)。这套Shader的设计初衷是化繁为简。想用这样的一个多功能Shader,来代替之前多种多样的Shader各司其职,对于不同的材质效果,需要不... 查看详情

OpenGL 在延迟渲染器中实现天空盒

...的位置的影响像任何物体一样相对于光(它的行为就像离光源很远的大盒子,并且显示得很暗)。我没有尝试在后 查看详情

unity之自制玻璃啤酒瓶shader

客户的要求如下步骤:1.进行玻璃瓶效果分析效果如下:高光,类次表面散射(里层通透而外层较为暗淡),外层白色勾勒轮廓。 高光:unity内部提供光滑度参数,越光滑则高光效果越明显,啤酒瓶材质是属于光滑,高光明... 查看详情

关于unity中天空盒的使用

...空盒是一个盒子,一个正方形的盒子。其实本身也是一种shader,需要材质球做载体。1:一个场景是由6幅正方形的纹理图无缝拼接而成,在视野看来位于真实的视野一样;2:两种天空盒:  场景天空盒Window->Lighting->Scene->Skybox,... 查看详情

unity商业shader开发之高光rimcolor,rimlight关键代码解析(代码片段)

原理RimColor的原理,puppert大神已经说的很清楚了,而关键还是viewDirUnityShader-边缘光(RimLight)效果_puppet_master的专栏-CSDN博客代码一#ifdefRIMLIGHT halfrim=1-saturate(dot(i.viewDir,i.normal)); c.rgb+=saturate( 查看详情

ogersdk研究之四demo_skybox天空盒

SkyBox.h/*-----------------------------------------------------------------------------ThissourcefileispartofOGRE(Object-orientedGraphicsRenderingEngine)Forthelatestinfo,see​​​http://www.ogre3d.org/​​ 查看详情

phong和blinn-phong光照模型

...。但算法简单,运行速度快是Blinn-Phong光照模型的优点。Shader"Unlit/LightShader& 查看详情

unityshader用cubemap实现天空盒和环境映射(代码片段)

...mapCubemap在实时渲染中有很多应用,最常见的就是实现天空盒(Skybox)和环境映射(EnvironmentMapping)。2实现天空盒2.1实现原理天空盒不陌生,而且一定还听说过天空球吧!因为实现天空盒的技术除了六... 查看详情

shaderlab学习小结简单产生阴影

在之前“ShaderLab学习小结(三)漫反射+高光+点光源请添加链接描述”中的场景加入一个plane,如下图:被平行光和点光源照射的球体没有产生阴影代码方面很好解决,就是在原先的shader最末尾加个fallback即可Shader"shadername"{SubShade... 查看详情