2016-09-21 10 views
0

テクスチャをステンシルバッファにレンダリングしようとしています。私は、アルファが> 0のピクセルだけが必要ですが、私のコードはクワッドのすべてのピクセルをレンダリングしています - アルファが0のものでさえも。どうすればこれを避けることができますか?α> 0だけをステンシルバッファに書き込む方法は?

はHERESに私のコード:私はステンシルバッファが私のテクスチャがある1S ...しかし、その四角形が含まれていることがわかりRenderDocでデバッグするとき

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); 

、それは考慮にアルファを取ることはありません。

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

関連する問題