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);
}

 

posted @ 2012-09-08 23:11  ActionFG  阅读(406)  评论(0)    收藏  举报