Картинки к Liberty city:
S.gloss = Nu.x*Nu.x;
S.gloss = Nu.x*Nu.x;
// Build textures
{
// Build material(s)
{
// Surface
R_CHK (D3DXCreateVolumeTexture(HW.pDevice,TEX_material_LdotN,TEX_material_LdotH,4,1,0,
D3DFMT_A8L8,D3DPOOL_MANAGED,&t_material_surf));
t_material = Device.Resources->_CreateTexture(r2_material);
t_material->surface_set (t_material_surf);
// Fill it (addr: x=dot(L,N),y=dot(L,H))
D3DLOCKED_BOX R;
R_CHK (t_material_surf->LockBox (0,&R,0,0));
for (u32 slice=0; slice<4; slice++)
{
for (u32 y=0; y<TEX_material_LdotH; y++)
{
for (u32 x=0; x<TEX_material_LdotN; x++)
{
u16* p = (u16*) (LPBYTE (R.pBits) + slice*R.SlicePitch + y*R.RowPitch + x*2);
float ld = float(x) / float (TEX_material_LdotN-1);
float ls = float(y) / float (TEX_material_LdotH-1) + EPS_S;
ls *= powf(ld,1/32.f);
float fd,fs;
switch (slice)
{
case 0: { // looks like OrenNayar
fd = powf(ld,0.75f); // 0.75
fs = powf(ls,16.f)*.5f;
} break;
case 1: {// looks like Blinn
fd = powf(ld,0.90f); // 0.90
fs = powf(ls,24.f);
} break;
case 2: { // looks like Phong
fd = ld; // 1.0
fs = powf(ls*1.01f,128.f );
} break;
case 3: { // looks like Metal
float s0 = _abs (1-_abs (0.05f*_sin(33.f*ld)+ld-ls));
float s1 = _abs (1-_abs (0.05f*_cos(33.f*ld*ls)+ld-ls));
float s2 = _abs (1-_abs (ld-ls));
fd = ld; // 1.0
fs = powf (_max(_max(s0,s1),s2), 24.f);
fs *= powf (ld,1/7.f);
} break;
default:
fd = fs = 0;
}
s32 _d = clampr (iFloor (fd*255.5f), 0,255);
s32 _s = clampr (iFloor (fs*255.5f), 0,255);
if ((y==(TEX_material_LdotH-1)) && (x==(TEX_material_LdotN-1))) { _d = 255; _s=255; }
*p = u16 (_s*256 + _d);
}
}
}
R_CHK (t_material_surf->UnlockBox (0));
// #ifdef DEBUG
// R_CHK (D3DXSaveTextureToFile ("x:\\r2_material.dds",D3DXIFF_DDS,t_material_surf,0));
// #endif
}