更改了specular算法,但是有点问题。。。而且高光区有点象是VS算的一样,怀疑是NORMAL在VS算的原因。但fs没有GetLocalToWorld函数,需要尝试修复。

This commit is contained in:
hyzboy 2024-03-12 00:42:32 +08:00
parent 5347ac7091
commit f6e61e70ce
2 changed files with 32 additions and 16 deletions

View File

@ -39,13 +39,26 @@ Output
Code Code
{ {
mat3 GetNormalMatrix()
{
return mat3(camera.view*GetLocalToWorld());
}
vec3 GetNormal(mat3 normal_matrix,vec3 normal)
{
return normalize(normal_matrix*normal);
}
void main() void main()
{ {
mat3 normal_matrix=GetNormalMatrix();
Output.Normal =GetNormal(normal_matrix,Normal);
Output.Position =GetPosition3D();
HandoverMI(); HandoverMI();
Output.Normal=Normal; gl_Position =Output.Position;
Output.Position=GetPosition3D();
gl_Position=Output.Position;
} }
} }
@ -62,30 +75,33 @@ Code
MaterialInstance mi=GetMI(); MaterialInstance mi=GetMI();
//将法线归一化 //将法线归一化
vec3 world_normal =normalize(Input.Normal); // vec3 world_normal =normalize(Input.Normal);
//对世界坐标下的灯光方法归一化 //对世界坐标下的灯光方法归一化
vec3 world_light_direction =normalize(sun.direction.xyz); // vec3 world_light_direction =normalize(sun.direction.xyz);
//点乘法线和光照 //点乘法线和光照
vec3 diffuse =vec3(0.5)*dot(world_light_direction.xyz,world_normal)+vec3(0.5); float intensity=0.5*max(dot(Input.Normal,sun.direction.xyz),0.0)+0.5;
//直接光颜色 //直接光颜色
vec3 direct_color =diffuse*sun.color.rgb*mi.Color.rgb; vec3 direct_color =intensity*sun.color.rgb*mi.Color.rgb;
// #ifndef HAVE_SPECULAR // #ifndef HAVE_SPECULAR
// FragColor=vec4(direct_color,1.0); // FragColor=vec4(direct_color,1.0);
// #else // #else
//归一代视角方向
vec3 view_direction =normalize(camera.pos-Input.Position.xyz);
//世界坐标下的反射光方向 vec3 spec_color=vec3(0.0);
vec3 reflect_direction =normalize(reflect(-world_light_direction,world_normal));
//高光 if(intensity>0.0)
float specular =pow(clamp(dot(reflect_direction,view_direction),0.0,1.0),mi.Gloss); {
vec3 half_vector=normalize(sun.direction.xyz+normalize(Input.Position.xyz+camera.pos));
FragColor =vec4(direct_color+vec3(specular),1.0); float specular=max(dot(half_vector,Input.Normal),0.0);
spec_color=specular*pow(specular,mi.Gloss)*sun.color.rgb;
}
FragColor=vec4(direct_color+spec_color,1.0);
// #endif//HAVE_SPECULAR // #endif//HAVE_SPECULAR
} }
} }

View File

@ -21,7 +21,7 @@ static Color4f white_color(1,1,1,1);
static mtl::blinnphong::SunLight sun_light= static mtl::blinnphong::SunLight sun_light=
{ {
Vector4f(0,0,1,0), Vector4f(0,0,1,0),
Vector4f(1,0,0,1) Vector4f(1,0.95,0.9,1)
}; };
class TestApp:public SceneAppFramework class TestApp:public SceneAppFramework
@ -137,7 +137,7 @@ private:
//Sphere //Sphere
{ {
prim_sphere=CreateSphere(db,mi_sphere->GetVIL(),16); prim_sphere=CreateSphere(db,mi_sphere->GetVIL(),32);
} }
return(true); return(true);