本文主要是介绍OpenGL ES 同样的灯光计算在顶点着色器和在片元着色器中计算有什么不同,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
OpenGL ES 同样的灯光计算在顶点着色器和在片元着色器中计算有什么不同
太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)
本文遵循“署名-非商业用途-保持一致”创作公用协议
转载请保留此句:太阳火神的美丽人生 - 本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。
同样一段计算灯光的算法如下:
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;
}
最后与纹理贴图的纹素颜色混合后,作为该片元的颜色。
到目前为止,确实没搞清楚差别在哪里,老罗博客中讲的,片元着色器中计算的要比顶点着色器中效果要好。
经分析,考虑到可能是每个顶点的处理过程,不一定就针对一个片元,这样的话,在顶点着色器中计算光效,传入到片元着色器中,可能是多个片元着色器,就都用同一个顶点着色器输出的值了,而多个片元,每一个都会计算一次,可能会是不同的值,就会使最终片元的颜色更具体,效果就更好了。
但从上面的光效计算函数中,可以看得出,前五个灯光相关参数,始终是不变的,法线矩阵也是固定的,这样就唯有法线坐标是变化的了;
但法线坐标,我们是与顶点坐标一起组合成顶点属性来供顶点着色器进行遍历的,那么取到的法线坐标也应该是从顶点着色器中取出的一个唯一值吧?
这样看来,所有参数也都是一样的,应该是没有差别的呀?!
所以这里猜测,片元着色器中的法线坐标可能与顶点着色器中的不同???
按渲染管线图的描述,是串行的,但是否有分支或合并,真的不太清楚,所以这里又出现一个谜!
好了,暂时能用就够了,这里留下个问题,以后有机会再研究。
如果有高人指点,万分感谢。
这篇关于OpenGL ES 同样的灯光计算在顶点着色器和在片元着色器中计算有什么不同的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!