您的位置:首页 > 编程语言 > Qt开发

利用着色器实现游戏的公告板特效

2014-03-26 19:56 363 查看
利用着色器实现游戏的公告板特效
       这几日进展比较缓慢,主要是对自己搭建的基于Qt和OpenGL(ES)2.0的框架进行整合。同时利用现有的技术,制作一个基于OpenGL的公告板效果,同时提升一下自己书写着色器的能力。

原创文章,反对未声明的引用。原博客地址:http://blog.csdn.net/gamesdev/article/details/22205357

       公告板技术的核心在于计算模型矩阵。OpenGL的固定渲染管线是维持了模型视图矩阵和投影矩阵两套矩阵,而Direct3D的固定渲染管线维持了三套矩阵,也就是世界矩阵、视图矩阵以及投影矩阵。我个人认为Direct3D的做法比较科学,而且将三者分开可以更好地控制显示效果,比如说我们将要实现的公告板特效。

       演示程序的下载地址:这里

       要实现公告板效果,我们必须对模型矩阵做文章,相应地,控制T&L阶段的顶点着色器则是我们关注的对象。我这里画了一个简单的图和公式,讲述了如何实现公告板特效。



       根据上面的理论,我们的顶点着色器是这样的:

// 这是具有公告板特效的顶点着色器
attribute vec3 pos;
attribute vec2 texCoord;
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;
uniform vec3 cameraPos;
uniform int billboardEnabled;

varying vec2 v_TexCoord;
const vec3 up = vec3( 0.0, 1.0, 0.0 );

mat4 BillboardMatrix( void )
{
vec3 forward = normalize( pos - cameraPos );
vec3 side = cross( forward, up );

mat4 result;
result[0] = vec4( side, 0.0 );
result[1] = vec4( up, 0.0 );
result[2] = vec4( forward.x, 0.0, forward.z, 0.0 );
result[3] = vec4( 0.0, 0.0, 0.0, 1.0 );
return result;
}

void main( void )
{
if ( billboardEnabled == 1 )
{
gl_Position =
projectionMatrix *
viewMatrix *
modelMatrix *
BillboardMatrix( ) *
vec4( pos, 1.0 );
}
else
{
gl_Position =
projectionMatrix *
viewMatrix *
modelMatrix *
vec4( pos, 1.0 );
}
v_TexCoord = texCoord;
}


下面是演示程序的截图。

没有使用公告板特效,可以看见树和草的面片非常明显,一看上去就知道是假的:



而启用了公告板特效,我们就可以看到树和草都面向摄像机了。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt opengl