全面的深入的掌握三维的理论,光栅化理论。
你将收获
适用人群
课程介绍
课程目录
大家都在学
正在加载中...
同学笔记
2020-08-10 11:48:53
立即学习:3D图形理论-5-固定渲染管线实现-张立铜的在线视频教程-CSDN程序员研修院
固定管线:
float3 piplineTransform(float3 pos) { float4 world(pos.x,pos.y,pos.z,1); //三维坐标经过mvp变换算出屏幕坐标,openGL是使用矩阵左乘 float4 screen = _matProj * _matView * _matModel * world; if (screen.w == 0.0f) { return false; } //divied by w 标准化设备坐标,-1~1 screen.x /= screen.w; screen.y /= screen.w; screen.z /= screen.w; // map to range 0 - 1 screen.x = screen.x * 0.5f + 0.5f; screen.y = screen.y * 0.5f + 0.5f; screen.z = screen.z * 0.5f + 0.5f; // map to viewport screen.x = screen.x * _viewPort.x; screen.y = _height - screen.y * _viewPort.y; return float3(screen.x, screen.y, screen.z); }
输入:顶点数据(Vertex Data)
->模型矩阵
->视图矩阵
->投影矩阵
->视口转化:把数据画到窗口
输入一个三维坐标,经过以上变换之后输出一个二维屏幕上的坐标,把数据显示到二维屏幕上
2020-05-28 22:57:27
投影矩阵生成参数:
perspective(float fovy, float aspect, float zNear, float zFar)函数可以生成一个投影矩阵
fovy:指定视景体的视野的角度,以度数为单位,y轴的上下方向
aspect:视景体的宽高比(aspect应该与窗口的宽高比大小相同)
zNear:
指定观察者到视景体的最近的裁剪面的距离(必须为正数)
zFar:
与上面的参数相反,这个指定观察者到视景体的最远的裁剪面的距离(必须为正数)
投影矩阵可以控制视景体内的模型被渲染,视景体外的会被裁减掉:
如何判断一个点在一个长方体内部呢?
观察矩阵生成参数:
生成观察矩阵函数:
void lookat(float3 const & eye,float3 const & lookAtPos,float3 const & up);eye:眼睛位置
lookAtPos:往哪一点看
up:向上的方向
摄像机坐标系三个坐标轴:(以观察的方向为z轴方向)
float3 z = normalize(lookAtPos - eye); //两个点生成一条射线,
float3 y = normalize(up);//向上的方向
float3 x = normalize(cross(f, u));
y= cross(s, f);tmat4x4<T> res(1);
res[0][0] = x.x;
res[1][0] = x.y;
res[2][0] = x.z;
res[0][1] = y.x;
res[1][1] = y.y;
res[2][1] = y.z;
res[0][2] = -z.x;
res[1][2] = -z.y;
res[2][2] = -z.z;
res[3][0] = -dot(x, eye);//|x|*|eye|*cos(夹角),x是单位向量模长为1,|eye|*cos(夹角)=邻边长度,也就是摄像机x轴长度
res[3][1] = -dot(y, eye);
res[3][2] = dot(z, eye);观察矩阵(也叫视图矩阵):相当于把摄像机放在一个位置,摄像机在不同的位置看到的范围不一样。然后把整个世界坐标系内的模型坐标转换到摄像机坐标系下。
没有更多了