cocos2dx 编写shader 遇到 溢出问题[通俗易懂]

cocos2dx 编写shader 遇到 溢出问题

大家好,又见面了,我是全栈君。

在 编程语言中,不论什么 数据类型 都有 各种 的 局限,无法 表示 现实世界中的 不论什么 情况。 比如 int ,char 会 溢出,float 会 有 溢出 以及 精度 不准确的 情况。

所以 我们 在 开发 中 须要 特别 注意 这些事。

近期 须要 在 cocos2dx(2.1.4) 引擎下 用 shader 做一些 效果。遇到 一些 在 windows 上 没有问题,可是 移植到 android 就会 出问题的 现象。

记录 下来。一为  加深印象 。二为 提供 遇到 同类 问题 的 博友 參考。


主要 集中 在 双方面:

(1) shader 不支持 不同类型的 数 进行 运算

 比如 

int a ;  

float b ; 

float c = a + b;

这个 问题 倒是  还行 ,由于 在 eclipse 里 cocos2dx 会 打印 编译 错误的 log


(2) 浮点型 溢出问题,这样的 问题 会 比較 难解决,我也是 慢慢试出来的

首先 看看 shader 精度的 一些 最低范围

cocos2dx 编写shader 遇到 溢出问题[通俗易懂]



以下 是我的 部分 shader 源代码:

<span style="font-size:18px;">//varying vec4        v_fragmentColor;
varying vec2        v_texCoord;
uniform	float	u_radius;
uniform vec2   u_touchPos;
uniform vec2   u_bgSize;
uniform sampler2D CC_Texture0;
float isInCircle(){
  vec2 pos = u_bgSize * v_texCoord;
  float dis = distance(pos,u_touchPos);
  if(dis >= u_radius || u_radius == 0.0)
	return 1.0;
  else
	return 0.0;		
}

void main()
{
    vec4 texColor   = texture2D(CC_Texture0, v_texCoord);
	float isIn = isInCircle();
	gl_FragColor    =  texColor * isIn;
}</span>

错误 集中在 float dis = distance(pos,u_touchPos); 

distance 是 求 屏幕中的 两个点的 距离。 我预计 它 的 形式 大致 是 这种

float distance(vec2 pos1, vec2 pos2){

vec3  sub = pos1 – pos2;

return sqrt(sub.x * sub.x + sub.y * sub.y);

}

因为 cocos2dx 会 默认 设置  顶点着色器 使用 高精度 float, 片元着色器 使用 中等 精度 float, (我这段代码 是 片元着色器的 代码),

所以 float 的 范围 在-16384 ~ 16384 之间, 当  两个 百位数 相乘 非常有可能 造成 溢出。


以下 给出 最后 改动的 代码:

<span style="font-size:18px;">//varying vec4        v_fragmentColor;
varying vec2        v_texCoord;
uniform float		u_radius;
uniform highp vec2 		u_touchPos;
uniform vec2		u_bgSize;
uniform sampler2D 	CC_Texture0;

float isInCircle(){
  highp vec2 pos = u_bgSize * v_texCoord;
  float dis = distance(pos,u_touchPos);
  if(dis >= u_radius)
	return 1.0;
  else
	return 0.0;		
}

void main()
{
    vec4 texColor   = texture2D(CC_Texture0, v_texCoord);
	float isIn 		= isInCircle();
	gl_FragColor    =  texColor * isIn;
}</span>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115776.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月30日 下午7:00
下一篇 2022年1月30日 下午7:00


相关推荐

  • oracle可视化工具_oracle rac架构

    oracle可视化工具_oracle rac架构SRVCTL是ORACLERAC集群配置管理的工具,可以管理Database、Instance、ASM、Service、Listener和NodeApplication,NodeApplication包括GSD,ONS,VIP。srvctl的命令格式为srvctl[options]srvctlUsage:srvctl[]command:enable|disable|start|sto…

    2025年10月29日
    2
  • 助眠神器!一款开源无广告的安卓白噪音应用!

    助眠神器!一款开源无广告的安卓白噪音应用!

    2026年3月12日
    3
  • golang练手小项目系列(6)-使用map实现set

    golang练手小项目系列(6)-使用map实现set问题描述go没有提供set数据结构,请用map实现set要点需要支持方法:Add添加元素Remove删除元素Cardinality获取Set长度Clear清空SetContains检测元素是否在Set中Pop()随机删除一个元素并返回被删除的元素ToSlice()[]interface{}转换成slice返回拓展Clone复制SetDi…

    2025年6月30日
    5
  • php 邮箱正则_正则表达式判断邮箱格式

    php 邮箱正则_正则表达式判断邮箱格式PHP邮箱验证正则表达式:preg_match(“/^[0-9a-zA-Z]+@(([0-9a-zA-Z]+)[.])+[a-z]{2,4}$/i”,$email);如果需要更加完善、严格的验证,修改这个正则表达式即可。PHP邮箱验证正则表达式新手实例:functionisEmail($email){if(preg_match(“/^[0-9a-zA-Z]+@(([0-9a-zA-Z]+)…

    2026年3月7日
    7
  • C++实现超分辨率 RDN

    C++实现超分辨率 RDNRDN(由残差密集网络实现的图像超分辨率)在《RDN-TensorFlow-master》有一个3倍模型(也只有这一个了):rdn_5_3_64_x3这里用C++实现这个的3倍重建:流程图:密集残差块:这个残差块结构内部和前面的ESRGAN(前面的文章)中的密集残差块是一样的,只是外部有点不同。定义密集残差块:struct密集残差块//4个卷积层…

    2022年6月18日
    29
  • Nexus 3的搭建和简单使用介绍

    搭建Nexus 3私服一、简介nexus 私服间于本地仓库和中央仓库直接。1、有两种安装方式:使用tomcat启动,Tgz使用自带的Jetty启动 ,zip包(推荐使用)2、下载地址 : Nexus oss3、环境准备: jdk8+ + maven3+二、安装步骤1、windos上安装– nexus 2.x 版本1、将bin添加到环境变量中,nexus2、修改/bin…

    2022年2月27日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号