2021SC@SDUSC
shaderVertex.h定义了用于渲染的顶点(Vertex)数据结构,本文将分析一个ShaderVertex拥有的属性。
#ifndef DUST3D_SHADER_VERTEX_H
#define DUST3D_SHADER_VERTEX_H
#include <QOpenGLFunctions>
#pragma pack(push)
#pragma pack(1)
typedef struct
{
GLfloat posX;
GLfloat posY;
GLfloat posZ;
GLfloat normX;
GLfloat normY;
GLfloat normZ;
GLfloat colorR;
GLfloat colorG;
GLfloat colorB;
GLfloat texU;
GLfloat texV;
GLfloat metalness;
GLfloat roughness;
GLfloat tangentX;
GLfloat tangentY;
GLfloat tangentZ;
GLfloat alpha = 1.0;
} ShaderVertex;
#pragma pack(pop)
#endif
posX,posY,posZ是顶点的坐标,是定点最基本的、不可缺少的属性,其他的属性是可选的。normX,normY,normZ是顶点法线(N)。顶点法线的朝向一般决定了面片的正反方向,如果shader采用Backface Culling的话,从法线反向就看不到这个面片了。colorR/G/B是顶点颜色。具体渲染时,fragmentShader负责根据顶点颜色插值计算中间像素的颜色。texU和texV是UV坐标,与材质纹理的位置有关。metalness是金属度参数,负责控制金属反射程度(0为没有反射,1为全反射)。roughness负责控制材质的粗糙程度,或者说高光或反射的模糊程度。tangentX,tangentY,tangentZ是顶点的切线(T)。切线的方向与UV空间的U方向保持一致。在实际渲染中,Normal Map是定义在切线空间的,该空间的三条坐标轴分别是切线T,法线N和副切线B=T×N,这样定义可以避免Normal Map因为物体移动,坐标变化而导致视觉效果产生变化。alpha值表示顶点的透明度。