1,时间相关iGlobalTime转为_Time.y
2,向量相关vec2,vec3转换为float2,float3
3,矩阵相关mat2转为float2x2,mat3转为float3x3等
4,初始化简写vec3(1.)转换为float3(1.,1.,1.)
5,Texture2D 改写为 Tex2D
6,矩阵相乘*= 改写为 mul()
7,GLSL中纹理坐标Y方向的原点在顶部,而HLSL中纹理坐标Y方向的原点在底部,所以你需要使用这个公式uv.y = 1 – uv.y 对每个点重新定义纹理坐标
8,屏幕尺寸iResolution转为_ScreenParams
9,内置函数转换:
- #define mod fmod
- #define mix lerp
- #define atan atan2
- #define fract frac
10,(坑)矩阵初始化顺序,GLSL以列为准,HLSL以行为准。例如GLSL中的代码mat2 m = mat2(1.,2.,3.,4.)转到HLSL中如果只是简单把mat2换成float2x2是不对的,还需要注意矩阵初始化顺序,float2x2 m = float2x2(1.,3.,2.,4.)才是正确的结果
11,(坑)全局变量会在执行每个frag时初始化为0值,为全局变量定义非0默认值是无效的,例如
- fixed3 col_water = fixed3(.3, .7, 1.);
- fixed4 frag (v2f i) : SV_Target
- {
- //use global vars
- }
以上代码如果在frag中使用全局变量col_water,将会得到0值而不是期望的fixed3(.3, .7, 1.)
解决办法两个:
1)在frag入口时为全局变量赋值;
2)为全局变量声明Unity Shaderd的Properties,并设置默认值
推荐使用第2个方法
参考:https://alastaira.wordpress.com/2015/08/07/unity-shadertoys-a-k-a-converting-glsl-shaders-to-cghlsl/
===========================
#define vec2 float2
#define vec3 float3
#define vec4 float4
#define mat2 float2x2
#define mat3 float3x3
#define mat4 float4x4
#define fract frac
#define mod fmod
#define mix lerp
#define atan atan2
-----------------------------
注意glsl关键 比如line ,不要作为变量名使用
矩阵相乘 不用* 使用mul(a,b)
参考(Monogame shader for beginner):
https://learn-monogame.github.io/tutorial/infinite-background-shader/