Shader实例分析之彩色光圈之值域分析

Shader实例分析之彩色光圈
https://blog.csdn.net/stalendp/article/details/40690185
链接如下,我在这里想总结的是其中一个值域的分析。

Shader "shadertoy/TotalNoob" {  //https://www.shadertoy.com/view/XdlSDs
	Properties{
		iMouse ("Mouse Pos", Vector) = (100,100,0,0)
		iChannel0("iChannel0", 2D) = "white" {}  
		iChannelResolution0 ("iChannelResolution0", Vector) = (100,100,0,0)
	}
	  
	CGINCLUDE    
	 	#include "UnityCG.cginc"   
  		#pragma target 3.0      
  		#pragma glsl
 
  		#define vec2 float2
  		#define vec3 float3
  		#define vec4 float4
  		#define mat2 float2x2
  		#define iGlobalTime _Time.y
//  		#define mod fmod  // mod = sign*fmod
  		#define mix lerp
  		#define atan atan2
  		#define fract frac 
  		#define texture2D tex2D
  		// 屏幕的尺寸
  		#define iResolution _ScreenParams
  		// 屏幕中的坐标,以pixel为单位
  		#define gl_FragCoord ((_iParam.srcPos.xy/_iParam.srcPos.w)*_ScreenParams.xy) 
  		
  		#define PI2 6.28318530718
  		#define pi 3.14159265358979
  		#define halfpi (pi * 0.5)
  		#define oneoverpi (1.0 / pi)
  		
  		fixed4 iMouse;
  		sampler2D iChannel0;
  		fixed4 iChannelResolution0;
  		
        struct v2f {    
            float4 pos : SV_POSITION;    
            float4 srcPos : TEXCOORD0;   
        };              
        
       //   precision highp float;
        v2f vert(appdata_base v){  
        	v2f o;
        	o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
            o.srcPos = ComputeScreenPos(o.pos);  
            return o;    
        }  
        
        vec4 main(v2f _iParam);
        
        fixed4 frag(v2f _iParam) : COLOR0 {  
			return main(_iParam);
        }  
        
		vec4 main(v2f _iParam) {
		   	vec2 p = (2.0*gl_FragCoord.xy-iResolution.xy)/iResolution.y;
		    float tau = 3.1415926535*2.0;
		    float a = atan(p.x,p.y);
		    float r = length(p)*0.75;
		    vec2 uv = vec2(a/tau,r);

对于其中的uv.x的值域是(-1/2,1/2),这个考虑起来不是很麻烦, atan2(p.x,p.y)的值域是(-π,π),也就是整个360°都是其值域,( atan(p.x/p.y)的值域是(-π/2,π/2)) 因此除以tau,所以得到值域为(-1/2,1/2)。
			
			//get the color
			float xCol = (uv.x - (iGlobalTime / 3.0)) * 3.0;
			xCol = sign(xCol)*fmod(xCol, 3.0);

解析里面说xCol的值域是(0,3),也没解释是为啥?我就自己琢磨啊,终于琢磨出来了,假如我们把float xCol = (uv.x - (iGlobalTime / 3.0)) * 3.0; 这简化float xCol = uv.x - iGlobalTime,我们将时间设为x,那么我们画个图(1)

sign()函数的定义是对于x小于0则为-1,大于0则为1,等于0则为0,相当于取了x的符号,那么又可以得出以下的图(2)

在这里我们可以看出来在没有求余之前的xCol的值域,对于求余我一开始没有很好的认知,余数,当除数比被除数小的时候,直接取除数为余数,余数不可能比被除数大,因此我们可以得出值域为(0,3)
			vec3 horColour = vec3(0.25, 0.25, 0.25);
			
			if (xCol < 1.0) {
				horColour.r += 1.0 - xCol;
				horColour.g += xCol;
			} else if (xCol < 2.0) {
				xCol -= 1.0;
				horColour.g += 1.0 - xCol;
				horColour.b += xCol;
			} else {
				xCol -= 2.0;
				horColour.b += 1.0 - xCol;
				horColour.r += xCol;
			}
 
			// draw color beam
			uv = (2.0 * uv) - 1.0;
			float beamWidth = (0.7+0.5*cos(uv.x*10.0*tau*0.15*clamp(floor(5.0 + 10.0*cos(iGlobalTime)), 0.0, 10.0))) * abs(1.0 / (30.0 * uv.y));
			vec3 horBeam = vec3(beamWidth,beamWidth,beamWidth);
			vec4 gl_FragColor = vec4((( horBeam)* horColour ), 1.0);
			
			return gl_FragColor;
		}
 
    ENDCG    
    SubShader {    
        Pass {    
            CGPROGRAM    
            #pragma vertex vert    
            #pragma fragment frag    
            #pragma fragmentoption ARB_precision_hint_fastest     
            ENDCG    
        }    
    }     
    FallBack Off    
}

图1在这里插入图片描述
图2在这里插入图片描述


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值