#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 — альфа;