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 型全局变量与本地函数参数的精度来匹配,高、中、低均偿试过了,仍无法解决,尚不知这个问题的根本原因。

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



目录
相关文章
|
数据采集 分布式计算 数据处理
Dataphin常见问题之与指定类型int不兼容如何解决
Dataphin是阿里云提供的一站式数据处理服务,旨在帮助企业构建一体化的智能数据处理平台。Dataphin整合了数据建模、数据处理、数据开发、数据服务等多个功能,支持企业更高效地进行数据治理和分析。
|
SQL 流计算 OceanBase
OceanBase CDC从热OB库采集过来的Tinyint(1)类型会默认转换成Boolean,请教一下,如果想转换成int类型,有什方法么?
【2月更文挑战第25天】OceanBase CDC从热OB库采集过来的Tinyint(1)类型会默认转换成Boolean,请教一下,如果想转换成int类型,有什方法么?
557 3
|
Python Windows
[oeasy]python076_int这个词怎么来的_[词根溯源]整数类型_int_integer_touch
本文探讨了“int”一词的起源及其与整数类型的关联。通过词根溯源,揭示“int”来源于“integer”,意为“完整的数”,与零碎的分数相对。同时分析了相关词汇如“tact”(接触)、“touch”(触摸)及衍生词,如“tangential”(切线的)、“intagible”(无形的)和“integral”(完整的、不可或缺的)。文章还结合编程语言特性,解释了Python作为动态类型、强类型语言的特点,并总结了整型变量的概念与意义。最后预告了后续内容,提供了学习资源链接。
630 11
|
存储 C语言 Python
[oeasy]python077_int类型怎么用_整数运算_integer_进制转化_int类
本文主要讲解了Python中`int`类型的应用与特性。首先回顾了`int`词根的溯源,探讨了整型变量的概念及命名规则(如匈牙利命名法)。接着分析了整型变量在内存中的存储位置和地址,并通过`type()`和`id()`函数验证其类型和地址。还介绍了整型变量的运算功能,以及如何通过`int()`函数将字符串转化为整数,支持不同进制间的转换(如二进制转十进制)。此外,文章提及了关键字`del`的使用场景,对比了Python与C语言中`int`的区别,并总结了整型与字符串类型的差异,为后续深入学习奠定基础。
469 1
|
JSON 小程序 JavaScript
小程序根据返回值的int类型渲染不同的状态
小程序根据返回值的int类型渲染不同的状态
314 0
【Java基础面试五】、 int类型的数据范围是多少?
这篇文章回答了Java中`int`类型数据的范围是-2^31到2^31-1,并提供了其他基本数据类型的内存占用和数值范围信息。
【Java基础面试五】、 int类型的数据范围是多少?
|
Python
[oeasy]python036_数据类型有什么用_type_类型_int_str_查看帮助
本文回顾了Python中`ord()`和`chr()`函数的使用方法,强调了这两个函数互为逆运算:`ord()`通过字符找到对应的序号,`chr()`则通过序号找到对应的字符。文章详细解释了函数参数类型的重要性,即`ord()`需要字符串类型参数,而`chr()`需要整数类型参数。若参数类型错误,则会引发`TypeError`。此外,还介绍了如何使用`type()`函数查询参数类型,并通过示例展示了如何正确使用`ord()`和`chr()`进行转换。最后,强调了在函数调用时正确传递参数类型的重要性。
268 3
|
自然语言处理 Go 数据安全/隐私保护
对 int 类型的数据加密,有哪些好的方案?
对 int 类型的数据加密,有哪些好的方案?
369 13
|
机器学习/深度学习 人工智能 分布式计算
人工智能平台PAI产品使用合集之int类型是否可以为raw feature
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
运维 Cloud Native 关系型数据库
云原生数据仓库AnalyticDB产品使用合集之布尔类型和int类型可以自动转换吗
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
402 1