Ошибка альфа-фрагментного шейдера OpenGLES 2.0?

Я ожидаю, что моя текстура полностью исчезнет со следующим фрагментным шейдером:

varying mediump vec2 text_coord_out;
uniform sampler2D sampler;

void main()
{
    gl_FragColor = texture2D(sampler, text_coord_out);
    gl_FragColor.w *= 0.0;
}

. . .это не так. Я также пробовал gl_FragColor.a. Мысли?


person jbg    schedule 24.07.2011    source источник


Ответы (4)


OMG ... Я полностью исправил это. Фрагментный шейдер выглядит так:

varying mediump float text_alpha_out;
varying mediump vec2 text_coord_out;
uniform sampler2D sampler;

void main()
{
    gl_FragColor = texture2D(sampler, text_coord_out);
    gl_FragColor = gl_FragColor * text_alpha_out;
}

и мое смешивание выглядит так:

glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
person jbg    schedule 25.07.2011
comment
Вы можете вызвать gl_fragColor= только один раз для каждой шейдерной программы. Вторые вызовы игнорируются. - person George; 14.05.2013
comment
Можете ли вы абсолютно точно вызвать gl_fragColor = более одного раза. Вторые вызовы не игнорируются. Я делаю это все время. - person badweasel; 21.09.2013

Используйте gl_fragColor = только один раз

  1. выполнять все операции с разными переменными, например, с другим vec4 в этом случае
  2. вы можете использовать это как вывод, например:

vec4 red = vec4( 1,0,0,1 );
gl_fragColor = red;
person Patt Mehta    schedule 03.08.2012
comment
Я сомневаюсь. Второй вызов gl_FragColor в моем эксперименте не игнорируется. - person Ming; 13.10.2014

Почему он должен исчезнуть? Альфа-значение выходного цвета не имеет значения, если вы не придадите ему значение. Как правило, это означает использование некоторой формы смешивания. Обратите внимание, что ссылка описывает настольный OpenGL; аналог GL ES работает почти так же, но GL для настольных ПК может иметь больше возможностей, чем ES.

person Nicol Bolas    schedule 24.07.2011
comment
Спасибо. Это сблизило меня. Я перешел от ` ' glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); ' to: ' glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD); glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA, GL_ZERO); ', но повторно вводит: http://stackoverflow.com/questions/6060578/iphone-opengles-2-0-text-texture-w-strange-border-not-stroke-issue - person jbg; 24.07.2011
comment
Проблема в том, что у меня есть текстуры с предварительно умноженной альфой. . .который не работает с GL_SRC_ALPHA в качестве первого аргумента для функций смешивания. . .но если я использую GL_ONE, то смешивание просто не происходит в шейдере. . .Мысли? - person jbg; 24.07.2011
comment
@datafatmunger: смешивание не должно происходить в шейдере. Так что я не уверен, в чем твоя проблема. - person Nicol Bolas; 24.07.2011

gl_FragColor.w = 0;

должно сработать. Вероятно, операция *= сбивает с толку компилятор GLSL.

person Kibernetik    schedule 03.07.2018