2016-09-21 3 views
0

Я пытаюсь отобразить текстуру в буфере трафарета. Мне нужны только пиксели, где их альфа -> 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; 
} 

ответ

2

Используйте «отбрасывать» заявление в затенении, чтобы отбросить эти фрагменты вы не хотите сохранить.

varying lowp vec4 vColor; 
varying lowp vec2 vTexCoords; 
uniform lowp sampler2D uTexture; 
void main() { 
    vec4 color = texture2D(uTexture, vTexCoords) * vColor; 
    if (color.a == 0.0) { 
    discard; 
    } 
    gl_FragColor = color; 
} 
+0

Спасибо! Это единственное решение в GL ES (я тоже могу использовать 3.0)? Моя проблема в том, что сбрасывание происходит медленно на iOS. – sydd

+1

Без изменения геометрии да. В общем, «лучшее» исправление для прозрачных спрайтов - использовать хорошо подобранную геометрию, которая изолирует полностью непрозрачные части и отбирает прозрачные части, поэтому вы не делаете высокий процент пикселей, которые не приносят ничего полезного. Что-то вроде этого: https://community.arm.com/groups/arm-mali-graphics/blog/2015/11/19/mali-performance-7-accelerating-2d-rendering-using-opengl-es – solidpixel

Смежные вопросы