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

最新文章

  1. VirtualBox Guest Additions 在CentOS中无法安装的解决方法
  2. cygwin E437
  3. CURL命令详解
  4. TestNG中的数据源DataProvider概述
  5. ARP协议
  6. 初探appium之appium的使用
  7. NGUI UIGrid 动态刷新布局 &amp;&amp; BUG FIX
  8. 文件大小转换成可显示的Mb,Gb和kb方法
  9. mac系统 虚拟机安装教程
  10. [Angular 2] A Simple Form in Angular 2
  11. ----constructor 与 object----
  12. tomcat7 server.xml max thread
  13. iic 之24C256存储器 及PCF8563
  14. 在WPF中调用文件夹浏览/选择对话框
  15. PPPOE
  16. 20165313 《Java程序设计》第八周学习总结
  17. Fluent UDF【5】:第一个UDF
  18. Android GridView 分页加载数据
  19. MySQL权限管理(五)
  20. Git_搭建Git服务器

热门文章

  1. 阿里云安装docker
  2. Citrix 服务器虚拟化之十 Xenserver高可用性HA
  3. update-database时出现Cannot attach the file
  4. (转)sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法
  5. Sql Server根据表名获得所有列及其属性
  6. android default_workspace.xml
  7. int.Tryparse() 、int.parse()、Convert.To32() 的区别
  8. CM3存储器系统
  9. POJ3041 二分图最大匹配
  10. maven项目依赖被改为文件夹时如何改回lib