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

本文探讨了在OpenGLES中于顶点着色器与片元着色器内进行相同灯光计算的区别。通过分析计算过程,讨论了两种方式下光效的不同效果,并提出了对于片元着色器中法线坐标可能差异的猜想。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

太阳火神的美丽人生 (http://blog.youkuaiyun.com/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;
}

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

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

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

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

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

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

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

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


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

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值