本文原链接: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. AngularJS bind

    闲着无聊怕手生 小练习 <!DOCTYPE html><html><head><meta charset="utf-8"><s ...

  2. 【转】CStdioFile UNICODE编译 英文系统下读取中文汉字乱码解决

    转载出处:http://www.cnblogs.com/ct0421/p/3242418.html 函数原形为:char *setlocale( int category, const char *l ...

  3. JAVA基础面试(四4)

    31.String s = new String("xyz");创建了几个StringObject?是否可以继承String类? 两个或一个都有可能,”xyz”对应一个对象,这个对 ...

  4. 【BZOJ1283/3550】序列/[ONTAK2010]Vacation 最大费用流

    [BZOJ1283]序列 Description 给出一个长度为 的正整数序列Ci,求一个子序列,使得原序列中任意长度为 的子串中被选出的元素不超过K(K,M<=100) 个,并且选出的元素之和 ...

  5. <td></td>之间的&nbsp;

    今天开发中遇到了一个很丢脸的事:我把下图中别人写的 给去掉了,我觉得这个很多余,结果被在大神们痛斥了一顿.因为去掉这个 会导致td之间没有数据时td的边框不显示的问题,所以几下这个惨痛的教训,以自警. ...

  6. 《挑战程序设计竞赛》2.6 数学问题-快速幂运算 POJ1995

    POJ3641 此题应归类为素数. POJ1995 http://poj.org/problem?id=1995 题意 求(A1^B1+A2^B2+ - +AH^BH)mod M. 思路 标准快速幂运 ...

  7. python的进程与线程

    一.进程与线程的相关概念 1.什么是进程 进程是一个程序在一个数据集上的一次动态执行过程. 进程一般由程序,数据集,进程控制块三部分组成. 2.什么是线程 线程也叫轻量级进程,它是一个基本的CPU执行 ...

  8. CSDN2015博客之星评选之拉票环节

    最近接到CSDN邀请,参加了CSDN 2015博客之星 的评选活动,下面是给我拉票的链接地址: http://vote.blog.csdn.net/blogstar2015/candidate?use ...

  9. POJ_1195 Mobile phones 【二维树状数组】

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013912596/article/details/33802561 题目链接:id=1195&qu ...

  10. 使用Xcode改动iOS项目project名和路径名

    对,好.错.改正. ------ 前言 系统 10.9 开发平台 xcode 5.0 旧project名 MyProject-iPad 改动之后 新project名 FjSk-iPad 点击项目,进入 ...