71 lines
3.4 KiB
C
71 lines
3.4 KiB
C
#ifndef HMODEL_H
|
|
#define HMODEL_H
|
|
|
|
#include "common.h"
|
|
|
|
uniform samplerCUBE env_s0 ;
|
|
uniform samplerCUBE env_s1 ;
|
|
uniform samplerCUBE sky_s0 ;
|
|
uniform samplerCUBE sky_s1 ;
|
|
uniform half4 env_color ; // color.w = lerp factor
|
|
uniform half3x4 m_v2w ;
|
|
|
|
void hmodel (out half3 hdiffuse, out half3 hspecular, half m, half h, half s, float3 point, half3 normal)
|
|
{
|
|
// hscale - something like diffuse reflection
|
|
half3 nw = mul (m_v2w,normal);
|
|
half hscale = h; //. * (.5h + .5h*nw.y);
|
|
#ifdef USE_GAMMA_22
|
|
hscale = (hscale*hscale); // make it more linear
|
|
#endif
|
|
|
|
// reflection vector
|
|
float3 v2pointL = normalize (point);
|
|
half3 v2point = mul (m_v2w,v2pointL);
|
|
half3 vreflect = reflect (v2point,nw);
|
|
half hspec = .5h+.5h*dot (vreflect,v2point);
|
|
|
|
// material
|
|
half4 light = tex3D (s_material, half3(hscale, hspec, m) ); // sample material
|
|
|
|
// diffuse color
|
|
half3 e0d = texCUBE (env_s0,nw);
|
|
half3 e1d = texCUBE (env_s1,nw);
|
|
half3 env_d = env_color.xyz*lerp(e0d,e1d,env_color.w) ;
|
|
env_d*=env_d; // contrast
|
|
hdiffuse = env_d * light.xyz + L_ambient.rgb;
|
|
|
|
// specular color
|
|
vreflect.y = vreflect.y*2-1; // fake remapping
|
|
half3 e0s = texCUBE (env_s0,vreflect);
|
|
half3 e1s = texCUBE (env_s1,vreflect);
|
|
half3 env_s = env_color.xyz*lerp(e0s,e1s,env_color.w) ;
|
|
env_s*=env_s; // contrast
|
|
hspecular = env_s*light.w*s; //*h*m*s ; //env_s *light.w * s;
|
|
}
|
|
|
|
void hmodel_table (out half3 hdiffuse, out half3 hspecular, half m, half h, half s, half3 point, half3 normal)
|
|
{
|
|
// hscale - something like diffuse reflection
|
|
half hscale = h;
|
|
|
|
// reflection vector
|
|
half3 v2point = normalize (point);
|
|
half3 vreflect= reflect (v2point,normal);
|
|
half hspec = .5h+.5h*dot (vreflect,v2point);
|
|
|
|
// material
|
|
half4 light = tex3D (s_material, half3(hscale, hspec, m) ); // sample material
|
|
|
|
// diffuse color
|
|
half3 env_d = texCUBE (env_s0,normal);
|
|
|
|
// specular color
|
|
half3 env_s = texCUBE (env_s0,vreflect);
|
|
|
|
//
|
|
hdiffuse = env_d *light.xyz + L_ambient.rgb ;
|
|
hspecular = env_s *light.w * s ;
|
|
}
|
|
|
|
#endif
|