Unity3D
来源:互联网 发布:钓鱼生成软件下载 编辑:程序博客网 时间:2024/06/16 18:03
顶点片段着色器运行于具有可编程渲染管线的硬件上,它包括顶点程序(Vertex Programs)和片段程序(Fragment Programs)。
当使用顶点程序和片段程序进行渲染时,图形硬件的固定功能管线将会馆关闭,具体来说就是用户编写的顶点程序将会替换掉固定管线标准中的3D变换、光照、纹理坐标生成等功能,而片段程序会替换掉SetTexture命令中的纹理混合模式,因此编写顶点片段着色器需要对3D变换、光照计算等有非常透彻的了解。
用户需要自行编写代码来替代D3D或则OpenGL原先在固定管线中要做的工作。
与表面着色器一枪,顶点片段着色器也需要用Cg/HLSL来编写实现代码,代码用CGPROGRAM ENDCG语句包围起来,放在ShaderLab的Pass命令中:
Pass { // 通道设置 CGPROGRAM // 本段Cg代码的编译指令 #pragma vertex vert #pragma fragment frag // Cg代码 ENDCG // 其他通道设置}
下面是顶点片段着色器中编译命令的一些说明:
编译命令(Compilation Directive)
编译目标(Shader Targets)
编译目标可以设置为#pragma target 2.0
、#pragma target 3.0
、#pragma target 4.0
、#pragma target 5.0
。
他们分别对应不同版本的着色器模型(Shader Modal)
渲染平台(Rendering Platforms)
Unity支持多重图形API:
- d3d9 即Direct3D 9
- d3d11 即Direct3D 11
- opengl 即OpenGL
- gles 即OpenGL ES 2.0
- gles3 即OpenGL ES 3.0
- metal 即 iOSMetal
- d3d11_9x 即Direct3D 11 9.x feature level
- xbox360 即Xbox360
- xbox one 即Xbox One
- ps3 即PlayStation3
- ps4 即PlayStation4
- psp2 即PlayStation Vita。
沿着法线方向移动顶点。
Shader "Example/Normal Extrusion" { Properties { _MainTex ("Texture", 2D) = "white" {} _Amount ("Extrusion Amount", Range(-1,1)) = 0.5 } SubShader { // 渲染类型为不透明 Tags { "RenderType" = "Opaque" } CGPROGRAM // 定义表面和顶点函数 #pragma surface surf Lambert vertex:vert struct Input { // MainTex的UV坐标 float2 uv_MainTex; }; float _Amount; // 输入结构作为参数 void vert (inout appdata_full v) { // 修改顶点位置 v.vertex.xyz += v.normal * _Amount; } sampler2D _MainTex; void surf (Input IN, inout SurfaceOutput o) { // 输出漫反射颜色 o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb; } ENDCG } Fallback "Diffuse"}
根据法线方向设置模型表面颜色
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Example/Display Normals" { SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; float3 color : COLOR0; }; v2f vert (appdata_base v) { v2f o; o.pos = UnityObjectToClipPos (v.vertex); o.color = v.normal * 0.5 + 0.5; return o; } // 片段程序代码,直接把输入的颜色返回,并把透明度设置为1 half4 frag (v2f i) : COLOR { return half4 (i.color, 1); } ENDCG } } Fallback "VertexLit"}
根据切向方向设置模型表面颜色
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Example/Tangents" { SubShader { Pass { Fog { Mode Off } CGPROGRAM #pragma vertex vert #pragma fragment frag // vertex input: position, tangent // 输入位置和切线数据 struct appdata { float4 vertex : POSITION; float4 tangent : TANGENT; }; // 定义顶点位置结构体 struct v2f { float4 pos : SV_POSITION; fixed4 color : COLOR; }; // 顶点函数程序 v2f vert (appdata v) { v2f o; // 计算顶点位置 o.pos = UnityObjectToClipPos( v.vertex ); // 计算顶点颜色 o.color = v.tangent * 0.5 + 0.5; return o; } // 片段程序,直接返回顶点颜色 fixed4 frag (v2f i) : COLOR0 { return i.color; } ENDCG } }}
阅读全文
0 0
- Unity3D
- Unity3D
- Unity3D
- Unity3D
- unity3d
- Unity3D
- Unity3D
- Unity3D
- UNITY3D
- Unity3D
- unity3d
- unity3D
- Unity3D
- Unity3d
- Unity3D
- unity3D
- unity3D
- Unity3D
- 遍历获取list集合的值并通过aJax传给后端
- 使用VisualSVN Server搭建SVN服务器
- java.lang.NoClassDefFoundError: javax/mail/Message
- 浅谈require和import
- hash(二分+hash)使用map会tle
- Unity3D
- Idea Maven 整合ssm框架: SpringMVC+Spring+MyBatis
- 华为面试题(8分钟写出代码) 有两个数组a,b,大小都为n,数组元素的值任意,无序; 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- ffmpeg的工具ffplay.exe使用
- Git小结(入门篇)
- jscpd--前端代码重复率检测
- hdu 3966 Aragorn's Story
- 用Java实现二叉链表方式存储的二叉树
- 依赖注入