本文根据教程:ogldev进行扩充学习,一步步从零开始,记录学习历程
一、插值
插值是3D渲染管线中非常重要的部分,其实就是光栅化程序执行的从顶点着色器传过来的变量。
光栅化程序对三角形三个顶点之间执行插值处理:对三个顶点之间的每个像素执行片元着色器(即fragment shader),片元着色器通过由顶点着色器传来的插值变量确定每个像素的颜色,光栅化程序将颜色存放到颜色缓冲区中。
- 两种常见的依赖这种插值的变量是三角形法线和纹理坐标,这两个变量都是在顶点着色器中计算完成后传到片元着色器。(法线在以后会用在灯光效果中,纹理坐标用来将纹理覆盖在我们的图形上,都在以后会学习到)
这里可以简单对插值理解为:在顶点着色器(Vertex Shader)中计算出来的一个值,并从顶点着色器中传出,在片元着色器(Fragment Shader)中接收到这个值并使用它
二、程序解释
2.1 opengl_math.h:
#ifndef __OPENGL_MATH_H
#define __OPENGL_MATH_H
#include <math.h>
#include <string.h>
#define PI (3.14159265358979323846)
#define PI_DIV_180 (0.017453292519943296)
#define INV_PI_DIV_180 (57.2957795130823229)
#define DegToRad(x) ((x)*PI_DIV_180)
#define RadToDeg(x) ((x)*INV_PI_DIV_180)
//向量
typedef float Vector3f[3];
//向量赋值
inline void LoadVector3(Vector3f v, const float x, const float y, const float z)
{
v[0] = x; v[1] = y; v[2] = z;
}
//缩放向量
inline void ScaleVector3(Vector3f v, const float scale)
{
v[0] *= scale; v[1] *= scale; v[2] *= scale;
}
// 4 * 4 矩阵:
// 0 4 8 12
// 1 5 9 13
// 2 6 10 14
// 3 7 11 15
typedef float Matrix44f[16];
//4*4单位矩阵
inline void LoadIdentity44(Matrix44f m)
{
m[0] = 1.0f; m[4] = 0.0f; m[8] = 0.0f; m[12] = 0.0f;
m[1] = 0.0f; m[5] = 1.0f; m[9] = 0.0f; m[13] = 0.0f;
m[2] = 0.0f; m[6] = 0.0f; m[10] = 1.0f; m[14] = 0.0f;
m[3] = 0.0f; m[