Блин, фигово. Хотел этот шейдер переделать в Compute Shader чтобы тайлинг текстуры делать не с помощью материала, а затайленную текстуру хранить в переменной и дальше с ней работать. Есть какая-нибудь альтернатива методам DDX(Y)?
Код
Shader "WangTiles/WangTiles"
{
Properties
{
_TilesTexture("TilesTexture", 2D) = "white" {}
_TileMappingTexture("TileMappingTexture", 2D) = "white" {}
_TileMappingScale("TileMappingScale", Vector) = (0,0,0,0)
_TileScale("TileScale", Vector) = (0,0,0,0)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
#pragma target 3.0
#pragma glsl
sampler2D _TilesTexture, _TileMappingTexture;
float2 _TileMappingScale, _TileScale;
struct Input
{
float2 uv_TilesTexture;
};
float2 mod(float2 a, float2 b)
{
return floor(frac(a/b)*b);
}
void surf (Input IN, inout SurfaceOutput o)
{
float2 uv = IN.uv_TilesTexture.xy;
float2 mappingAddress = uv * _TileMappingScale;
float2 tileScaledTex = uv * _TileMappingScale * (1.0/_TileScale);
float4 whichTile = tex2D(_TileMappingTexture, mod(mappingAddress, _TileMappingScale)/_TileMappingScale) * 255.0;
float4 result = tex2D(_TilesTexture, (whichTile.xy + frac(mappingAddress))/_TileScale, ddx(tileScaledTex), ddy(tileScaledTex));
o.Albedo = result.rgb;
o.Alpha = result.a;
}
ENDCG
}
FallBack "Diffuse"
}