Шейдер Opengl, каковы альфа-компоненты gl_FragColor?

#opengl-es #glsl #shader #cocos2d-x

#opengl-es #glsl #шейдер #cocos2d-x

Вопрос:

Я думаю, что это будет немного простой ответ.
Но я не могу найти ответ с помощью Google.
Это шейдер OpenGLES. Я использую движок cocos2d-x.

Это мой фрагмент кода шейдера.

 precision lowp float;
varying vec2 v_texCoord;
uniform sampler2D u_texture;
uniform vec4 u_lightPosition;

void main()
{
    vec4 col=texture2D(u_texture,v_texCoord);

    mediump float lightDistance = distance(gl_FragCoord, u_lightPosition);
    mediump float alpha = 100.0/lightDistance;
    alpha = min(alpha, 1.0);
    alpha = max(alpha, 0.0);
    col.w = alpha;
    //col.a = alpha;


    gl_FragColor=col;

}
  

Я просто хочу придать непрозрачность некоторой области круга. Итак, я изменил значение цвета w, потому что думал, что это альфа-значение текселя. Но результат был очень странным.
Я боюсь, что это не альфа-значение.

Даже если я установлю значение 1.0 для тестирования, весь спрайт изменится на яркий и белый.

Его вершинный шейдер очень обычный, в нем нет ничего особенного для прикрепления.

Любая идея, пожалуйста.

Обновлено: Для справки я прилагаю некоторое изображение результата.

случай 1)

 col.w = alpha;
  

введите описание изображения здесь

случай 2)

 col.w = 1.0
  

введите описание изображения здесь

и нормальная текстура перед нанесением шейдера.)

введите описание изображения здесь

Комментарии:

1. Похоже, вы спрашиваете, что означает w-компонент vec4, назначенный gl_FragColor.

2. В результате, вы правы, gl_FragColor — это w . 🙂

3. Я поместил образец результата. 🙂

4. Какой у вас режим наложения?

5. Как сказал Томми, вы должны добавить свой текущий режим наложения в вопрос. Кстати, вы можете заменить свои минимальные / максимальные строки на clamp вот так: clamp(alpha, 0.0, 1.0) .

Ответ №1:

Справочная карта GL ES 2.0 определяет:

Переменная
mediump vec4 gl_FragColor;

Описание
цвет фрагмента

Единицы измерения или система координат
Цвет RGBA

Далее говорится:

Векторные компоненты
В дополнение к синтаксису числового индекса массива, имена векторных компонентов обозначаются одной буквой. Компоненты могут быть обработаны и реплицированы, например: pos.xx, pos.zy

{x, y, z, w} Используется при доступе к векторам, которые представляют точки или нормали

{r, g, b, a} Используется при доступе к векторам, представляющим цвета

{s, t, p, q} Используется при доступе к векторам, которые представляют координаты текстуры

Итак, конечно, использование .a было бы более идиоматичным, но это явно тот случай, когда то, что вы сохраняете, .w является выходной альфа для gl_FragColor .

Чтобы ответить на вопрос, который вы задали в качестве заголовка, а не вопроса в теле, значение, возвращаемое texture2D , будет таким, какое правильно для этой текстуры. Либо фактическое сохраненное значение, если текстура имеет значение GL_RGBA или GL_LUMINANCE_ALPHA , либо еще 1.0.

Итак, вы выводите альфа-код правильно.

Если ваша выходная альфа-версия не имеет ожидаемого эффекта микширования, то вы, должно быть, glBlendFunc установили что-то неожиданное, возможно, включающее GL_CONSTANT_COLOR .

Комментарии:

1. Спасибо. Теперь это работает хорошо. vec4 col= Texture2D(u_texture,v_texCoord); среднее значение float lightDistance = расстояние (gl_FragCoord, u_lightPosition); среднее значение float alpha = 100.0/ lightDistance; альфа = clamp (альфа, 0.0, 1.0); gl_FragColor.a = 1.0 — альфа;