cocos2dx 编写shader 遇到 溢出问题
2015-07-10 16:35
671 查看
在 编程语言中,任何 数据类型 都有 各种 的 局限,无法 表示 现实世界中的 任何 情况。 例如 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 精度的 一些 最低范围
![](https://img-blog.csdn.net/20150710165912860?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
下面 是我的 部分 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>
所以 我们 在 开发 中 需要 特别 注意 这些事。
最近 需要 在 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>
相关文章推荐
- 滑块控件CCControlSlider
- cocos2d-x 3.0rc开发指南:Windows下Android环境搭建
- 使用Quick-Cocos2d-x开发植物大战僵尸02-地图编辑
- 使用Quick-Cocos2d-x开发植物大战僵尸01-项目总体介绍
- cocos compile
- Cocos2d-x 脚本语言Lua介绍
- 关于 Cocosdx 3.4 中如何使用Scale9Sprite
- Eclipse中启动cocos2dx 工程显示 C/C++ Build - environment section java.lang.NullPointerException
- Cocos2d-x 3.0 开发(四)使用CocoStudio创建UI并载入到程序中
- Cocos2d-Java安装和配置跨平台游戏引擎以及相关的开发工具
- 在Cocos2dx中使用Game Center的总结
- Cocos2dx 响应Android返回键和Menu键
- Cocos 2d-x 3.6 touch事件只有began,framework就是这么菜
- Cocos 页面跳转随机动画崩溃
- 精简Cocos2dx-python环境搭建工程创建过程
- 基于cocos2d-x的spine动画残影拖尾效果
- cocos2d html 调用 jquery-qrcode生成的二维码
- 【独立开发者er Cocos2d-x实战 004】使用Cocos2dx加载plist文件
- 【独立开发者er Cocos2d-x实战 003】使用Cocos Studio制作plist文件
- cocos2d-x 学习笔记(ActionsTest)