Question by
jamie_ready · Apr 20, 2018 at 11:01 PM ·
shadersimage effects
Black Hole Image Effect warping objects in front of the black hole. How can I fix this?
I followed this tutorial and while it's amazing, leaves me wondering what to do about objects that pass in front of the black hole.
<] Camera ------------(Non Distorted Object)------------(Black Hole)----------(Distorted Object / Background)
I'm new to writing shaders specifically and have no idea where to begin with calculating what objects are in front of it, and if so, to not apply the effect.
Any help is much appreciated, thank you!
Black Hole Image Effect on camera
//public
public Shader shader;
public Transform blackHole;
public float ratio; //aspect ratio of the screen
public float radius; //size of black hole
//private
Camera cam;
Material _material; //will be procedurally generated
Material material {
get {
if (_material == null) {
_material = new Material(shader);
_material.hideFlags = HideFlags.HideAndDontSave;
}
return _material;
}
}
void OnEnable()
{
cam = GetComponent<Camera>();
ratio = 1f / cam.aspect;
}
void OnDisable()
{
if (_material) {
DestroyImmediate(_material);
}
}
Vector3 wtsp;
Vector2 pos;
private void OnRenderImage(RenderTexture source, RenderTexture destination)
{
if (shader && material && blackHole) {
wtsp = cam.WorldToScreenPoint(blackHole.position);
if (wtsp.z > 0) {
pos = new Vector2(wtsp.x / cam.pixelWidth, wtsp.y / cam.pixelHeight);
//apply shader parameters
_material.SetVector("_Position", pos);
_material.SetFloat("_Ratio", ratio);
_material.SetFloat("_Rad", radius);
_material.SetFloat("_Distance", Vector3.Distance(blackHole.position, transform.position));
//apply the shader to the image
Graphics.Blit(source, destination, material);
}
}
}
Shader
Shader "Hidden/BlackHoleShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform float2 _Position;
uniform float _Rad;
uniform float _Ratio;
uniform float _Distance;
struct v2f {
float4 pos : POSITION;
float2 uv : TEXCOORD0;
};
v2f vert (appdata_img v){
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.texcoord;
return o;
}
fixed4 frag (v2f i) : COLOR {
float2 offset = i.uv - _Position;
float2 ratio = {_Ratio, 1};
float rad = length(offset/ratio);
float deformation = 1 / pow(rad * pow(_Distance, 0.5), 2) * _Rad * 0.1;
offset = offset * (1 - deformation);
offset += _Position;
half4 res = tex2D(_MainTex, offset);
if (rad * _Distance < _Rad) {
res = half4( 0, 0, 0, 1 );
}
return res;
}
ENDCG
}
}
}
Comment
Your answer
Follow this Question
Related Questions
Transparency of a specific area 0 Answers
Can an image effect work on vertices displaced by other shaders? 0 Answers
Distortion Shader for a Black Hole 0 Answers
Purpose of shaders? 2 Answers
Survival instinct, hunter sense effect 0 Answers