- Home /
Am I flipping this shader or is it a GPU problem?
Hi everyone, I have a custom shader here for water distortion but it flips my texture and I do not want it to. I'm not particularly skilled with the shader language as of yet, however I've heard that some GPUs have the tenancy to flip shaders based on where it thinks the origin point should be. I've tried different styles of rendering like with DX9 and 11, but nothing seemed to change. If I am in fact flipping the texture, could you show me where it is happening and how to fix it?
Shader "Custom/Distort" {
Properties {
_Refraction ("Refraction", Range (0.00, 100.0)) = 1.0
_DistortTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Transparent" "Queue"="Overlay" }
LOD 100
GrabPass
{
}
CGPROGRAM
#pragma surface surf NoLighting
#pragma vertex vert
fixed4 LightingNoLighting(SurfaceOutput s, fixed3 lightDir, fixed atten){
fixed4 c;
c.rgb = s.Albedo;
c.a = s.Alpha;
return c;
}
sampler2D _GrabTexture : register(s0);
sampler2D _DistortTex : register(s2);
float _Refraction;
float4 _GrabTexture_TexelSize;
struct Input {
float2 uv_DistortTex;
float3 color;
float3 worldRefl;
float4 screenPos;
INTERNAL_DATA
};
void vert (inout appdata_full v, out Input o) {
UNITY_INITIALIZE_OUTPUT(Input,o);
o.color = v.color;
}
void surf (Input IN, inout SurfaceOutput o) {
float3 distort = tex2D(_DistortTex, IN.uv_DistortTex) * float3(IN.color.r,IN.color.g,IN.color.b );
float2 offset = distort * _Refraction * _GrabTexture_TexelSize.xy;
IN.screenPos.xy = offset * IN.screenPos.z + IN.screenPos.xy;
float4 refrColor = tex2Dproj(_GrabTexture, IN.screenPos);
o.Alpha = refrColor.a;
o.Emission = refrColor.rgb;
}
ENDCG
}
}
Answer by tanoshimi · Mar 13, 2016 at 06:45 PM
I'd suggest you use UNITY_UV_STARTS_AT_TOP as described here: http://docs.unity3d.com/Manual/SL-PlatformDifferences.html
Thanks for the quick response! So upon reading this, I decided to try turning off Unity's antialiasing in the quality settings. This didn't change anything. So I tried adding antialiasing from the camera (which I was likely going to do at some point anyway,) and this fixed it! I don't know if this solves the problems across all GPUs running OpenGL and DX, and I can't figure out where to put the logic to flip it automatically in my code. Regardless it fixed what I was looking to fix for now, I'll read further into it if I find it doesn't work across different GPUs.
Your answer
Follow this Question
Related Questions
How to use mesh data in shader 0 Answers
Change shader properties during rungtime 1 Answer
How to detect DirectX 12? 0 Answers
Shader Programming Course 2 Answers
Is it possible to avoid writing to certain g-buffers? 1 Answer