文章目錄
- 前言
- 一、Shader部分
- 1、申明水漸變圖紋理和采樣器
- 2、在片元著色器,進行紋理采樣,并且輸出
- 二、C#腳本部分
- 1、我們新建一個C#腳本
- 2、我們定義兩個變量
- 3、在Start內,new 一個Texture2D(寬,高)
- 4、定義一個Color[寬*高]的顏色數組
- 5、使用循環,依次給顏色數組,填入傳入的漸變色
- 6、 使用顏色數組,生成紋理
- 7、把該紋理傳入Shader對應的材質球紋理中
- 三、最終代碼
- C#腳本
前言
在之前的文章中,我們已經完成了URP下水體的所有效果。
- Unity中URP實現水體(整理優化)
但是,水的顏色用一個變量來控制讓水深淺顏色漸變變化,太過于單調。
所以,我們可以使用紋理采樣的方式來替換水的顏色。
這個紋理可以由C#來動態生成漸變圖,以達到隨機的效果。
一、Shader部分
因為,該紋理是用C#代碼傳入。所以,屬性面板可以不用定義該紋理。
在hlsl中,申明紋理和采樣器即可
1、申明水漸變圖紋理和采樣器
TEXTURE2D(_WaterColorTex);
SAMPLER(sampler_WaterColorTex);
2、在片元著色器,進行紋理采樣,并且輸出
float4 waterTex = SAMPLE_TEXTURE2D(_WaterColorTex,sampler_WaterColorTex,i.uv.xy);
return waterTex;
二、C#腳本部分
1、我們新建一個C#腳本
2、我們定義兩個變量
- 漸變色傳入(這是Unity的API)
public Gradient waterGradient;
- 定義需要動態生成的紋理
public Texture2D rampTexture;
3、在Start內,new 一個Texture2D(寬,高)
rampTexture = new Texture2D(512, 256);
4、定義一個Color[寬*高]的顏色數組
Color[] colors = new Color[rampTexture.width * rampTexture.height];
5、使用循環,依次給顏色數組,填入傳入的漸變色
for (int i = 0;i < colors.Length;i++)
{
colors[i] = waterGradient.Evaluate((float)i/colors.Length);
}
6、 使用顏色數組,生成紋理
rampTexture.SetPixels(colors);
rampTexture.Apply();
7、把該紋理傳入Shader對應的材質球紋理中
this.GetComponent().material.SetTexture(“_WaterColorTex”,rampTexture);
三、最終代碼
C#腳本
using System;
using UnityEngine;
using Random = UnityEngine.Random;namespace Arts.Shader.URP.P4.P4_8
{public class WaterColor : MonoBehaviour{[Header("水體顏色漸變")]public Gradient waterGradient;public Texture2D rampTexture;//Start is called before the first frame updatevoid Start(){rampTexture = new Texture2D(512, 256);Color[] colors = new Color[rampTexture.width * rampTexture.height];for (int i = 0;i < colors.Length;i++){colors[i] = waterGradient.Evaluate((float)i/colors.Length);}rampTexture.SetPixels(colors);rampTexture.Apply();this.GetComponent<MeshRenderer>().material.SetTexture("_WaterColorTex",rampTexture);}}
}