OpenGL ES 同样的灯光计算在顶点着色器和在片元着色器中计算有什么不同-阿里云开发者社区

开发者社区> 开发与运维> 正文

OpenGL ES 同样的灯光计算在顶点着色器和在片元着色器中计算有什么不同

简介: OpenGL ES 同样的灯光计算在顶点着色器和在片元着色器中计算有什么不同 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循“署名-非商业用途-保持一致”创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。

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;
}

最后与纹理贴图的纹素颜色混合后,作为该片元的颜色。

到目前为止,确实没搞清楚差别在哪里,老罗博客中讲的,片元着色器中计算的要比顶点着色器中效果要好。

经分析,考虑到可能是每个顶点的处理过程,不一定就针对一个片元,这样的话,在顶点着色器中计算光效,传入到片元着色器中,可能是多个片元着色器,就都用同一个顶点着色器输出的值了,而多个片元,每一个都会计算一次,可能会是不同的值,就会使最终片元的颜色更具体,效果就更好了。

但从上面的光效计算函数中,可以看得出,前五个灯光相关参数,始终是不变的,法线矩阵也是固定的,这样就唯有法线坐标是变化的了;

但法线坐标,我们是与顶点坐标一起组合成顶点属性来供顶点着色器进行遍历的,那么取到的法线坐标也应该是从顶点着色器中取出的一个唯一值吧?

这样看来,所有参数也都是一样的,应该是没有差别的呀?!

所以这里猜测,片元着色器中的法线坐标可能与顶点着色器中的不同???

按渲染管线图的描述,是串行的,但是否有分支或合并,真的不太清楚,所以这里又出现一个谜!


好了,暂时能用就够了,这里留下个问题,以后有机会再研究。

如果有高人指点,万分感谢。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章