GLES2.0封装到shader和vbo结合的部分, 蒙了
vertex layout(或叫vertex declaration)要一个一个element的绑定到一个shader变量上(GL叫attribute), 也就是相当于HLSL的VS_INPUT结构体吧.
问题是, GLSL里没有"semantic", 然后问题就来了
举个例子:
一个简单的顶点结构:
在DX中可以通过指定vetex declaration来绑定到指定寄存器, HLSL里通过语义来标明当前输入变量是对应哪个寄存器的:
但是对于GLSL, 它没有vertex declaration这么个东西! 怪不得大家都用CG...无奈手机上用不了CG, 还是要面对这个问题.
起初我是设想的把每种vertex element对应一个固定的attribute名, 如a_position0, a_normal0, a_color1之类, 然后用程序自动绑定. 写shader的时候只能使用程序里规定的attribute名字. 写到glBindAttribLocation时, 问题又来了:
glBindAttribLocation之后要glLinkProgram才有效果~
也就是说, 每个effect(vs + ps)要在link之前把所有参数全部手动绑定一遍. 但对于vertex layout来说不太现实. 难道还要自己用XML定义一下所有参数? 昏倒
想来想去, 好像只有OGRE有用GLSL, 查了一下, 我原本想的没有错, 它也是用固定attribute名来绑定element的:
// a builtin custom attrib name
// ----------------------------------------------
// 0 gl_Vertex vertex
// 1 n/a blendWeights
// 2 gl_Normal normal
// 3 gl_Color colour
// 4 gl_SecondaryColor secondary_colour
// 5 gl_FogCoord fog_coord
// 7 n/a blendIndices
// 8 gl_MultiTexCoord0 uv0
// 9 gl_MultiTexCoord1 uv1
// 10 gl_MultiTexCoord2 uv2
// 11 gl_MultiTexCoord3 uv3
// 12 gl_MultiTexCoord4 uv4
// 13 gl_MultiTexCoord5 uv5
// 14 gl_MultiTexCoord6 uv6, tangent
// 15 gl_MultiTexCoord7 uv7, binormal
但是它没有在乎vertexlayout究竟是什么样的, 一鼓脑的全绑定上了
这样的话, glEnableVertexAttribArray的index就需要映射一下了...
嗯...shader里多声明几个不使用的变量冒似没有什么问题, 就这么干了~