shader中判断浮点型数值相等:round、floor

简介: shader中判断浮点型数值相等:round、floor

传递的顶点数据中vertices.z=1.0

网络异常,图片无法展示
|

使用gDebugger查看vbo中的数据z也是1.0

网络异常,图片无法展示
|

所有的顶点z都是一致的,当position.z=0、position.z=2时都正常,唯独position.z=1时异常

  • vertexes.shader
attribute vec2 a_position;
varying vec4 v_position;
void main(){
    v_position = a_position;
}
复制代码
  • fragment.shader
varying vec4 v_position;
void main(){
    float textureID = v_position.z;
     if(0.0 == textureID){
         // 正常
     }else if(1.0 == textureID){
         // 唯独这个1.0无法正常响应
     }ese if(2.0 == textureID){
         // 正常
     }
}
复制代码

为了防止是精度问题,特地转int,发现仍旧如此:

发现转int(z)后竟然等于0,可能这时的z是一个非常接近1的浮点数,比如:0.999999

varying vec4 v_position;
void main(){
    int textureID = int(v_position.z);
     if(0 == textureID){
         // 正常
     }else if(1 == textureID){
         // 唯独这个1.0无法正常响应
     }ese if(2 == textureID){
         // 正常
     }
}
复制代码

答案

使用round转int

varying vec4 v_position;
void main(){
    int textureID = round(v_position.z);
     if(0 == textureID){
         // 正常
     }else if(1 == textureID){
         // 唯独这个1.0无法正常响应
     }ese if(2 == textureID){
         // 正常
     }
}
复制代码

在某些环境中,round is undefined,可以使用floor(x+0.5)代替

shader函数

函数 说明
floor 返回小于等于x的最大整数
ceil 返回大于或等于输入值的最小整数。
degrees 弧度到角度的转换
fmod 返回a / b的浮点余数。
round 返回最接近于输入值的整数。
saturate 把输入值限制到[0, 1]之间。

注意事项

在round的官方文档中会看到关于类型的说明

genType round( genType x)
复制代码
  • genType对应的输入/输出参数可以是float,vec2,vec3或vec4。
  • genIType对应的输入/输出参数可以是int,ivec2,ivec3或ivec4。

举个例子:

int a = round(1.0); // 错误:Incompatible types in initialization (and no available implicit conversion)
float a = round(1.0); // 正确
复制代码


目录
相关文章
|
存储 算法 定位技术
PCL--点云配准--ICP使用
PCL--点云配准--ICP使用
PCL--点云配准--ICP使用
|
11月前
|
图形学
unity摄像机的平滑过渡,平滑缓冲
在Unity中,通过插值计算实现摄像机的平滑过渡与缓冲效果,避免突兀跳跃,提升玩家视觉体验。主要方法包括位置和旋转的平滑过渡,常用线性插值(Lerp)和SmoothDamp函数。代码示例展示了如何使用SmoothDamp实现摄像机从一个点到另一个点的平滑移动。将脚本挂载到场景中测试即可看到效果。
|
9月前
|
Shell 网络安全 开发工具
Git常见问题解决:解决TortoiseGit的No supported authentication methods available错误。
总的来说,遇到"No supported authentication methods available"这个问题,就像是钓到了一条刺猬。解决它就像是给刺猬穿上一件新衣服。首先,你需要生成新的SSH秘钥对,然后,将你的公钥添加到Git服务器,这样,你的SSH客户端就能认出刺猬了。接下来,将你的私钥添加到SSH agent,让你的SSH客户端拥有这个刺猬的“身份证”。最后,你还需要告诉TortoiseGit,如何使用这个新的SSH秘钥,也就是将刺猬的“身份证”告诉TortoiseGit。只需要做到这四点,你就可以顺利地解决这个问题了。希望这个步骤为步的解决方法能够帮到你解决这个问题,让你的代码
986 21
|
11月前
|
安全 图形学
Unity射线检测的“坑”
在 Unity 中,射线检测是常用功能,但也存在一些常见问题。首先是层(Layer)设置问题,如射线忽略某些层或误检测到不期望的层,需正确设置 LayerMask。其次是碰撞体相关问题,包括碰撞体未启用或类型不匹配,确保碰撞体启用并合理设置属性。再者是射线起始点和方向问题,错误的位置或方向计算会导致检测失败,需准确设置起始点和方向。此外,频繁进行射线检测或检测范围过大会影响性能,应减少检测次数并合理设置范围。最后,在多线程中进行射线检测可能导致错误,应避免在非主线程中直接调用射线检测。
|
开发者 C# C++
揭秘:如何轻松驾驭Uno Platform,用C#和XAML打造跨平台神器——一步步打造你的高性能WebAssembly应用!
【8月更文挑战第31天】Uno Platform 是一个跨平台应用程序框架,支持使用 C# 和 XAML 创建多平台应用,包括 Web。通过编译为 WebAssembly,Uno Platform 可实现在 Web 上运行高性能、接近原生体验的应用。本文介绍如何构建高效的 WebAssembly 应用:首先确保安装最新版本的 Visual Studio 或 VS Code 并配置 Uno Platform 开发环境;接着创建新的 Uno Platform 项目;然后通过安装工具链并使用 Uno WebAssembly CLI 编译应用;最后添加示例代码并测试应用。
556 0
UE-蓝图中的使用正则表达式
实现用于匹配判断的正则表达式
|
自然语言处理 搜索推荐 API
【推荐100个unity插件之21】unity实现多语言切换功能——Localization插件的使用
【推荐100个unity插件之21】unity实现多语言切换功能——Localization插件的使用
1266 0
|
存储 关系型数据库 MySQL
MySQL 中的 BLOB 数据类型深入解析
【8月更文挑战第31天】
2270 0
|
前端开发 JavaScript IDE
WebStorm 打开多个项目的方法
【8月更文挑战第2天】
505 0
|
Android开发 图形学
Android项目实战(二十二):启动另一个APP or 重启本APP
一、启动另一个APP 目前公司项目需求,一个主APP,需要打开某些小APP,这些小APP是整合了Unity的,但是还是android程序(所有小APP的包名是已知的)。 以前没做过,查询了一下实现方法,其实还是挺简单的,测试也可以。
1757 0