- Home /
UV/texture displacement, "resolution"-artifacts
I'm trying to create a simple texture displacement effect by sampling my main texture at UV's that have been displaced by another texture.
I get artifacts between the pixels, please see below.
Without displacement:
With displacement:
The artifacts are the 1 (screen-)pixel lines between the "texels".
The shader is a simple unlit texture shader with some simple alterations to create the displacement effect:
Shader "Unlit/PixelDisplacement"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_DisplacementTex ("Texture", 2D) = "white" {}
_Amount ("Displace amount", Int) = 0
_DisplaceResolution ("Displace resolution", Int) = 32
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float2 uv2 : TEXCOORD1; //Use secondary UV to manage displacement texture offset / scale
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
//Displacement related:
sampler2D _DisplacementTex;
float4 _DisplacementTex_ST;
float _Amount;
int _DisplaceResolution;
v2f vert (appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
//https://forum.unity3d.com/threads/how-to-get-the-textures-tiling-and-offset-variables.181849/
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.uv2 = TRANSFORM_TEX(v.uv, _DisplacementTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
//Displacement coordinates:
fixed2 disp = tex2D(_DisplacementTex, i.uv2);
//Make sure displacement is in units of 1/32
float2 dispUV = fixed2(floor(disp.r * _Amount) / _DisplaceResolution, floor(disp.g * _Amount) / _DisplaceResolution);
// sample the texture at the offset coordinates
fixed4 col = tex2D(_MainTex, i.uv + dispUV);
//DEBUG:
// fixed2 tmp = i.uv + dispUV;
// col = fixed4(tmp.r, tmp.g, 0, 0);
return col;
}
ENDCG
}
}
}
Both textures use point filter, repeat, 32 pixels, truecolor. Have played around with all kinds of settings, the artifacts remain... The number of artifacts increase if the _Amount parameter is increased, but disappear for _Amount = 0 (as in 1st screenshot).
Any help would be much appreciated!
Your answer
Follow this Question
Related Questions
Can I feed ShaderGraph a UV map? 0 Answers
Shader, 2 Textures on one UV Map 1 Answer
Shading after vertex displacement 0 Answers
Displace and show normals in fragment shader 1 Answer
Blend between 2 lightmaps 0 Answers