灰度shader

最近在学习shader,就把cocos2d-x 3.x版本中的很简单也很常用的灰度shader拿出来学习一下。

#ifdef GL_ES
precision mediump float; // ES版本的精度限定符,精度变低后可以提高效率
#endif varying vec4 v_fragmentColor;
varying vec2 v_texCoord; void main(void) vec4 c = texture2D(CC_Texture0, v_texCoord);
gl_FragColor.xyz = vec3(0.2126*c.r + 0.7152*c.g + 0.0722*c.b);
gl_FragColor.w = c.w;
}

代码分析

precision mediump float是open es特有的精度限定符,原本的浮点数精度是double,opengl es为了提高渲染效率,限定精度为float类型。

v_fragmentColor是从顶点着色器设置的颜色经过光栅化阶段的线性插值后传给片段着色器的颜色。

v_texCoord同样是经过线性插值而来的纹理坐标。

下面是顶点着色器的代码:

const char* ccPositionTextureColor_noMVP_vert = STRINGIFY(
attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color; \n#ifdef GL_ES\n
varying lowp vec4 v_fragmentColor;
varying mediump vec2 v_texCoord;
\n#else\n
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
\n#endif\n void main()
{
gl_Position = CC_PMatrix * a_position;
v_fragmentColor = a_color;
v_texCoord = a_texCoord;
}
);

CC_Texture0是一个采样器,在load shader的时候,引擎会预先把这些uniform变量给加载进来。

下面这部分代码就是引擎预先加载进来的uniform变量:

static const char * COCOS2D_SHADER_UNIFORMS =
"uniform mat4 CC_PMatrix;\n"
"uniform mat4 CC_MVMatrix;\n"
"uniform mat4 CC_MVPMatrix;\n"
"uniform mat3 CC_NormalMatrix;\n"
"uniform vec4 CC_Time;\n"
"uniform vec4 CC_SinTime;\n"
"uniform vec4 CC_CosTime;\n"
"uniform vec4 CC_Random01;\n"
"uniform sampler2D CC_Texture0;\n"
"uniform sampler2D CC_Texture1;\n"
"uniform sampler2D CC_Texture2;\n"
"uniform sampler2D CC_Texture3;\n"
"//CC INCLUDES END\n\n";

这些变量在shader里面如果没有用到的话,会被引擎给优化掉。

texture2D()是shader的内建方法,作用是从CC_Texture0采样器中进行纹理采样,得到当前片段的颜色值。

gl_FragColor是shader的内建变量,表示当前片段的颜色,代码中是把从采样器中拿到的颜色值进行一个变灰处理后,最后得到的颜色值再赋值给gl_FragColorgl_FragColor就是最终的颜色。

这个shader很简单,就是改变了一下rgb的值。0.21260.71520.0722这几个系数据说是根据人眼对rgb这三种基本颜色识别的强弱算出来的。

使用示例

在cocos2dx 3.x版本中sprite变灰的代码例子:

auto sprite = Sprite::create("HelloWorld.png");
sprite->setGLProgramState(GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_GRAYSCALE));

效果如下图所示:

Cocos2d-x shader学习1: 灰度shader的更多相关文章

  1. Unity3D 灰度shader(改编自NGUI)

    原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:[] 本文链接地址: 灰度shader 废话不多说,直接图解流程: 1.原图 2.改动shader 打开NGUI自带的shader ...

  2. 【Unity Shaders】Shader学习资源和Surface Shader概述

    写在前面 写这篇文章的时候,我断断续续学习Unity Shader半年了,其实还是个门外汉.我也能体会很多童鞋那种想要学好Shader却无从下手的感觉.在这个期间,我找到一些学习Shader的教程以及 ...

  3. ugui 灰度shader mask冲突解决 转。。。

    项目上遇到了一个问题,灰度shader无法在mask下使用,两个之间会一定的冲突.经查验是mask组件对shader的相关属性有要求,添加相关的属性则可符合要求使其他shader使用UGui里的mas ...

  4. Unity Shader 学习之旅

    Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ...

  5. Unity Shader 学习之旅之SurfaceShader

    Unity Shader 学习之旅之SurfaceShader unity shader 图形图像  如果大地的每个角落都充满了光明 谁还需要星星,谁还会 在夜里凝望 寻找遥远的安慰——江河 官方文档 ...

  6. Shader 学习工具篇 可视化公式工具ZGrapher

    大家好,我是怒风,本篇介绍公式可视化公式工具ZGrapher,尝试通过可视化的方式分析一下Shader中应用的公式,以求帮助初学者快速理解Shader编程中的一些常用公式 本篇的目的两个, 第一,介绍 ...

  7. Unity3D for VR 学习(9): Unity Shader 光照模型 (illumination model)

    关于光照模型 所谓模型,一般是由学术算法发起, 经过大量实际数据验证而成的可靠公式 现在还记得2009年做TD-SCDMA移动通信算法的时候,曾经看过自由空间传播模型(Free space propa ...

  8. Shader学习笔记

    Shader学习笔记 例子: Shader "SrfShader1"{ //定义显示在Inspector中的变量,并从Inspector中获取值 Properties{ _Colo ...

  9. u3d shader学习笔记1

    促使我学习SHADER的重要原因是希望深入理解3D渲染的机制,在此基础上可以灵活达到某种效果与性能的平衡,开发出具有良好体验的VR应用. 因为VR应用体验的好坏,直接由游戏的帧率决定,而游戏的帧率则受 ...

随机推荐

  1. jmeter接口测试实践

    一.什么是接口测试? 接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点.测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻 ...

  2. js与php传递参数

    这个问题在网页开发时经常遇到,其实解决办法非常简单,就是几行代码的事,不过各种js.php书上都没有,百度下来也乱七八糟的,有的能用,有的不能用.小编遇到这问题时认认真真研究了一上午,研究出一点心得, ...

  3. win32 安装 xcache扩展

    今天整了一上午,才整明白. 我的系统是是 win7 32位 ,用的环境是 Wamp,php版本是5.3.5,后来在http://xcache.lighttpd.net/pub/Releases/3.0 ...

  4. Objective-C 关于静态方法与实例方法的转载

    objective-c中非常重要的语法知识,在此归纳总结一下. 类方法,也称静态方法,指的是用static关键字修饰的方法.此方法属类本身的方法,不属于类的某一个实例(对象).类方法中不可直接使用实例 ...

  5. Firebug及YSlow简介与使用图文详解

    Firebug本是Firefox浏览器下一个出色的网页设计插件,随着浏览器的发展,Firebug也推出了支持IE.Opera.Chrome的Firebug Lite.凭借Firebug的出色代码调试功 ...

  6. POJ2185(KMP)

    Milking Grid Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 7896   Accepted: 3408 Desc ...

  7. Spark:控制日志输出级别

    Spark:控制日志输出级别 终端修改 在pySpark终端可使用下面命令来改变日志级别 sc.setLogLevel("WARN") # 或者INFO等 修改日志设置文件 ** ...

  8. MVC 5 on Windows Server 2008/IIS 7

    将网站部署在2008上,结果出现了 HTTP Error 403.14 - Forbidden The Web server is configured to not list the content ...

  9. Jenkins的安装与系统配置

    Jenkins的安装 Jenkins的安装需要一个安装包:http://pan.baidu.com/s/1hqQBruc,也可以去Jenkins官网上下载,Jenkins的官网地址 http://Je ...

  10. java初级开发程序员(初识java)

    据我们老师讲说:“学习java高级语言,每个程序员最初写的一个程序就是helloword,向世界打招呼! public class HelloWord{   //必须和文件名相同 public sta ...