个人资料

跳过导航链接首页 > 博客列表 > 博客正文

GLSL转HLSL帮助和注意事项

分类:

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,内置函数转换:

  1. #define mod fmod
  2. #define mix lerp
  3. #define atan atan2
  4. #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默认值是无效的,例如

  1. fixed3 col_water = fixed3(.3, .7, 1.);
  2. fixed4 frag (v2f i) : SV_Target
  3. {
  4. //use global vars
  5. }

以上代码如果在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/

songshizhao
最初发表2023/3/4 13:50:55 最近更新2023/11/16 16:03:34 1487
为此篇作品打分
10
   评论