根据模型顶点坐标计算法线
2012-04-01 15:34
543 查看
虽然读取了3ds文件,但是3ds文件里并不包含顶点法线。为了计算光照,我们需要手工计算法线。过程如下:
三个不共线点构成一个三角形:
View Code
这个就是根据我们计算出来的法线进行基本光照渲染出来的截图,HLSL版本shader如下:
三个不共线点构成一个三角形:
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)); }
相关文章推荐
- 根据模型的顶点位置坐标和纹理坐标计算顶点的法线、切线和副法线
- 根据模型的顶点位置坐标和纹理坐标计算顶点的法线、切线和副法线
- 根据凸多边形顶点坐标来计算面积算法与实现
- 简单的顶点着色(根据模型坐标和世界坐标位置)
- [SVG] 根据SVG椭圆弧路径参数计算中心点坐标、起始角度、结束角度的Javascript函数
- 计算OBB四个顶点的坐标
- Android-根据两点间经纬度坐标,计算两点间距离
- 百度地图API二:根据标注点坐标范围计算显示缩放级别zoom自适应显示地图
- 【OpenCV】仿射变换 根据眼睛坐标进行人脸对齐 计算变换后对应坐标
- 根据某点直角坐标(x,y)计算该点与原点连线跟y轴夹角
- 根据经纬度坐标计算距离
- 根据两点经纬坐标计算两点间的距离[JAVA](转载)
- C++设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右下角两个点的坐标,根据坐标计算矩形的面积
- 根据地球上两个坐标点,计算出距离
- 根据GPS经纬度坐标计算两点的距离算法
- ARCore中根据屏幕坐标计算射线的算法
- PHP根据两个经纬度坐标计算距离
- java根据经纬度坐标计算两点的距离算法
- java根据GPS经纬度坐标计算两点的距离算法