Установка собственного шейдера портит масштаб и положение спрайта

Я использую пользовательский шейдер на 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();

И это тот шейдер, который я пытаюсь использовать (простой, когда это сработает, измените его на стиль наложения фотошопа)

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);
}   

У меня вопрос, что я делаю не так? Первое, что приходит мне в голову, это то, что указатели атрибутов, используемые в вершинном шейдере, неверны, но сейчас я использую вершинный шейдер по умолчанию.

1 ответ

Решение

Я нашел решение в другом посте, поэтому я просто процитирую его и ссылку на этот пост:

Нашел решение. Вертикальный шейдер не должен использовать матрицу MVP, поэтому я загрузил ccPositionTextureColor_noMVP_vert вместо ccPositionTextureA8Color_vert.

Странное смещение по оси Y с использованием пользовательского фрагмента шейдера (Cocos2d-x)

Другие вопросы по тегам