- Home /
Why is shader/canvas background black?,When I run my shader code in unity the canvas has a black background?
I am sorry if this doesn't make sense but i am new in Unity/C#. I have created this with the help of a tutorial but whenever I hit play and the "Game" starts, my canvas has a black background. I am not sure if this is due to the shader or the canvas but any help would be appreciated. I am looking into bringing this canvas into another project and I don't want it to have a background since it will hide everything else.
Also, another question, could i possibly multiply this object in realtime? Thanks!
Shader "Custom/Mandelbulb" { Properties { baseColour ("Base Colour", Color) = (1,1,1,1) } SubShader { Pass{ Blend One OneMinusSrcAlpha, One One BlendOp Add CGPROGRAM #include "UnityCG.cginc" #pragma target 4.0 #pragma vertex vert_img #pragma fragment frag
#define black float4(0,0,0,0)
#define green float4(1,1,1,1)
#define white float4(1,1,1,1)
#define blue float4(0,0,0.7,1)
#define red float4(1,0,0,1)
#define orange float4(1, 0.64, 0,1)
#define yellow float4(1,1,0,1)
#define seethrough float4(0,0,0,0)
sampler2D _MainTex;
float3 _LightDir;
float _Exponent;
int _NumIterations;
int _NumRayMarchSteps;
float _Fov;
float4 baseColour;
inline float2
complex_mult(float2 c1, float2 c2)
{
return float2(c1.x * c2.x - c1.y * c2.y, c1.x * c2.y + c1.y * c2.x);
}
float2
recurse_complex_mult(float2 cin, int n)
{
int ii;
float2 cout = cin;
for(ii = 0; ii < n; ii++)
{
cout = complex_mult(cout, cin);
}
return cout;
}
inline void
cartesian_to_polar(float3 p, out float r, out float theta, out float psi)
{
r = length(p);
float r1 = p.x*p.x + p.y*p.y;
theta = atan(p.z / r1);
psi = atan(p.y / p.x);
}
inline void
polar_to_cartesian(float r, float theta, float psi, out float3 p)
{
p.x = r * cos(theta) * cos(psi);
p.y = r * cos(theta) * sin(psi);
p.z = r * sin(theta);
}
float
norm_to_unorm(float i)
{
return (i + 1) * 0.5;
}
float
de_sphere_surface(float3 p, float3 c, float r)
{
return abs(length(p - c) - r);
}
float
de_sphere_instances(float3 p)
{
p.xy = fmod( (p.xy), 1.0 ) - 0.5;
return length(p) - 0.2;
}
// distance estimator for the mandelbulb
float
de_mandelbulb(float3 c)
{
const float delta = 2;
bool converges = true; // unused
float divergenceIter = 0; // unused
float3 p = c;
float dr = 2.0, r = 1.0;
int ii;
for(ii = 0; ii < _NumIterations; ii++)
{
float theta, psi;
cartesian_to_polar(p, r, theta, psi);
dr = _Exponent * pow(r, _Exponent - 1) *dr + 1.0;
r = pow(r,_Exponent);
theta *= _Exponent;
psi *= _Exponent;
// convert to cartesian coordinates
polar_to_cartesian(r, theta, psi, p);
// add c
p += c;
// check for divergence
if (length(p) > delta) {
divergenceIter = ii;
converges = false;
break;
}
}
return log(r) * r / dr; // Greens formula
}
float
de_scene(float3 p)
{
float ds2 = de_mandelbulb(p);
return ds2;
}
float4
raymarch(float3 rayo, float3 rayd)
{
const float minimumDistance = 0.0001;
float3 p = rayo;
bool hit = false;
float distanceStepped = 0.0;
int steps;
for(steps = 0; steps < _NumRayMarchSteps; steps++)
{
float d = de_scene(p);
distanceStepped += d;
if (d < minimumDistance) {
hit = true;
break;
}
p += d * rayd;
}
float greyscale = 1 - (steps/(float)_NumRayMarchSteps);
return float4(greyscale, greyscale, greyscale, 1);
}
float3
get_eye_ray_through_pixel(float2 svpos)
{
float2 pixelNormPos = -1 + (2 * svpos.xy) / _ScreenParams;
// account for aspect ratio
pixelNormPos.x *= _ScreenParams.x / _ScreenParams.y;
pixelNormPos.y *= -1;
float zNearNorm = rcp( tan(_Fov/2) ); // tan(fov/2) = 1 / zn_norm
return normalize(float3(pixelNormPos, zNearNorm));
}
float4
frag(v2f_img i) : COLOR
{
float3 csRay = get_eye_ray_through_pixel(i.pos);
float3 wsRay = mul(unity_CameraToWorld, float4(csRay, 0));
return raymarch(_WorldSpaceCameraPos, wsRay) *baseColour;
}
ENDCG
}
} FallBack "Diffuse" } ,Sorry if this doesn't make sense, I am new to Unity/C#, after following a tutorial I have created a shader and it runs great. However, I would like it to not have a black background is this possible? The reason I want this is because I want to create a package of the project and include it in another one but when I do that and I run the two scenes together, the shader scene has a black background and hides everything else. Also, not as important, but could i possible multiply it in realtime? Below is my shader code if any help?
Shader "Custom/Mandelbulb" { Properties { baseColour ("Base Colour", Color) = (1,1,1,1) } SubShader { Pass{ Blend One OneMinusSrcAlpha, One One BlendOp Add CGPROGRAM #include "UnityCG.cginc" #pragma target 4.0 #pragma vertex vert_img #pragma fragment frag
#define black float4(0,0,0,0)
#define green float4(1,1,1,1)
#define white float4(1,1,1,1)
#define blue float4(0,0,0.7,1)
#define red float4(1,0,0,1)
#define orange float4(1, 0.64, 0,1)
#define yellow float4(1,1,0,1)
#define seethrough float4(0,0,0,0)
sampler2D _MainTex;
float3 _LightDir;
float _Exponent;
int _NumIterations;
int _NumRayMarchSteps;
float _Fov;
float4 baseColour;
inline float2
complex_mult(float2 c1, float2 c2)
{
return float2(c1.x * c2.x - c1.y * c2.y, c1.x * c2.y + c1.y * c2.x);
}
float2
recurse_complex_mult(float2 cin, int n)
{
int ii;
float2 cout = cin;
for(ii = 0; ii < n; ii++)
{
cout = complex_mult(cout, cin);
}
return cout;
}
inline void
cartesian_to_polar(float3 p, out float r, out float theta, out float psi)
{
r = length(p);
float r1 = p.x*p.x + p.y*p.y;
theta = atan(p.z / r1);
psi = atan(p.y / p.x);
}
inline void
polar_to_cartesian(float r, float theta, float psi, out float3 p)
{
p.x = r * cos(theta) * cos(psi);
p.y = r * cos(theta) * sin(psi);
p.z = r * sin(theta);
}
float
norm_to_unorm(float i)
{
return (i + 1) * 0.5;
}
float
de_sphere_surface(float3 p, float3 c, float r)
{
return abs(length(p - c) - r);
}
float
de_sphere_instances(float3 p)
{
p.xy = fmod( (p.xy), 1.0 ) - 0.5;
return length(p) - 0.2;
}
// distance estimator for the mandelbulb
float
de_mandelbulb(float3 c)
{
const float delta = 2;
bool converges = true; // unused
float divergenceIter = 0; // unused
float3 p = c;
float dr = 2.0, r = 1.0;
int ii;
for(ii = 0; ii < _NumIterations; ii++)
{
float theta, psi;
cartesian_to_polar(p, r, theta, psi);
dr = _Exponent * pow(r, _Exponent - 1) *dr + 1.0;
r = pow(r,_Exponent);
theta *= _Exponent;
psi *= _Exponent;
// convert to cartesian coordinates
polar_to_cartesian(r, theta, psi, p);
// add c
p += c;
// check for divergence
if (length(p) > delta) {
divergenceIter = ii;
converges = false;
break;
}
}
return log(r) * r / dr; // Greens formula
}
float
de_scene(float3 p)
{
float ds2 = de_mandelbulb(p);
return ds2;
}
float4
raymarch(float3 rayo, float3 rayd)
{
const float minimumDistance = 0.0001;
float3 p = rayo;
bool hit = false;
float distanceStepped = 0.0;
int steps;
for(steps = 0; steps < _NumRayMarchSteps; steps++)
{
float d = de_scene(p);
distanceStepped += d;
if (d < minimumDistance) {
hit = true;
break;
}
p += d * rayd;
}
float greyscale = 1 - (steps/(float)_NumRayMarchSteps);
return float4(greyscale, greyscale, greyscale, 1);
}
float3
get_eye_ray_through_pixel(float2 svpos)
{
float2 pixelNormPos = -1 + (2 * svpos.xy) / _ScreenParams;
// account for aspect ratio
pixelNormPos.x *= _ScreenParams.x / _ScreenParams.y;
pixelNormPos.y *= -1;
float zNearNorm = rcp( tan(_Fov/2) ); // tan(fov/2) = 1 / zn_norm
return normalize(float3(pixelNormPos, zNearNorm));
}
float4
frag(v2f_img i) : COLOR
{
float3 csRay = get_eye_ray_through_pixel(i.pos);
float3 wsRay = mul(unity_CameraToWorld, float4(csRay, 0));
return raymarch(_WorldSpaceCameraPos, wsRay) *baseColour;
}
ENDCG
}
} FallBack "Diffuse" }
Your answer
Follow this Question
Related Questions
Multiple Cars not working 1 Answer
Distribute terrain in zones 3 Answers
Need Mask Shader . 0 Answers
Multiple Vectors in shader/CGINC 0 Answers
Shader was doing good suddenly shows this error pls help 1 Answer