BillBoard shader实现
当前效果是Quad始终处于相机正前方,而不只是方向垂直。去掉m_vOffset就是一般意义上的billboard了。
Vert程序
uniform mat4 g_WorldViewProjectionMatrix;
uniform mat4 g_WorldMatrix;
uniform mat4 g_ProjectionMatrix;
uniform mat4 g_ViewMatrix;
uniform vec3 m_vOffset;
uniform vec3 m_CamPos;
attribute vec3 inPosition;
attribute vec2 inTexCoord;
varying vec2 texCoord;
void main(){
// gl_Position = g_WorldViewProjectionMatrix * vec4(inPosition, 1.0);
// billboard实现
// Quad中心点的世界坐标
vec4 vCenter = g_WorldMatrix * vec4(0,0,0,1) + vec4(m_vOffset, 0) ;
// Quad自身坐标系的Up方向
vec3 vUp = vec3(0,1,0);
// 中心点到相机的LookAt方向
vec3 vEye = normalize( m_CamPos - vCenter);
// Quad自身坐标系的Right方向
vec3 vRight = cross(vUp, vEye);
vUp = normalize(cross(vEye, vRight));
vRight = normalize(vRight);
// 根据纹理坐标偏移,10为Quad的scale size
vec3 vTmpPos = vCenter.xyz;
vTmpPos += (inTexCoord.x - 0.5) *10 * vRight;
vTmpPos += (inTexCoord.y - 0.5) *10 * vUp;
gl_Position = g_ProjectionMatrix * g_ViewMatrix * vec4(( vTmpPos), 1);
texCoord = inTexCoord;
}
Frag程序
varying vec2 texCoord;
uniform sampler2D m_ColorMap;
uniform vec4 m_Color;
void main(){
gl_FragColor= texture2D(m_ColorMap, texCoord);
}
BillBoard shader实现
最新推荐文章于 2022-05-05 19:28:56 发布