设置自定义着色器会弄乱 Sprite 的比例和位置
Setting a custom shader messes up the scale and position of a Sprite
我在 cocos2dx 3.1 上使用自定义着色器试图对用作背景的精灵实现特殊效果(必须覆盖整个屏幕)
但是,如果我不使用着色器,精灵会完美缩放和定位,但当我使用它时,它的显示方式会变小并位于左下角。
这是我加载精灵的方式
this->background_image = Sprite::create(image_name->GetText());
// Add background shader
if (this->background_image)
{
const GLchar *shaderSource = (const GLchar*) CCString::createWithContentsOfFile("OverlayShader.fsh")->getCString();
GLProgram * p = new GLProgram();
p->initWithByteArrays(ccPositionTextureA8Color_vert, shaderSource);
p->link();
p->updateUniforms();
this->background_image->setGLProgram(p);
}
// Classroom will be streched to cover all of the game screen
Size bgImgSize = this->background_image->getContentSize();
Size windowSize = Director::getInstance()->getWinSize();
float xScaleFactor = windowSize.width/bgImgSize.width;
float yScaleFactor = (windowSize.height-MARGIN_SPACE+10)/bgImgSize.height;
this->background_image->setScale(xScaleFactor, yScaleFactor);
this->background_image->setPosition(Vec2(windowSize.width/2.0f,windowSize.height/2.0f + ((MARGIN_SPACE-10)/2.0)));
this->background_image->retain();
这是我正在尝试使用的着色器(一个简单的着色器,一旦它起作用就将其更改为 photoshop 叠加样式的着色器)
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
void main()
{
vec4 v_orColor = v_fragmentColor * texture2D(CC_Texture0, v_texCoord);
float gray = dot(v_orColor.rgb, vec3(0.299, 0.587, 0.114));
gl_FragColor = vec4(gray, gray, gray, v_orColor.a);
}
我的问题是,我做错了什么?我首先想到的是顶点着色器上使用的属性指针不正确,但现在我使用的是默认顶点着色器。
我在另一个 post 上找到了解决方案,所以我只引用它并 link 到那个 post:
Found the solution. The vert shader should not use the MVP matrix so I
loaded ccPositionTextureColor_noMVP_vert instead of
ccPositionTextureA8Color_vert.
Weird y-position offset using custom frag shader (Cocos2d-x)
我在 cocos2dx 3.1 上使用自定义着色器试图对用作背景的精灵实现特殊效果(必须覆盖整个屏幕)
但是,如果我不使用着色器,精灵会完美缩放和定位,但当我使用它时,它的显示方式会变小并位于左下角。
这是我加载精灵的方式
this->background_image = Sprite::create(image_name->GetText());
// Add background shader
if (this->background_image)
{
const GLchar *shaderSource = (const GLchar*) CCString::createWithContentsOfFile("OverlayShader.fsh")->getCString();
GLProgram * p = new GLProgram();
p->initWithByteArrays(ccPositionTextureA8Color_vert, shaderSource);
p->link();
p->updateUniforms();
this->background_image->setGLProgram(p);
}
// Classroom will be streched to cover all of the game screen
Size bgImgSize = this->background_image->getContentSize();
Size windowSize = Director::getInstance()->getWinSize();
float xScaleFactor = windowSize.width/bgImgSize.width;
float yScaleFactor = (windowSize.height-MARGIN_SPACE+10)/bgImgSize.height;
this->background_image->setScale(xScaleFactor, yScaleFactor);
this->background_image->setPosition(Vec2(windowSize.width/2.0f,windowSize.height/2.0f + ((MARGIN_SPACE-10)/2.0)));
this->background_image->retain();
这是我正在尝试使用的着色器(一个简单的着色器,一旦它起作用就将其更改为 photoshop 叠加样式的着色器)
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
void main()
{
vec4 v_orColor = v_fragmentColor * texture2D(CC_Texture0, v_texCoord);
float gray = dot(v_orColor.rgb, vec3(0.299, 0.587, 0.114));
gl_FragColor = vec4(gray, gray, gray, v_orColor.a);
}
我的问题是,我做错了什么?我首先想到的是顶点着色器上使用的属性指针不正确,但现在我使用的是默认顶点着色器。
我在另一个 post 上找到了解决方案,所以我只引用它并 link 到那个 post:
Found the solution. The vert shader should not use the MVP matrix so I loaded ccPositionTextureColor_noMVP_vert instead of ccPositionTextureA8Color_vert.
Weird y-position offset using custom frag shader (Cocos2d-x)