shader实用函数和逻辑

重映射:

//将[a,b]的取值映射到[c,d]的范围内
float Remap(float a,float b,float c,float d,float val){
    
    
	    return (val-a)/(b-a) * (d-c) + c;
}

保持宽高比:(uv长宽都是[0,1])

//将uv移动到中心(0.5,0.5) 并保持宽高比
vec2 uvcenter = (fragCoord/iResolution.xy - 0.5)*iResolution.xy/iResolution.y;
//仅保持宽高比
vec2 uv = (fragCoord/iResolution.xy)*iResolution.xy/iResolution.y

连续值变分段值:

float x = floor(uv.xsize)/size;
在这里插入图片描述
float x = ceil(uv.x
size)/size;
在这里插入图片描述
float x = fract(uv.x*size)/size;
在这里插入图片描述

生成随机数:

生成0-1的随机数:

float rand(float3 z){
    
    
                return frac(sin(dot(z.xyz,float3(12.9898,78.233,53.539))) * 43758.5453);
}

围绕某个轴旋转角度的旋转矩阵构造

根据旋转轴axis旋转角度(弧度)

float3x3 RotMatrixByAxisAngle(float angle,float3 axis){
    
    
                float c,s;
                sincos(angle,s,c);

                float t = 1-c;
                float x = axis.x;
                float y = axis.y;
                float z = axis.z;

                return float3x3(
                    t*x*x +c,   t*x*y - s*z,    t*x*z + s*y,
                    t*x*y + s*z,    t*y*y +c,   t*y*z - s*x,
                    t*x*z - s*y,    t*y*z +s*x,    t*z*z+c
                );
            }

求目标像素RGB颜色值对应的灰度等级

该公式是RGB转YUV的BT709明亮度转换公式,是基于人眼感知的图像灰度处理公式。
三个系数为什么不是0.5,0.5,0.5,而是0.2125,0.7154,0.0721。那是因为人眼对红绿蓝三色的敏感程度不同,所以计算灰度的时候要加权平均。这个系数主要是根据人眼对R,G,B三原色的敏感性不同而导出的系数。类似公式:Y = 0.299R + 0.587G + 0.114*B

            fixed3 luminance(fixed3 colorpixel){
    
    
                fixed lumin = 0.2125 * colorpixel.r + 0.7154 * colorpixel.g + 0.0721 * colorpixel.b;
                return fixed3(lumin,lumin,lumin);
            }

猜你喜欢

转载自blog.csdn.net/suixinger_lmh/article/details/125097680