cocos2dx 编写shader 遇到 溢出问题

原创 2015年07月10日 16:35:58

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





cocos2d-x 强大的shader系列:【OpenGL】Shader实例分析(一)-Wave

转发请保持地址:http://blog.csdn.net/stalendp/article/details/21993227 这篇文章主要分析一个Shader,从而感受shader的魅力,并学习...
  • kaka626
  • kaka626
  • 2015年01月19日 11:13
  • 1565

cocos2d-x 强大的 shader 系列:【OpenGL】Shader实例分析(二)- Heart

【OpenGL】Shader实例分析(二)- Heart 转发请保持地址:http://blog.csdn.net/stalendp/article/details/22221597 这片...
  • kaka626
  • kaka626
  • 2015年01月19日 11:11
  • 832

cocos2dx 3.x运行自己shader出错的问题

运行shader出错
  • x2345com
  • x2345com
  • 2017年01月19日 17:53
  • 349

13 WebGL 着色器编程语言GLSL ES的精度限定字

GLSL ES新引入了精度限定字,目的是帮助着色器程序提高运行效率,消减内存开支。顾名思义,精度限定字用来表示每种数据具有的精度(比特数)。简而言之,高精度的程序需要更大的开销(包括更大的内存和更久的...
  • qq_30100043
  • qq_30100043
  • 2017年05月31日 16:36
  • 539

quick cocos使用shader给图片描边再挖空

转载:使用shader使背景透明
  • u011755031
  • u011755031
  • 2015年12月21日 11:51
  • 757

Cocosd2d 实现图像描边shader

图片描边需求如下: 1. 可指定描边宽度 2. 可指定描边颜色3. 可用于字体 图片描边我所知道的方式有以下几种: 1. Cocos2d-x 3.x中,字体用FreeType库,字体...
  • zhenyu5211314
  • zhenyu5211314
  • 2016年06月29日 11:41
  • 556

【cocos2d-x 2.x 学习与应用总结】10: cocos2d-x自带的shader及其使用

本文介绍了cocos2d-x中自带的shader代码, 及其在引擎中的使用情况。作者的引擎版本是2.2.3,在这个版本的cocos中有9种自带的shader,详情请见下文。...
  • elloop
  • elloop
  • 2016年01月19日 22:16
  • 1187

cocos2dx shader -- Vol.1(灰度、流光、百叶窗)

这里是2d shader系列一——基本篇
  • u011704730
  • u011704730
  • 2014年09月05日 13:45
  • 5388

Vertex and Fragment Shader(可编程渲染管线)

一、引言 Vertex and Fragment Shader:最强大的Shader类型,下文中简称V&F Shader,属于可编程渲染管线. 使用的是CG/HLSL语法。分为2个部分vertex顶点...
  • lichaoguan
  • lichaoguan
  • 2015年01月28日 14:19
  • 2045

在cocos2dx中实现水波滤镜

因为工作原因,开始转向cocos2d-x开发方向了。 自然的,凭着之前引擎的经验偏向底层渲染研究。 在此期间看了两本书 《cocos2d-x 权威指南》 《cocos2d-x 高级开发教程...
  • zmzsoftware
  • zmzsoftware
  • 2014年06月20日 23:00
  • 16515
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2dx 编写shader 遇到 溢出问题
举报原因:
原因补充:

(最多只允许输入30个字)