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

2024-01-08 21:59

本文主要是介绍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 同样的灯光计算在顶点着色器和在片元着色器中计算有什么不同的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/584963

相关文章

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

Python Flask实现定时任务的不同方法详解

《PythonFlask实现定时任务的不同方法详解》在Flask中实现定时任务,最常用的方法是使用APScheduler库,本文将提供一个完整的解决方案,有需要的小伙伴可以跟随小编一起学习一下... 目录完js整实现方案代码解释1. 依赖安装2. 核心组件3. 任务类型4. 任务管理5. 持久化存储生产环境

Python中经纬度距离计算的实现方式

《Python中经纬度距离计算的实现方式》文章介绍Python中计算经纬度距离的方法及中国加密坐标系转换工具,主要方法包括geopy(Vincenty/Karney)、Haversine、pyproj... 目录一、基本方法1. 使用geopy库(推荐)2. 手动实现 Haversine 公式3. 使用py

SpringBoot整合(ES)ElasticSearch7.8实践

《SpringBoot整合(ES)ElasticSearch7.8实践》本文详细介绍了SpringBoot整合ElasticSearch7.8的教程,涵盖依赖添加、客户端初始化、索引创建与获取、批量插... 目录SpringBoot整合ElasticSearch7.8添加依赖初始化创建SpringBoot项

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J