用jsp做網(wǎng)站的難點(diǎn)云優(yōu)化
文章目錄
- 前言
- 一、制作思路
- 法1:使用紋理采樣后,修改重鋪效果
- 法2:計(jì)算實(shí)現(xiàn)
- 二、粗略計(jì)算實(shí)現(xiàn)棋盤格效果
- 1、使 uv.x < 0.5 區(qū)域 = 0 。反之, = 0.5
- 2、使 uv.y < 0.5 區(qū)域 = 0 。反之, = 0.5
- 3、使兩個(gè)顏色相加
- 4、取小數(shù)部分
- 5、乘以2
- 三、去除 if 條件語句后的精簡方法
- 1、我們在圖形計(jì)算器中看一下
- 2、向下取整
- 3、乘以2
- 4、我們在屬性面板使用參數(shù)控制棋盤格重復(fù)度
- 5、使棋盤格Shader適用于Cube
- 6、使棋盤格顏色從下到上漸變
- 7、我們可以給棋盤格Cube加一個(gè)父對象,使縮放時(shí),不會Cube中心為調(diào)整的位置(按需使用)
- 8、可以在屬性面板加一個(gè)顏色來調(diào)整棋盤格顏色(按需使用)
- 四、測試代碼
前言
我們展示我們Shader效果,一般放于棋盤格中來展示。我們在這篇文章中,制作棋盤格效果。
一、制作思路
法1:使用紋理采樣后,修改重鋪效果
法2:計(jì)算實(shí)現(xiàn)
我們在這篇文章中,主要計(jì)算實(shí)現(xiàn)該效果
二、粗略計(jì)算實(shí)現(xiàn)棋盤格效果
1、使 uv.x < 0.5 區(qū)域 = 0 。反之, = 0.5
if(i.uv.x < 0.5)
col1 = 0;
else
col1 = 0.5;
2、使 uv.y < 0.5 區(qū)域 = 0 。反之, = 0.5
if(i.uv.y < 0.5)
col2 = 0;
else
col2 = 0.5;
3、使兩個(gè)顏色相加
4、取小數(shù)部分
frac(col1 + col2)
5、乘以2
return 2 * frac(col1 + col2);
三、去除 if 條件語句后的精簡方法
1、我們在圖形計(jì)算器中看一下
- 當(dāng) y = x 下取整后,把 x 軸縮小為原來的二分之一,y軸也縮小為原來的二分之一
- 即可在(0,1)之間實(shí)現(xiàn) 0.5以下 = 0,0.5以上 = 0.5的效果。
float2 uv = floor(i.uv * 2) * 0.5;
return uv.x + uv.y;
2、向下取整
float col = frac(uv.x +uv.y);
3、乘以2
float col = frac(uv.x +uv.y) * 2;
4、我們在屬性面板使用參數(shù)控制棋盤格重復(fù)度
- 屬性面板
_Repeat(“Repeat”,Float) = 0
- CBUFFER 常量緩存區(qū)
CBUFFER_START(UnityPerMaterial)
float _Repeat;
CBUFFER_END
- 在 頂點(diǎn)著色器 對 uv 進(jìn)行傳值時(shí),使乘以_Repeat以達(dá)到修改重復(fù)度的目的
o.uv = v.uv * _Repeat;
5、使棋盤格Shader適用于Cube
因?yàn)槲覀兊钠灞P格一般為一個(gè)Cube。那么要看見內(nèi)部的東西,則需要把面片的前面剔除
Cull Front
6、使棋盤格顏色從下到上漸變
因?yàn)?#xff0c;我們棋盤格的顏色單一且過曝,看著很不舒服。所以,我們給其加一個(gè)遮罩,讓其有點(diǎn)漸變的區(qū)分
- 漸變遮罩效果,我們肯定會想到使用模型的本地空間下的坐標(biāo)。所以,我們用本地空間下的y坐標(biāo)實(shí)現(xiàn)。
- 這里需要準(zhǔn)備在片元著色器中,傳入模型頂點(diǎn)本地空間下的坐標(biāo)
float mask = i.vertexOS.y;
return col + mask;
7、我們可以給棋盤格Cube加一個(gè)父對象,使縮放時(shí),不會Cube中心為調(diào)整的位置(按需使用)
8、可以在屬性面板加一個(gè)顏色來調(diào)整棋盤格顏色(按需使用)
col = col *_Color + mask;
四、測試代碼
我們需要適配BRP。所以,得加一個(gè)SubShader以同樣的邏輯實(shí)現(xiàn)該效果
Shader "MyShader/URP/P3_3_3"
{Properties{_Repeat("Repeat",Float) = 0_Color("Color",Color) = (1,1,1,1)}SubShader{Tags{"PenderPipeline"="UniversalPipeline""RenderType"="Opaque""Queue"="Geometry"}Cull FrontPass{HLSLPROGRAM#pragma vertex vert#pragma fragment frag#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"struct Attribute{float3 vertexOS : POSITION;float2 uv : TEXCOORD0;};struct Varying{float3 vertexOS : TEXCOORD0;float4 vertexCS : SV_POSITION;float2 uv : TEXCOORD1;};CBUFFER_START(UnityPerMaterial)float _Repeat;float4 _Color;CBUFFER_ENDVarying vert(Attribute v){Varying o;o.vertexOS = v.vertexOS;o.vertexCS = TransformObjectToHClip(v.vertexOS);o.uv = v.uv * _Repeat;return o;}half4 frag(Varying i) : SV_Target{/*half4 col1;half4 col2;if(i.uv.x < 0.5)col1 = 0;elsecol1 = 0.5;if(i.uv.y < 0.5)col2 = 0;elsecol2 = 0.5;*/half4 col;float2 uv = floor(i.uv * 2) * 0.5;col = frac(uv.x + uv.y) * 2;float mask = i.vertexOS.y;col = col * _Color + mask;return col;}ENDHLSL}}SubShader{Tags{"RenderType"="Opaque""Queue"="Geometry"}Cull FrontPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float3 vertexOS : POSITION;float2 uv : TEXCOORD0;};struct v2f{float3 vertexOS : TEXCOORD0;float4 vertexCS : SV_POSITION;float2 uv : TEXCOORD1;};float _Repeat;float4 _Color;v2f vert(appdata v){v2f o;o.vertexOS = v.vertexOS;o.vertexCS = UnityObjectToClipPos(v.vertexOS);o.uv = v.uv * _Repeat;return o;}half4 frag(v2f i) : SV_Target{half4 col;float2 uv = floor(i.uv * 2) * 0.5;col = frac(uv.x + uv.y) * 2;float mask = i.vertexOS.y;col = col * _Color + mask;return col;}ENDCG}}
}