Cocos2d-x项目移植到WP8系列之九:使用自定义shader
2014-09-26 17:08
393 查看
本文原链接:/article/5080072.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:
片元shader文件——myShader.frag文件
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码?
可以参考 /article/5503574.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 值。
本文原链接:/article/5080072.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码?
可以参考 /article/5503574.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 值。
本文原链接:/article/5080072.html
相关文章推荐
- Cocos2d-x项目移植到WP8系列之六:C#工程使用C++的DLL
- Cocos2d-x项目移植到WP8系列之三:C++和C#的交互
- Cocos2d-x项目移植到WP8系列之一:前传
- Cocos2d-x项目移植到WP8系列之五:播放MP3
- Cocos2d-x项目移植到WP8系列之二:开篇
- Cocos2d-x项目移植到WP8系列之七:中文显示乱码
- Cocos2d-x项目移植到WP8系列之八:CCLabelTTF显示中文不换行
- Cocos2d-x项目移植到WP8小记
- Cocos2d-x项目移植到WP8小记
- Cocos2d-x项目移植到WP8小记
- 火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第二十四节:小项目实训《绝命沙滩》
- cocos2d-js Shader系列2:在cc.Sprite上使用Shader(黑白、灰度、造旧效果)
- 使用CYGWin 编译cocos2d 项目 项目并移植到 Android 测试。
- 火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第二节:Cocos引擎开发环境搭建与项目创建!
- Cocos2d-x项目移植到WP8系列之四:文件操作
- Cocos2d-x 3.x 系列教程02-创建自定义项目
- 枫叶天空Cocos2d-x3.0系列教程三 ui教程3 自定义组件和使用CocoStudio UI编辑器
- 火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第二十五节: 3D项目优化方案
- cocos2d-x系列笔记(8)---在cocos2d-x项目中使用curl与web服务器通信
- 使用最新的cocos2d-x-3.4+VS2012创建自定义项目