【发布时间】:2014-09-16 00:52:44
【问题描述】:
我正在使用 Cocos2d-X 2.2.3 和 Marmalade SDK 7.4 开发一个游戏,我创建了一个片段着色器来降低我的一些精灵的饱和度,或者换句话说,从它们中移除所有颜色并仅以阴影显示它们灰色(黑白)。
我写的shader是这个:
#ifdef GL_ES
precision mediump float;
#endif
varying vec2 v_texCoord;
uniform sampler2D u_texture;
void main()
{
float grayScaleValue;
vec3 originalColor;
originalColor = texture2D(u_texture, v_texCoord).rgb;
grayScaleValue = 0.21 * originalColor.r + 0.72 * originalColor.g + 0.07 * originalColor.b;
gl_FragColor = vec4(grayScaleValue, grayScaleValue, grayScaleValue, 1);
}
我采用算法从this页面计算灰度值。
我用来加载这个着色器的代码如下:
// Please note that the class: GameObjectSprite is a subclass of CCSprite.
void GameObjectSprite::initShaders()
{
const GLchar *shaderSource = (const GLchar*) CCString::createWithContentsOfFile("shaders/Grayscale.fsh")->getCString();
shader = new CCGLProgram();
shader->initWithVertexShaderByteArray(ccPositionTextureA8Color_vert, shaderSource);
shader->addAttribute(kCCAttributeNamePosition, kCCVertexAttribFlag_Position);
shader->addAttribute(kCCAttributeNameColor, kCCVertexAttribFlag_TexCoords);
CHECK_GL_ERROR_DEBUG();
shader->link();
shader->updateUniforms();
CHECK_GL_ERROR_DEBUG();
this->setShaderProgram(shader);
this->getShaderProgram()->use();
}
不幸的是,我的着色器无法正常工作,精灵显示正常颜色,就像我没有对它们的着色器进行任何更改一样。
【问题讨论】:
-
在绘制精灵时也必须应用着色器。在绘图代码的某处,您需要有一个
getShaderProgram()->use();。 -
嗨,实际上我认为问题在于我使用 Sprite Batch Node 来渲染我的精灵。我相信批处理节点会覆盖每个精灵的绘制调用,这就是为什么没有发生任何事情的原因。但是我仍然有一个问题,现在我实际上正在使用我的着色器,我所有的精灵都消失了。我更改了我的代码,所以它只有:
gl_FragColor = texture2D(u_texture, v_texCoord);,就像普通的着色器一样,但我的精灵仍然丢失。注意:我还在 draw 方法中添加了getShaderProgram()->use();。 -
这可能是顶点着色器的问题。您必须确保正确设置矩阵,以便转换顶点。
-
好吧,我相信我正在使用标准的顶点着色器 (
ccPositionTextureA8Color_vert)。我正在使用它来将精灵的位置发送到着色器:shader->addAttribute(kCCAttributeNamePosition, kCCVertexAttribFlag_Position);。还有什么我应该做的吗? -
是的,该位置可能乘以一个矩阵(MVP 矩阵),该矩阵是该着色器的统一变量。您必须在绘制之前设置该变量。
标签: opengl opengl-es cocos2d-x marmalade