您的位置:首页 > 其它

根据模型顶点坐标计算法线

2012-04-01 15:34 543 查看
虽然读取了3ds文件,但是3ds文件里并不包含顶点法线。为了计算光照,我们需要手工计算法线。过程如下:

三个不共线点构成一个三角形:

View Code

#ifndef myVector_h__
#define myVector_h__

namespace MY_MATH
{
class Vector3
{
public:
Vector3():x(0),y(0),z(0){}
Vector3(float _x, float _y, float _z):x(_x),y(_y),z(_z){}
float x;
float y;
float z;
};

Vector3 Vector3_Sub(Vector3 src,Vector3 dest)
{
return Vector3(src.x - dest.x,src.y - dest.y,src.z - dest.z);
}

void Vector3_norm(float& x, float& y, float& z)
{
float tmp = sqrtf(x*x+y*y+z*z);
x = x/tmp;y = y/tmp; z=z/tmp;
}

void Vector3_norm(Vector3& vec)
{
float tmp = sqrtf(vec.x*vec.x + vec.y*vec.y + vec.z*vec.z);
vec.x = vec.x/tmp;
vec.y = vec.y/tmp;
vec.z = vec.z/tmp;
}

Vector3 Vector3_cross(Vector3& v1, Vector3& v2)
{
return Vector3(v1.y*v2.z - v1.z*v2.y, v1.z*v2.x - v1.x*v2.z, v1.x*v2.y - v1.y*v2.x);
}
}

#endif // myVector_h__




这个就是根据我们计算出来的法线进行基本光照渲染出来的截图,HLSL版本shader如下:

cbuffer mybuff
{
uniform row_major float4x4 world_matrix;
uniform row_major float4x4 view_matrix;
uniform row_major float4x4 proj_matrix;
uniform float4 light_pos;
};

struct VS_INPUT
{
float4 Position : POSITION;
float3 Norm    : NORMAL0;
float2 Tex      : TEXCOORD0;
};

struct VS_OUTPUT
{
float4 Position : SV_POSITION;
float3 lt : TEXCOORD0;
float3 norm : TEXCOORD1;
};

VS_OUTPUT VS_MAIN(VS_INPUT In)
{
VS_OUTPUT Output;
float4x4 tmp = mul(world_matrix,view_matrix);
tmp = mul(tmp,proj_matrix);
Output.Position = mul(In.Position, tmp);

Output.lt = normalize(light_pos - In.Position);
Output.norm = normalize(mul(In.Norm, world_matrix));

return Output;
}

float4 PS_MAIN(VS_OUTPUT In) : SV_Target
{
float4 diff = {1.0,1.0,1.0,1.0};
float4 ambient = {0.1,0.1,0.1,1.0};
return ambient + diff*saturate(dot(In.lt,In.norm));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: