Я пытаюсь отобразить текстуру в буфере трафарета. Мне нужны только пиксели, где их альфа -> 0, но мой код визуализирует каждый пиксель моего квада - даже те, у которых 0 альфа. Как я могу избежать этого?Как написать только альфа> 0 в буфер трафарета?
Heres мой код:
GL.StencilOp(StencilOp.Keep, StencilOp.Keep, StencilOp.Incr);
GL.ColorMask(false, false, false, false);
GL.DepthMask(false);
RenderMask(mask);
GL.StencilFunc(StencilFunction.Equal, 1, 0xFF);
GL.StencilOp(StencilOp.Keep, StencilOp.Keep, StencilOp.Keep);
GL.ColorMask(true, true, true, true);
GL.DepthMask(true);
При отладке с RenderDoc я вижу, что буфер трафарета содержит 1s, где моя текстура ... но прямоугольник, он не принимает во внимание альфа.
Heres мой пиксельный шейдер (он отлично работает для нормального рендеринга):
varying lowp vec4 vColor;
varying lowp vec2 vTexCoords;
uniform lowp sampler2D uTexture;
void main() {
gl_FragColor = texture2D(uTexture, vTexCoords) * vColor;
}
Спасибо! Это единственное решение в GL ES (я тоже могу использовать 3.0)? Моя проблема в том, что сбрасывание происходит медленно на iOS. – sydd
Без изменения геометрии да. В общем, «лучшее» исправление для прозрачных спрайтов - использовать хорошо подобранную геометрию, которая изолирует полностью непрозрачные части и отбирает прозрачные части, поэтому вы не делаете высокий процент пикселей, которые не приносят ничего полезного. Что-то вроде этого: https://community.arm.com/groups/arm-mali-graphics/blog/2015/11/19/mali-performance-7-accelerating-2d-rendering-using-opengl-es – solidpixel