SomePoints继承Geometry,绘制了八个点,关闭了光照,设置点的大小为6.
然后应用的了shader,添加了"u_anim1"这个变量,并且添加了SineAnimation更新回调。
先来看createShader()这个函数,创建Program,添加了顶点着色器、片元着色器和几何着色器。
几何着色器介绍:
Geometry Shader Tutorials:http://appsrv.cse.cuhk.edu.hk/~ymxie/Geometry_Shader/
Geometry Shader Concepts & Examples: http://www.cnblogs.com/Jedimaster/archive/2007/06/26/796107.html
pgm->setParameter( GL_GEOMETRY_VERTICES_OUT_EXT, 4 ); 着色器输出元素个数
pgm->setParameter( GL_GEOMETRY_INPUT_TYPE_EXT, GL_POINTS );色器输入元素类型
pgm->setParameter( GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_LINE_STRIP );着色器输出元素类型
这是几何着色器扩展支持,输入的是点,输出的是线。
在每个着色器中定义"#version 120\n"
"#extension GL_EXT_geometry_shader4 : enable\n"
打开几个着色器
static const char* vertSource = {
"#version 120\n"
"#extension GL_EXT_geometry_shader4 : enable\n"
"uniform float u_anim1;\n"
"varying vec4 v_color;\n"
"void main(void)\n"
"{\n"
" v_color = gl_Vertex;\n"
" gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
"}\n"
};
把点的坐标轴当做颜色传递,计算点的位置。
static const char* geomSource = {
"#version 120\n"
"#extension GL_EXT_geometry_shader4 : enable\n"
"uniform float u_anim1;\n"
"varying in vec4 v_color[];\n"
"varying out vec4 v_color_out;\n"
"void main(void)\n"
"{\n"
" vec4 v = gl_PositionIn[0];\n"
" v_color_out = v + v_color[0];\n"
"\n"
" gl_Position = v + vec4(u_anim1,0.,0.,0.); EmitVertex();\n"
" gl_Position = v - vec4(u_anim1,0.,0.,0.); EmitVertex();\n"
" EndPrimitive();\n"
"\n"
" gl_Position = v + vec4(0.,1.0-u_anim1,0.,0.); EmitVertex();\n"
" gl_Position = v - vec4(0.,1.0-u_anim1,0.,0.); EmitVertex();\n"
" EndPrimitive();\n"
"}\n"
};
计算了一下颜色,每两点作为一条线
static const char* fragSource = {
"#version 120\n"
"#extension GL_EXT_geometry_shader4 : enable\n"
"uniform float u_anim1;\n"
"varying vec4 v_color_out;\n"
"void main(void)\n"
"{\n"
" gl_FragColor = v_color_out;\n"
"}\n"
};
把最终的颜色写入gl_framcolor中
然后应用的了shader,添加了"u_anim1"这个变量,并且添加了SineAnimation更新回调。
先来看createShader()这个函数,创建Program,添加了顶点着色器、片元着色器和几何着色器。
几何着色器介绍:
Geometry Shader Tutorials:http://appsrv.cse.cuhk.edu.hk/~ymxie/Geometry_Shader/
Geometry Shader Concepts & Examples: http://www.cnblogs.com/Jedimaster/archive/2007/06/26/796107.html
pgm->setParameter( GL_GEOMETRY_VERTICES_OUT_EXT, 4 ); 着色器输出元素个数
pgm->setParameter( GL_GEOMETRY_INPUT_TYPE_EXT, GL_POINTS );色器输入元素类型
pgm->setParameter( GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_LINE_STRIP );着色器输出元素类型
这是几何着色器扩展支持,输入的是点,输出的是线。
在每个着色器中定义"#version 120\n"
"#extension GL_EXT_geometry_shader4 : enable\n"
打开几个着色器
static const char* vertSource = {
"#version 120\n"
"#extension GL_EXT_geometry_shader4 : enable\n"
"uniform float u_anim1;\n"
"varying vec4 v_color;\n"
"void main(void)\n"
"{\n"
" v_color = gl_Vertex;\n"
" gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
"}\n"
};
把点的坐标轴当做颜色传递,计算点的位置。
static const char* geomSource = {
"#version 120\n"
"#extension GL_EXT_geometry_shader4 : enable\n"
"uniform float u_anim1;\n"
"varying in vec4 v_color[];\n"
"varying out vec4 v_color_out;\n"
"void main(void)\n"
"{\n"
" vec4 v = gl_PositionIn[0];\n"
" v_color_out = v + v_color[0];\n"
"\n"
" gl_Position = v + vec4(u_anim1,0.,0.,0.); EmitVertex();\n"
" gl_Position = v - vec4(u_anim1,0.,0.,0.); EmitVertex();\n"
" EndPrimitive();\n"
"\n"
" gl_Position = v + vec4(0.,1.0-u_anim1,0.,0.); EmitVertex();\n"
" gl_Position = v - vec4(0.,1.0-u_anim1,0.,0.); EmitVertex();\n"
" EndPrimitive();\n"
"}\n"
};
计算了一下颜色,每两点作为一条线
static const char* fragSource = {
"#version 120\n"
"#extension GL_EXT_geometry_shader4 : enable\n"
"uniform float u_anim1;\n"
"varying vec4 v_color_out;\n"
"void main(void)\n"
"{\n"
" gl_FragColor = v_color_out;\n"
"}\n"
};
把最终的颜色写入gl_framcolor中