2016-09-21 82 views
0

我正在嘗試將紋理渲染到模板緩衝區。我只需要alpha值大於0的像素,但是我的代碼渲染了我的四邊形的每個像素 - 即使是0 alpha的像素。我怎樣才能避免這種情況?如何將僅alpha> 0寫入模板緩衝區?

繼承人我的代碼:

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在我的質地是調試...但它是一個矩形,它沒有考慮阿爾法考慮。

我的繼承人片段着色器(它工作正常,正常渲染):

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