cocos2dx 编写shader 遇到 溢出问题

cocos2dx 编写shader 遇到 溢出问题,第1张

概述在 编程语言中,任何 数据类型 都有 各种 的 局限,无法 表示 现实世界中的 任何 情况。 例如 int ,char 会 溢出,float 会 有 溢出 以及 精度 不准确的 情况。 所以 我们 在 开发 中 需要 特别 注意 这些事。 最近 需要 在 cocos2dx(2.1.4) 引擎下 用 shader 做一些 效果,遇到 一些 在 windows 上 没有问题,但是 移植到 androi

在 编程语言中,任何 数据类型 都有 各种 的 局限,无法 表示 现实世界中的 任何 情况。 例如 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 源码:

<span >//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 >//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>
总结

以上是内存溢出为你收集整理的cocos2dx 编写shader 遇到 溢出问题全部内容,希望文章能够帮你解决cocos2dx 编写shader 遇到 溢出问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1063816.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存