OpenGL ES 片元着色器中 int 类型精度不匹配的问题分析

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

OpenGL ES 片元着色器中 int 类型精度不匹配的问题分析

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino否则,出自本博客的文章拒绝转载或再转载,谢谢合作。



最终解决方法补充:

------------------------

经过反复分析和测试,最终定位问题并非是 int 类型在片元着色器中不能使用,而是在顶点和片元着色器中同时使用会出现问题,与变量在两着色器中同时声明并无关系。

去掉顶点着色器中的使用,即使保留其声明也是没问题的,因为两个着色器顶部都做了精度声明:

precision highp float;

分析,可能是在运算过程中,导致进行了类型转换,

不过这个说法也是说不太通的,暂时只是解决了问题,还不清楚问题的真正原因,

希望之后的使用中能以这种经验教训为戒,尽量避勉简单类型在两着色器中同时使用,这样可能会导致精度不匹配的问题发生。


------------------------

补充:

--------

问题已解决,涉及 int 变量的计算,从整体计算中拨离出来,放在顶点着色器中去计算,然后把其计算的结果(一般是矩阵或矢量)作为参数传递到片元着色器,再进一步进行计算。

将 int 相关的计算之后的结果,作为一个中间量而独立出来,并且该中间量是非 int  类型的,即可作为参数输出到片元着色器。

总是感觉应该有更好的方式来解决 int 的问题和 int 变量在片元着色器中精度的问题。

在着色器中灯光计算函数中增加相应该 int 值的引用:

vec4 combineLight (vec3 pLightPositionCoordinate, vec3 pAmbientMaterial, vec3 pDiffuseMaterial, vec3 pSpecularMaterial, float pShininessMaterial, mat3 pNormalMatrix, vec3 pNormalCoordinate) {
    
    vec3 N = uNormalMatrix * pNormalCoordinate;
    if (1 == uRevertNormalIf) {
        
         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;
}
以上代码中再改成不使用该 int 变量的情况测试:

    vec3 N = uNormalMatrix * pNormalCoordinate;
    if (1 == 1) {
        
         N = uNormalMatrix * (-pNormalCoordinate);
    }

------------------

如下提示:

2014-01-03 11:48:13.584 Tutorial12[75037:70b] Error compiling shader:
ERROR: 0:35: int can't be an out in the vertex shader

这个int型的全局变量,在顶点着色器中可以正常获取到值,但在片元着色器中使用,就会提示精度不匹配。

所以想了一下,从顶点着色器接收到该值后,通过参数变量输出到片元着色器再使用,

可是结果如上所示,并未达成。


ERROR: Uniform precision mismatch 'uRevertNormalIf'

2014-01-03 17:30:17.835 Tutorial12[77675:70b]  >> Error: Failed to setup program.

在片元着色器中,通过明确的指定 int 型全局变量与本地函数参数的精度来匹配,高、中、低均偿试过了,仍无法解决,尚不知这个问题的根本原因。

以上作为一个问题留下,暂时先写死跳过,后续解决,再补充。



目录
相关文章
|
5月前
|
数据采集 分布式计算 数据处理
Dataphin常见问题之与指定类型int不兼容如何解决
Dataphin是阿里云提供的一站式数据处理服务,旨在帮助企业构建一体化的智能数据处理平台。Dataphin整合了数据建模、数据处理、数据开发、数据服务等多个功能,支持企业更高效地进行数据治理和分析。
|
5月前
|
SQL 流计算 OceanBase
OceanBase CDC从热OB库采集过来的Tinyint(1)类型会默认转换成Boolean,请教一下,如果想转换成int类型,有什方法么?
【2月更文挑战第25天】OceanBase CDC从热OB库采集过来的Tinyint(1)类型会默认转换成Boolean,请教一下,如果想转换成int类型,有什方法么?
120 3
|
2月前
|
Java
【Java基础面试五】、 int类型的数据范围是多少?
这篇文章回答了Java中`int`类型数据的范围是-2^31到2^31-1,并提供了其他基本数据类型的内存占用和数值范围信息。
【Java基础面试五】、 int类型的数据范围是多少?
|
2月前
|
自然语言处理 Go 数据安全/隐私保护
对 int 类型的数据加密,有哪些好的方案?
对 int 类型的数据加密,有哪些好的方案?
69 13
|
4月前
|
机器学习/深度学习 人工智能 分布式计算
人工智能平台PAI产品使用合集之int类型是否可以为raw feature
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
4月前
|
运维 Cloud Native 关系型数据库
云原生数据仓库AnalyticDB产品使用合集之布尔类型和int类型可以自动转换吗
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
147 1
|
5月前
channelSftp.put(InputStream src, String dst, int mode);里的mode都是什么类型的
【5月更文挑战第15天】channelSftp.put(InputStream src, String dst, int mode);里的mode都是什么类型的
70 2
|
11月前
|
JSON 小程序 JavaScript
小程序根据返回值的int类型渲染不同的状态
小程序根据返回值的int类型渲染不同的状态
126 0
|
5月前
|
关系型数据库 MySQL Java
Java时间转换为MySQL中的INT类型时间戳
Java时间转换为MySQL中的INT类型时间戳
|
12月前
|
Java
【Java用法】Java中String类型和int类型互转的所有方法
【Java用法】Java中String类型和int类型互转的所有方法
117 0
下一篇
无影云桌面