Вопрос по OpenGL ES 2.0 и тестам Alpha / Stencil - PullRequest
1 голос
/ 23 марта 2011

У меня есть квад, покрывающий область между -0,5, 0,5 и 0,5, -0,5 на очищенном окне просмотра с трафаретом и альфа-буфером. В фрагментном шейдере я применяю текстуру, которая имеет форму, в данном случае круг, за пределами которого она полностью прозрачна.

Я пытаюсь выяснить, как я могу «вырезать» эту не-альфа-текстурированную фигуру из следующего рисунка фигуры, чтобы я нарисовал первый квад, со смещением в некоторой степени (скажем, между -0,3, 0,5 и 0,8, -0,5) и снова рисуем, а из текстуры второго квада рисуется только неперекрытие не альфа-текстуры.

Достаточно легко сделать это с помощью буфера трафарета, чтобы он применялся к квадру и был незаметен для текстуры, однако я хотел бы применить его к текстуре.

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

1 Ответ

4 голосов
/ 25 марта 2011

Я думаю, что вы хотите придерживаться буфера трафарета, но альфа-тест не доступен в ES 2.0 из-за философии, что все, что можно сделать в шейдере, не поставляется с фиксированной функциональностью.

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

varying mediump vec2 texCoordVarying;
uniform sampler2D tex2D;

void main()
{
    gl_FragColor = texture2D(tex2D, texCoordVarying);
}

. Вы можете добавить альфа-тест, чтобы пиксели с альфа-значением менее 0,1 не проходили по конвейеру и, следовательно, не влияли натрафаретный буфер с:

varying mediump vec2 texCoordVarying;
uniform sampler2D tex2D;

void main()
{
    vec4 colour = texture2D(tex2D, texCoordVarying);

    if(colour.a > 0.1)
        gl_FragColor = colour;
    else
        discard;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...