在WP8,Cocos2d-x 2.2中,如何使用自定义shader?

HI~
我有一个将画面转向黑白的简单shader,片段着色器代码如下:

#ifdef GL_ES
precision mediump float;
#endif

varying vec2 v_texCoord;
uniform sampler2D u_texture;

void main() {
    vec4 color = texture2D(u_texture, v_texCoord);
    float grey = color.r * 0.299 + color.g * 0.587 + color.b * 0.114;    
    gl_FragColor = vec4(grey*1.13, grey*1.13, grey*1.13,texture2D(u_texture, v_texCoord).a);
}
```



但是如果我直接在C++代码中如下代码加载:

CCGLProgram *shaderProgram_ = new CCGLProgram();
    shaderProgram_->initWithVertexShaderByteArray(vsh, fsh);
    shaderProgram_->addAttribute(kCCAttributeNamePosition, kCCVertexAttrib_Position);
    shaderProgram_->addAttribute(kCCAttributeNameTexCoord, kCCVertexAttrib_TexCoords);
    shaderProgram_->link();
    shaderProgram_->updateUniforms();
    CCShaderCache::sharedShaderCache()->addProgram(shaderProgram_, "grayShader");
```


渲染的结果确实不成功的,并且有OpenGL error.

WP8平台不支援运行时编译shader,Cocos2d-x 2.2使用了precompiledshaders.h里面来存储预编译好的shader.

那么我该如何做呢?

比如说如何将我的shader预编译,然后给Cocos2d-x WP8可用?

Thanks.

自己顶~~~~~~~~

找到了一条路,自己编译winrtcompiler.exe,然后通过这个来预编译自己shader的二进制代码。

然后再修改precompiledshaders.h文件,将自己的代码按照里面的格式添加进去。

当然得先计算好SHA值。

问题在于,我预编译生成的二进制码似乎各种不能用,即使一个kCCShaderType_PositionTexture shader也不行。

难道是winrtcompiler.exe版本或者参数的问题?

我的参数:
bin\winrtcompiler.exe -o=shader_wp8.h -p=wp8 -a=gProgram -v=shader.vert -f=shader.frag

解决了。

但是非常愚蠢的方式。

问题解决,写了篇blog,希望能帮助到后来者:
http://www.ispinel.com/2014/07/03/12393/



#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_PMatrix * a_position;
    v_fragmentColor = a_color;
    v_texCoord = a_texCoord;
}


CC_PMatrix 这个东西, 怎么替换呢…
我也编译出 winrtcompiler.exe 了

C:\Users\win8\Documents\angle\src\winrtcompiler>bin\winrtcompiler.exe -o=shader_gray_wp8.h -p=wp8 -a=gProgram -v=noMVP.vert -f=gray.frag
Compiling for Windows Phone 8 at ANGLE_D3D_FEATURE_LEVEL_9_3
Failed to compile vertex shader(s) due to:
ERROR: 0:16: ‘CC_PMatrix’ : undeclared identifier

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

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;
uniform sampler2D CC_Texture0;
uniform sampler2D CC_Texture1;
uniform sampler2D CC_Texture2;
uniform sampler2D CC_Texture3;

void main()
{
gl_Position = CC_PMatrix * a_position;
v_fragmentColor = a_color;
v_texCoord = a_texCoord;
}

:2::2:

在 iOS 下编译上面给出的 顶点着色器, 发现



cocos2d: cocos2d: ERROR: Failed to compile shader:
precision highp float;
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;
uniform sampler2D CC_Texture0;
uniform sampler2D CC_Texture1;
uniform sampler2D CC_Texture2;
uniform sampler2D CC_Texture3;
//CC INCLUDES END

attribute vec4 a_position;
attribute vec4 a_color;

uniform mat4 CC_MVPMatrix;

// .... 省略 ..

cocos2d: cocos2d: ERROR: 0:18: Regular non-array variable 'CC_MVPMatrix' may not be redeclared


重复定义了 CC_MVPMatrix, 这个东西是由 引擎传递进来的, 也就是说作为资源文件时, 得去掉


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;
uniform sampler2D CC_Texture0;
uniform sampler2D CC_Texture1;
uniform sampler2D CC_Texture2;
uniform sampler2D CC_Texture3;

这些定义…