博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2dx 编写shader 遇到 溢出问题
阅读量:6846 次
发布时间:2019-06-26

本文共 1774 字,大约阅读时间需要 5 分钟。

在 编程语言中,不论什么 数据类型 都有 各种 的 局限,无法 表示 现实世界中的 不论什么 情况。 比如 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 精度的 一些 最低范围

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

//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;}

错误 集中在 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 之间, 当  两个 百位数 相乘 非常有可能 造成 溢出。

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

//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;}

你可能感兴趣的文章
【Perl】perl正则表达式中的元字符、转义字符、量词及匹配方式
查看>>
用带余除法可以解决一切部分分式的题目
查看>>
具体场景案例系列-查询场景
查看>>
Linux下Vim的使用
查看>>
hdu 4115
查看>>
理解js的DOM操作
查看>>
一个把html控件封装的很好的网站bootstrap
查看>>
[20180812]四校联考
查看>>
截取开始字符串 结束字符串的中间字符串并返回
查看>>
入门级使用PowerDesigner
查看>>
技术走出去看看开阔思维,不要做井底之蛙
查看>>
杜教筛——省选前的学习1
查看>>
内容显示在HTML页面底端的一些处理方式
查看>>
10部电影教你6大沟通术-泡妞MM
查看>>
JQuery 左右拖动插件
查看>>
[转]获取js函数的名称
查看>>
笔记本的拆卸
查看>>
最长递增子序列LIS再谈
查看>>
【Text Editor】文本编辑器:Sublime Text
查看>>
C语言 判断字符串是否回文
查看>>