GLES2.0封裝到shader和vbo結合的部分, 蒙了
vertex layout(或叫vertex declaration)要一個一個element的綁定到一個shader變數上(GL叫attribute), 也就是相當於HLSL的VS_INPUT結構體吧.
問題是, GLSL裡沒有"semantic", 然後問題就來了
舉個例子:
一個簡單的頂點結構:
struct Vertex<br />{<br /> float3 position;<br /> float3 normal;<br /> float2 uv;<br />}
在DX中可以通過指定vetex declaration來綁定到指定寄存器, HLSL裡通過語義來標明當前輸入變數是對應哪個寄存器的:
struct VS_INPUT<br />{<br /> float3 position : POSITION;<br /> float3 normal : NORMAL;<br /> float2 uv : TEXCOORD;<br />}
但是對於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 builtincustom attrib name<br />// ----------------------------------------------<br />//0 gl_Vertexvertex<br />// 1 n/ablendWeights<br />//2 gl_Normalnormal<br />//3 gl_Colorcolour<br />//4 gl_SecondaryColorsecondary_colour<br />//5 gl_FogCoordfog_coord<br />// 7 n/ablendIndices<br />//8 gl_MultiTexCoord0uv0<br />//9 gl_MultiTexCoord1uv1<br />//10 gl_MultiTexCoord2uv2<br />//11 gl_MultiTexCoord3uv3<br />//12 gl_MultiTexCoord4uv4<br />//13 gl_MultiTexCoord5uv5<br />//14 gl_MultiTexCoord6uv6, tangent<br />//15 gl_MultiTexCoord7uv7, binormal
但是它沒有在乎vertexlayout究竟是什麼樣的, 一鼓腦的全綁定上了
這樣的話, glEnableVertexAttribArray的index就需要映射一下了...
嗯...shader裡多聲明幾個不使用的變數冒似沒有什麼問題, 就這麼幹了~