#ifdefined(UNITY_COMPILER_HLSL)#defineUNITY_INITIALIZE_OUTPUT(type,name) name = (type)0;#else#defineUNITY_INITIALIZE_OUTPUT(type,name)#endif 只有在HLSL编译器编译时,它才工作,初始化name参数,否则编译器可能会报如下错误: “Shader error in 'Jie/Test': 'vert': output parameter 'o' not completely initialized at line 37”
另外记得在表面着色器的顶点偏移函数里如果要传递值,需要调用UNITY_INITIALIZE_OUTPUT宏来初始化结构体。 void vertexDataFunc(inout appdata_full v, out Input o) { UNITY_INITIALIZE_OUTPUT(Input, o); float3 value = (cos(5.0 * v.vertex.y + _Time.y) * 0.015 + sin(5.0 * v.vertex.y + _Time...
myvert #pragma multi_compile_fog sampler2D _MainTex; uniform half4 unity_FogStart; uniform half4 unity_FogEnd; struct Input { float2 uv_MainTex; half fog; }; void myvert (inout appdata_full v, out Input data) { UNITY_INITIALIZE_OUTPUT(Input,data); float pos = length(UnityObjectToView...
{ UNITY_INITIALIZE_OUTPUT(Input, o); o.vertColor = v.color; } 我们注意到这个方法的输出o与surf方法的输入IN类型相同,其实就是在顶点为surf方法赋值了输入数据。 如果注释掉UNITY_INITIALIZE_OUTPUT这一行,会报错: 'vert': output parameter 'o' not completely initialized at line 25 (on glcore) 因为...
f. 随后 Unity 定义了真正的顶点着色器: // vertex shader v2f_surf vert_surf (appdata_full v) { UNITY_SETUP_INSTANCE_ID(v); v2f_surf o; UNITY_INITIALIZE_OUTPUT(v2f_surf,o); UNITY_TRANSFER_INSTANCE_ID(v,o); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); myvert (v); o.pos = UnityObje...
变量o没有初始化,Dx平台的Shader在使用时需要手动初始化,假设我们的顶点着色器是以下代码,则我们必须使用双斜杠注释的内容来初始化o: v2f vert (appdata_full v) { v2f o; //UNITY_INITIALIZE_OUTPUT(v2f, o); ... return o; }
2. 在顶点函数中,如果有一个使用了out修饰符的参数,那么我们需要对这个参数进行初始化: UNITY_INITIALIZE_OUTPUT( Input, o); 3. 不支持在顶点着色器中进行纹理采样。 要使用SV_POSITION来描述顶点着色器的输出顶点,否则在PS4平台上无法正常运行。 要使用SV_Target来描述片元着色器的输出颜色,否则在PS4平台上无...
UNITY_INITIALIZE_OUTPUT(Input,data); float pos = length(UnityObjectToViewPos(v.vertex).xyz); float diff = unity_FogEnd.x - unity_FogStart.x; float invDiff = 1.0f / diff; data.fog = clamp ((unity_FogEnd.x - pos) * invDiff, 0.0, 1.0); ...
UNITY_CAN_COMPILE_TESSELLATION- 在着色器编译器“理解”密铺着色器 HLSL 语法(目前仅 D3D11)时定义。 UNITY_INITIALIZE_OUTPUT(类型,名称)- 将给定类型的名称变量初始化为零。 UNITY_COMPILER_HLSL、UNITY_COMPILER_HLSL2GLSL、UNITY_COMPILER_CG- 指明正在使用哪个着色器编译器编译着色器。分别有 Microsoft 的 HLSL...
UNITY_INITIALIZE_OUTPUT(v2f, v); //UNITY_MATRIX_MV模型视图矩阵转置 float4 pos = float4(UnityObjectToViewPos(i.pos), 1); //UNITY_MATRIX_IT_MV中,模型视图逆转置,加IT是专门用来变换法线用的,将模型空间转换到相机空间 float3 normal = mul((float3x3)UNITY_MATRIX_IT_MV, i.normal); ...