本文原链接:http://www.cnblogs.com/zouzf/p/3995132.html

有时候想得到一些例如灰度图等特殊的渲染效果,就得用到自定义shader,关于shader的一些背景知识,自行谷歌,列出两篇cocos2dx里介绍shader的相关文章 http://blog.csdn.net/while0/article/details/9666829     http://blog.sina.com.cn/s/blog_aa01f7030101mdom.html

cocos2dx在wp8平台不知道是不是在渲染时OpenGL要转成D3D的原因还是其他原因,不能在运行时编译链接shader,cocos2dx的做法就是事先把相关的shader编译好成特定的机器码存放到 precompiledshaders.h 文件里,通过预先生成好的sha1码指向不同的shader,运行时直接获取,关于这部分,参考了: http://www.ispinel.com/2014/07/03/12393/。 现在需要做的工作就是,给出了顶点shader和片元shader,如何生成机器码,这部分参考了  http://cn.cocos2d-x.org/tutorial/show?id=1274 。 本文采用了第二种方法,使用winrtcompiler.exe生成shader的机器码,以使用自定义灰度图shader为例,具体做法如下。

顶点shader文件——myShader.vert:

 uniform mat4 CC_PMatrix;
uniform mat4 CC_MVMatrix;
uniform mat4 CC_MVPMatrix;
uniform vec4 CC_Time;
uniform vec4 CC_SinTime;
uniform vec4 CC_CosTime;
uniform vec4 CC_Random01;
attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color; #ifdef GL_ES
varying lowp vec4 v_fragmentColor;
varying mediump vec2 v_texCoord;
#else
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
#endif void main()
{
gl_Position = CC_MVPMatrix * a_position;
v_fragmentColor = a_color;
v_texCoord = a_texCoord;
}

片元shader文件——myShader.frag文件

 #ifdef GL_ES
precision lowp float;
#endif varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
uniform sampler2D CC_Texture0; void main()
{
vec4 texColor = v_fragmentColor * texture2D(CC_Texture0, v_texCoord);
float gray = dot(texColor.rgb, vec3(0.299,0.587,0.114));
gl_FragColor = vec4(gray, gray, gray, texColor.a);
}

winrtcompiler.exe 文件下载

使用命令行通过 顶点shader文件、片元shader文件和winrtcompiler.exe文件生成机器码文件:把winrtcompiler.exe 、顶点shader文件和片元shader文件拷到统一文件夹里,通过cd 命令进入到那个文件夹,然后输入命令行如下:winrtcompiler.exe -o=shader_wp8.h -p=wp8 -a=gProgram -v=myShader.vert -f=myShader.frag      ,生成的机器码就在 -o 参数所指向的 shader_wp8.h 文件里了。

把机器码更新到precompiledshaders.h 文件里,包括 num、length、program和programKey,programKey就是根据myShader.vert文件和myShader.frag文件得到的sha1码。最后一个问题,如何获取到这个sha1码?

可以参考 http://www.cnblogs.com/yeshanghai/p/cocos2dx_shader.html 的 1~5 点,不过需要改动一下

第1点的改动:把我们上面的myShader.vert和myShader.frag文件改造一下,也就是前后加上双引号、最后加上分号、每一行(除了最后分号那行)后面加上 \n\ 符号,因为这次是需要在运行时被动态加载编译的。

其他步骤的改动就是,原文只有片元shader,需要补上顶点shader的相关信息。

最后,在 CCPrecompiledShaders.cpp 里的 bool CCPrecompiledShaders::loadProgram(GLuint program, const GLchar* vShaderByteArray, const GLchar* fShaderByteArray) 方法里的 std::string id = computeHash(vShaderByteArray, fShaderByteArray); 代码前断点, 这个id就是顶点shader文件和片元shader文件计算出来的 sha1 值。

本文原链接:http://www.cnblogs.com/zouzf/p/3995132.html

Cocos2d-x项目移植到WP8系列之九:使用自定义shader的更多相关文章

  1. Cocos2d-x项目移植到WP8系列之二:开篇

    原文链接: http://www.cnblogs.com/zouzf/p/3970130.html 开发环境一笔带过吧,主板和CPU要支持虚拟化技术,要开启才行,装个64位win8.1系统,win8不 ...

  2. Cocos2d-x项目移植到WP8系列之三:C++和C#的交互

    原文链接: http://www.cnblogs.com/zouzf/p/3971021.html 上一篇提到工程使用 XAML 和 Direct3D 项目模板 是因为要涉及到C++和C#的交互,微软 ...

  3. Cocos2d-x项目移植到WP8系列之一:前传

    原文链接: http://www.cnblogs.com/zouzf/p/3969993.html 许久没动笔了,随想一直都有动笔的想法,但拖来拖去,归根到底还是一个懒字吧 .发现人的惰性真是太强大了 ...

  4. Cocos2d-x项目移植到WP8系列之八:CCLabelTTF显示中文不换行

    原文链接: http://www.cnblogs.com/zouzf/p/3985330.html 在wp8平台上,CCLabeTTF显示中文不会自动换行,看了下源码,原来底层的实现是根据text的空 ...

  5. Cocos2d-x项目移植到WP8系列之六:C#工程使用C++的DLL

    原文链接: http://www.cnblogs.com/zouzf/p/3984510.html 此时,一些大问题都被解决后,整个工程基本能跑起来了,最后一个大问题是:业务层是用Lua开发的,底层的 ...

  6. Cocos2d-x项目移植到WP8系列之四:文件操作

    原文链接: http://www.cnblogs.com/zouzf/p/3972457.html 读写文件Cocos已经用fopen fwrite来做好了,这里说的主要是文件和文件夹的创建.删除.判 ...

  7. Cocos2d-x项目移植到WP8系列之七:中文显示乱码

    原文链接:http://www.cnblogs.com/zouzf/p/3984628.html C++和C#互调时经常会带一些参数过去例如最常见的字符串,如果字符串里有中文的话,会发现传递过去后变成 ...

  8. Cocos2d-x项目移植到WP8系列之五:播放MP3

    原文链接: http://www.cnblogs.com/zouzf/p/3972549.html 这一块的细节还是不太了解,只是东凑西拼能跑起来而已 1.网上下载lamb库 生成需要的lib库,详情 ...

  9. Cocos2d-x项目移植到WP8小记

    Cocos2d-x项目移植到WP8小记 作者: K.C. 日期: 10/24/2013 Date: 2013-10-24 00:33 Title: Cocos2d-x项目移植到WP8小记 Tags: ...

随机推荐

  1. convolutional neural network 课程笔记

    一.CNN基础 (1)CNN在CV方面的应用 image classification(图像识别).object detection(目标检测).neural style transfer(风格迁移) ...

  2. Laravel5.1 模型 --远层一对多关系

    远层一对多我们可以通过一个例子来充分的了解它: 每一篇文章都肯定有并且只有一个发布者 发布者可以有多篇文章,这是一个一对多的关系.一个发布者可以来自于一个国家 但是一个国家可以有多个发布者,这又是一个 ...

  3. SurvivalShooter学习笔记(八.敌人管理器)

    敌人管理器:管理敌人的随机出生点创建 在场景中建立几个空物体,作为敌人的出生点 public class EnemyManager : MonoBehaviour { public PlayerHea ...

  4. [LintCode] 有效回文串

    class Solution { public: /** * @param s A string * @return Whether the string is a valid palindrome ...

  5. HDU 3578 Greedy Tino(双塔DP)

    Greedy Tino Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. POJ 2609 Ferry Loading(双塔DP)

    Ferry Loading Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1807   Accepted: 509   Sp ...

  7. python中 将字符串和字典的相互转换

    1.首先引入json模块 # 引入json模块 import json 2.转换 #JSON到字典转化: dictinfo = json.loads(json_str) # 输出dict类型 字典到J ...

  8. WebBrowser 控件-说明

    WebBrowser.Document 为活动的文档返回自动化对象,引用 Microsoft HTML Object Library 可查看详细属性和方法 下面的解说假设窗体中有一个名称为 Web1 ...

  9. 洛谷 P2467 [SDOI2010]地精部落

    洛谷 我讲的应该没有这个[https://www.luogu.org/blog/user55639/solution-p2467]清楚. 贴个代码算了: #include <bits/stdc+ ...

  10. LAMP兄弟连 视频教程集

    电驴的资源:http://www.verycd.com/topics/2843130/?ref=msg