- Home /
Question by
timcommandeur · Dec 26, 2013 at 12:43 PM ·
shadermeshlightingvoxelpointlight
Custom shader light blending
I'm working on a shader for my voxel engine. The chunks have a mesh each and they all use this shader. The problem is that I want to implement point light support but I get a strange effect.
It somehow doesnt seem to blend well with the environmental lighting. The points where the light just cuts off are the parts where the chunk meshes end.
Does anyone know what could be the cause of this. Here's he code of my shader:
Shader "VoxelShader 3" {
Properties {
_Color ("Main Color", COLOR) = (1,1,1,1)
}
SubShader {
Pass {
Fog { Mode Off }
Tags { "LightMode" = "ForwardBase" }
CGPROGRAM
// Upgrade NOTE: excluded shader from DX11 and Xbox360; has structs without semantics (struct appdata members vertex,color)
#pragma exclude_renderers d3d11 xbox360
// Upgrade NOTE: excluded shader from OpenGL ES 2.0 because it does not contain a surface program or both vertex and fragment programs.
#pragma exclude_renderers gles
// Upgrade NOTE: excluded shader from Xbox360; has structs without semantics (struct appdata members vertex,color)
#pragma exclude_renderers xbox360
#pragma vertex vert
#pragma fragment frag
// User defined variables.
uniform float4 _Color;
// Unity defined variables.
uniform float4 _LightColor0;
// Vertex input: position, color, normal
struct vertexInput {
float4 vertex : POSITION;
float4 color : COLOR;
float3 normal : NORMAL;
};
struct vertexOutput {
float4 pos : POSITION;
float4 color : COLOR;
};
// Vertex function.
vertexOutput vert(vertexInput v) {
vertexOutput o;
float3 normalDirection = normalize(mul(float4(v.normal, 0.0), _World2Object).xyz);
float3 lightDirection;
float atten;
if (_WorldSpaceLightPos0.w == 0.0) {
atten = 1.0;
lightDirection = normalize(_WorldSpaceLightPos0.xyz);
}
else {
float3 posWorld = float3(mul(_Object2World, v.vertex));
float3 vertexToLightSource = float3(_WorldSpaceLightPos0.xyz - posWorld.xyz);
float3 distance = length(vertexToLightSource);
atten = 1 / distance;
atten = 0.5;
lightDirection = normalize(vertexToLightSource);
}
float3 diffuseReflection = atten * _LightColor0.xyz * max(0.0, dot(normalDirection, lightDirection));
float3 finalLight = diffuseReflection + UNITY_LIGHTMODEL_AMBIENT.xyz;
o.color = float4(finalLight * v.color * 0.7, 1.0);//v.color;
o.pos = mul( UNITY_MATRIX_MVP, v.vertex );
return o;
}
// Fragment function.
float4 frag(vertexOutput i) : COLOR {
return i.color;
}
ENDCG
}
Pass {
Tags { "LightMode" = "ForwardAdd" }
Blend One One
CGPROGRAM
// Upgrade NOTE: excluded shader from DX11 and Xbox360; has structs without semantics (struct appdata members vertex,color)
#pragma exclude_renderers d3d11 xbox360
// Upgrade NOTE: excluded shader from OpenGL ES 2.0 because it does not contain a surface program or both vertex and fragment programs.
#pragma exclude_renderers gles
// Upgrade NOTE: excluded shader from Xbox360; has structs without semantics (struct appdata members vertex,color)
#pragma exclude_renderers xbox360
#pragma vertex vert
#pragma fragment frag
// User defined variables.
uniform float4 _Color;
// Unity defined variables.
uniform float4 _LightColor0;
// Vertex input: position, color, normal
struct vertexInput {
float4 vertex : POSITION;
float4 color : COLOR;
float3 normal : NORMAL;
};
struct vertexOutput {
float4 pos : POSITION;
float4 color : COLOR;
};
// Vertex function.
vertexOutput vert(vertexInput v) {
vertexOutput o;
float3 normalDirection = normalize(mul(float4(v.normal, 0.0), _World2Object).xyz);
float3 lightDirection;
float atten;
if (_WorldSpaceLightPos0.w == 0.0) {
atten = 1.0;
lightDirection = normalize(_WorldSpaceLightPos0.xyz);
}
else {
float3 posWorld = float3(mul(_Object2World, v.vertex));
float3 vertexToLightSource = float3(_WorldSpaceLightPos0.xyz - posWorld.xyz);
float3 distance = length(vertexToLightSource);
atten = 1 / distance;
atten = 0.5;
lightDirection = normalize(vertexToLightSource);
}
float3 diffuseReflection = atten * _LightColor0.xyz * max(0.0, dot(normalDirection, lightDirection));
float3 finalLight = diffuseReflection;
o.color = float4(finalLight * v.color * 0.7, 1.0);//v.color;
o.pos = mul( UNITY_MATRIX_MVP, v.vertex );
return o;
}
// Fragment function.
float4 frag(vertexOutput i) : COLOR {
return i.color;
}
ENDCG
}
}
}
pointlight.png
(58.2 kB)
Comment