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

cocos2dx 编写shader 遇到 溢出问题的更多相关文章

  1. 编写Shader时的一些性能考虑

    编写shader时的一些建议:1.只计算需要计算的东西:2.通常,需要渲染的像素比顶点数多,而顶点数又比物体数多很多.所以如果可以,尽量将运算从PS移到VS,或直接通过script来设置某些固定值:3 ...

  2. 解读Unity中的CG编写Shader系列八(镜面反射)

    转自http://www.itnose.net/detail/6117378.html 讨论完漫反射之后,接下来肯定就是镜面反射了 在开始镜面反射shader的coding之前,要扩充一下前面提到的知 ...

  3. [转]解读Unity中的CG编写Shader系列9——镜面反射

    讨论完漫反射之后,接下来肯定就是镜面反射了在开始镜面反射shader的coding之前,要扩充一下前面提到的知识,加深理解镜面反射与漫反射的区别.注:这篇文章实现的镜面反射是逐顶点着色(per-ver ...

  4. #lua中编写shader的方式

    lua中编写shader的方式 1. 字符串拼接 类似于下面这种 vertDefaultSource = "\n".."\n" .. "attribu ...

  5. Cocos2d-x中使用OpenGL ES2.0编写shader

    这几天在看子龙山人的关于OpenGL的文章,先依葫芦画瓢,能看到些东西,才能慢慢深入了解,当入门文章不错,但是其中遇到的一些问题,折腾了一些时间,为了方便和我一样的小白们,在这篇文章中进行写补充. O ...

  6. 解读Unity中的CG编写Shader系列七(不透明度与混合)

    转自http://www.itnose.net/detail/6098539.html 1.不透明度 当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们已经知道了片段 ...

  7. Unity中的CG编写Shader系列(Blend)

    1.不透明度 当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们已经知道了片段着色器以及后面的环节的主要工作是输出颜色与深度到帧缓存中,所以两个纹理在每个像素上的颜色 ...

  8. [转]解读Unity中的CG编写Shader系列6——不透明度与混合

    1.不透明度当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们已经知道了片段着色器以及后面的环节的主要工作是输出颜色与深度到帧缓存中,所以两个纹理在每个像素上的颜色到 ...

  9. [转]解读Unity中的CG编写Shader系列7——漫反射

    如果前面几个系列文章的内容过于冗长缺乏趣味着实见谅,由于时间原因前面的混合部分还没有写完,等以后再补充,现在开始关于反射的内容了.折射与反射在物理世界中,光的反射与折射往往是同时存在的,光源由真空或者 ...

随机推荐

  1. oracle修改字符集后数据库不能启动

    最近在做修改字符集的实验,悲剧的是修改后重启,数据库启动不了. SQL> alter system set nls_language='AMERICAN'   scope = spfile; S ...

  2. Android 编程下 Activity 的创建和应用退出时的销毁

    为了确保对应用中 Activity 的创建和销毁状态进行控制,所以就需要一个全局的变量来记录和销毁这些 Activity.这里的大概思路是写一个类继承 Application,并使获取该 Applic ...

  3. JS高级程序设计学习笔记之数组

    数组创建的方式 var str = new Array();放入数字即为设置数组长度 var str = []; 数组的length可读可写 监测数组 Array.isArray()方法确定某个值是不 ...

  4. EF加载实体的方式

    原文:Loading Related Entities EF加载数据的方式: 预加载 eager loading 延迟加载 lazy loading 显示加载 explicit loading 预先加 ...

  5. 使用QTP打开应用程序的三种方法

    1. systemUtil.Run ‘SystemUtil对象的Run方法 SystemUtil.Run “http://192.168.11.82/XXX” 参数实例: File:“http://1 ...

  6. IOS中对于一些控件的抖动效果

    这两天在网上看到一个帖子讨论关于有些app 输入账密时候 错误的话会有抖动效果出现,然后自己琢磨了下如何实现,下面上代码!!! 首先 写一个UIView的分类 #import <UIKit/UI ...

  7. IIS负载均衡相关

    1. IIS负载均衡 (比较简单的例子,能看到效果) 2.nginx+iis实现负载均衡 3.Windows平台分布式架构实践 - 负载均衡 4.Net分布式系统:Keepalived+LVS+Ngi ...

  8. 【android】Android检查是否已经连接到网络

    ConnectivityManager con=(ConnectivityManager)getSystemService(Activity.CONNECTIVITY_SERVICE); boolea ...

  9. WordPress插件制作教程(八): 最后总结

    WordPress插件教程最后一篇,还是为大家简单的做下总结.这次插件制作教程讲的内容和知识点个人觉得不是很多,因为插件制作不单单是这些内容,它涉及的知识很多很多,不是说你会一些函数就可以做出一个好的 ...

  10. Sherlock and GCD

    1 import fractions, functools, sys if __name__ == '__main__': T = int(sys.stdin.readline()) for _ in ...