OpenGL ES 同样的灯光计算在顶点着色器和在片元着色器中计算有什么不同
太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)
本文遵循“署名-非商业用途-保持一致”创作公用协议
同样一段计算灯光的算法如下:
vec4 combineLight (vec3 pLightPositionCoordinate, vec3 pAmbientMaterial, vec3 pDiffuseMaterial, vec3 pSpecularMaterial, float pShininessMaterial, mat3 pNormalMatrix, vec3 pNormalCoordinate) { vec3 N = uNormalMatrix * pNormalCoordinate; vec3 L = normalize(pLightPositionCoordinate); vec3 E = vec3(0, 0, 1); vec3 H = normalize(L + E); float df = max(0.0, dot(N, L)); float sf = max(0.0, dot(N, H)); sf = pow(sf, pShininessMaterial); // 合成环境光、反射光、镜面高光 vec3 combinedLightColor = pAmbientMaterial + df * pDiffuseMaterial + sf * pShininessMaterial; vec4 lighColor = vec4(combinedLightColor+combinedLightColor+combinedLightColor, 1); return lighColor; }
最后与纹理贴图的纹素颜色混合后,作为该片元的颜色。
到目前为止,确实没搞清楚差别在哪里,老罗博客中讲的,片元着色器中计算的要比顶点着色器中效果要好。
经分析,考虑到可能是每个顶点的处理过程,不一定就针对一个片元,这样的话,在顶点着色器中计算光效,传入到片元着色器中,可能是多个片元着色器,就都用同一个顶点着色器输出的值了,而多个片元,每一个都会计算一次,可能会是不同的值,就会使最终片元的颜色更具体,效果就更好了。
但从上面的光效计算函数中,可以看得出,前五个灯光相关参数,始终是不变的,法线矩阵也是固定的,这样就唯有法线坐标是变化的了;
但法线坐标,我们是与顶点坐标一起组合成顶点属性来供顶点着色器进行遍历的,那么取到的法线坐标也应该是从顶点着色器中取出的一个唯一值吧?
这样看来,所有参数也都是一样的,应该是没有差别的呀?!
所以这里猜测,片元着色器中的法线坐标可能与顶点着色器中的不同???
按渲染管线图的描述,是串行的,但是否有分支或合并,真的不太清楚,所以这里又出现一个谜!
好了,暂时能用就够了,这里留下个问题,以后有机会再研究。
如果有高人指点,万分感谢。