SuperNess wrote:interesting, thanks.
so any idea how am I supposed to use lighting with billboards?
This is my implementation of billboard lighting for JonhJ's PagedGeometry.
Vertex and fragment shader params:
Code: Select all
vertex_program ImpostorAlphaVP cg
{
source impostors.cg
entry_point impostorAlpha_vp
profiles vs_1_1 arbvp1
default_params
{
param_named_auto worldViewProj worldviewproj_matrix
param_named_auto lightPositionObj light_position_object_space 0
param_named_auto normal view_direction
param_named_auto tangent view_side_vector
param_named_auto binormal view_up_vector
}
}
fragment_program ImpostorAlphaFP cg
{
source impostors.cg
entry_point impostorAlpha_fp
profiles ps_2_0 arbfp1
default_params
{
param_named_auto ambientColor ambient_light_colour
param_named_auto diffuseColor light_diffuse_colour 0
}
}
Vertex and fragment programs:
Code: Select all
// Expand a range-compressed vector
float4 expand(float4 v)
{
return v * 2 - 1;
}
// ------------------------- IMPOSTOR -------------------------
// ------------------------- VERTEX SHADER -------------------------
void impostorAlpha_vp (
float4 iPosition: POSITION,
float3 iNormal : NORMAL,
float4 iColor : COLOR,
float2 iUV : TEXCOORD0,
uniform float4 lightPositionObj,
uniform float4 cameraPositionObj,
uniform float4x4 worldViewProj,
uniform float3 normal,
uniform float3 tangent,
uniform float3 binormal,
uniform float uScroll,
uniform float vScroll,
uniform float4 preRotatedQuad[4],
out float4 oPosition : POSITION,
out float2 oUv : TEXCOORD0,
out float3 oTSLightDir : TEXCOORD1,
out float4 oColor : COLOR,
out float oFog : FOG
)
{
float4 vCenter = float4(iPosition.x, iPosition.y, iPosition.z, 1.0f);
float4 vScale = float4(iNormal.x, iNormal.y, iNormal.x, 1.0f);
float4 positionSprite = vCenter + (preRotatedQuad[iNormal.z] * vScale);
oPosition = mul(worldViewProj, positionSprite );
float3 lightDir = normalize(lightPositionObj.xyz - positionSprite .xyz * lightPositionObj.w);
float3x3 rotation = float3x3(tangent, binormal, -normal);
oTSLightDir = mul(rotation, lightDir);
oColor = iColor;
oUv = iUV;
oUv.x += uScroll;
oUv.y += vScroll;
oFog = oPosition.z;
}
// ------------------------- FRAGMENT SHADER -------------------------
void impostorAlpha_fp (
float2 iUV : TEXCOORD0,
float3 iTSLightDir : TEXCOORD1,
float4 iColor : COLOR,
uniform float4 ambientColor,
uniform float4 diffuseColor,
uniform sampler2D diffuseTexture : register(s0),
uniform sampler2D normalTexture : register(s1),
out float4 oColor : COLOR
)
{
float4 diffuseTex = tex2D(diffuseTexture, iUV.xy);
float4 normalTex = normalize(expand(tex2D(normalTexture, iUV.xy)));
float diffuseFactor = saturate(dot(normalTex.xyz, iTSLightDir));
oColor.rgb = diffuseTex.rgb * (diffuseColor.rgb * diffuseFactor * iColor.rgb + ambientColor.rgb);
oColor.a = diffuseTex.a;
}

- Diffuse texture

- Normalmap Texture

- The Result