<Shader>透明效果+纹理融合 vertex和fragment
2017-05-24 10:55
411 查看
shader "Custom/VertexFragment003"{ Properties{ _MainColor("Main Color:",color) = (1,1,1,1) _MainTexture("Main Texture",2d) = "white" {} _SpecularColor("Specular Color:",color) = (1,1,1,1) _SpecularShininess("shininess Range",range(0,100)) = 10 } SubShader{ pass { Tags{ "LightMode" = "ForwardBase" } CGPROGRAM #pragma vertex vert #pragma fragment frag float4 _LightColor0; float4 _MainColor; float4 _SpecularColor; sampler2D _MainTexture; float _SpecularShininess; //顶点输入的信息 struct appData{ float4 vertex:POSITION; //顶点的坐标 float3 normal:NORMAL; //顶点的法向量 float2 texcoord:TEXCOORD0; //一级纹理UV坐标 }; //顶点着色器输出的结构 struct v2f{ float4 pos:SV_POSITION; //顶点像素的位置 float3 normal:NORMAL; //顶点法线的位置 float2 texure0:TEXCOORD0; //一级纹理的坐标 float4 worldPos:TEXCOORD1; //在世界坐标中的位置 }; v2f vert(appData IN) { v2f OUT; OUT.pos = mul(UNITY_MATRIX_MVP,IN.vertex); //mvp的坐标 OUT.normal = mul(float4(IN.normal,0.0),unity_ObjectToWorld).xyz; OUT.worldPos = mul(unity_ObjectToWorld,IN.vertex); OUT.texure0 = IN.texcoord; //输出的纹理就等于输入的纹理 return OUT; } float4 frag(v2f IN):COLOR { float4 textColor = tex2D(_MainTexture,IN.texure0); //计算diffuse = MainColor * LightColor * max(0,dot(N,L)) float3 normalDirection = normalize(IN.normal); float3 lightDiretion = normalize(_WorldSpaceLightPos0.xyz); float3 viewDirection = normalize(_WorldSpaceCameraPos - IN.worldPos.xyz); float3 diffuseColor; //计算出 diffuse = maincolor * lightColor * max(0,dot(N,L)) float3 specularColor; //specula = mainColor * specularColor * pow( max(0,dot(r,v)),shininess ) R = reflet(-N,L) if (dot(normalDirection,lightDiretion) < 0.0){ diffuseColor = float3(0,0,0); } else{ diffuseColor = _MainColor.rgb * _LightColor0.rgb * max(0,dot(normalDirection,lightDiretion)); } float3 reflectDirection = reflect(-normalDirection,lightDiretion); specularColor = _MainColor * _SpecularColor * pow(max(0,dot(reflectDirection,viewDirection)),_SpecularShininess); float4 finalColor = float4(diffuseColor,1.0) + float4(specularColor,1.0) + UNITY_LIGHTMODEL_AMBIENT; //将漫反射 镜面反射 环境光 乘以纹理的颜色值 极为最终的颜色值。 return finalColor * textColor; } ENDCG } } FallBack "Diffuse" }
相关文章推荐
- Shader 透明效果+纹理融合Code
- Unity3D ShaderLab <六>通过改变纹理的UV坐标实现简单的水流效果
- UNITY3D shader学习心得<三> Vertex and Fragment Shader
- Android OpenGL10 多纹理效果 <5>
- 【猫猫的Unity Shader之旅】之Vertex&Fragment Shader下的透明
- shader学习之基础纹理透明效果
- <Shader>简单的纹理坐标滚动(水波模型:脚本控制)
- Unity3D Shader(10)——Fragment Shader(漫反射、phong效果、blinnPhong效果、阴影、halfLambert、渐变纹理)
- Unity3D Shader(14)——Fragment Shader(遮挡、透明效果)
- Muli3D <8> 计算Shader中顶点属性相对于屏幕坐标的偏导数
- Photoshop入门与进阶实例:3.5 透明晶格纹理效果
- Unity Shader-非主流纹理采样研究(流光,溶解,隐身效果)
- 渲染世界的OpenGL<8> 基础纹理
- <Android> 在Activity之间进行滑动效果的切换Anim动画
- UnityShader入门精要学习笔记(十):透明效果-上部分
- 渲染世界的OPENGL<13>纹理进阶-矩形及立方体贴图
- Shader实现法线映射、透明效果
- <s:property>从数据库中取出文字如何在jsp显示效果
- Android Fragment 学习<1>