ShaderToy使用GLSL代码,UnityLab使用HLSL和CG代码主要在于函数和内置变量的不同。
可参考:HLSL内置函数,及HLSL与GLSL的对应函数_eloudy的专栏-CSDN博客_glsl hlsl
Shadertoy搬运-基本方法_suixinger_lmh的随笔-CSDN博客
Shader模板
// iChannelResolution[i]系列shadertoy参数需改为iChannelResolutioni形式表达,例如iChannelResolution[0]改为iChannelResolution0
Shader "ShaderToyTemplate"{
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
#define vec2 float2
#define vec3 float3
#define vec4 float4
#define mat2 float2x2
#define mat3 float3x3
#define mat4 float4x4
#define iTime _Time.y//
#define iGlobalTime _Time.y
#define mod fmod
#define mix lerp
#define fract frac
#define atan atan2
#define texture tex2D//
#define texture2D tex2D
#define iResolution _ScreenParams
#define gl_FragCoord ((_iParam.scrPos.xy/_iParam.scrPos.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 scrPos : TEXCOORD0;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.scrPos = ComputeScreenPos(o.pos);
return o;
}
vec4 main(vec2 fragCoord);
fixed4 frag(v2f _iParam) : COLOR0{
vec2 fragCoord = gl_FragCoord;
return main(gl_FragCoord);
}
vec4 main(vec2 fragCoord) {
return vec4(1, 1, 1, 1);
}
ENDCG
SubShader{
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
ENDCG
}
}
FallBack Off
}
【可选】C#模板(iMouse参数的设置)挂在材质所在物体身上
using UnityEngine;
using System.Collections;
public class ShaderToyHelper : MonoBehaviour
{
private Material _material = null;
private bool _isDragging = false;
// Use this for initialization
void Start()
{
Renderer render = GetComponent<Renderer>();
if (render != null)
{
_material = render.material;
}
_isDragging = false;
}
// Update is called once per frame
void Update()
{
Vector3 mousePosition = Vector3.zero;
if (_isDragging)
{
mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 1.0f);
}
else
{
mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0.0f);
}
if (_material != null)
{
_material.SetVector("iMouse", mousePosition);
}
}
void OnMouseDown()
{
_isDragging = true;
}
void OnMouseUp()
{
_isDragging = false;
}
}