Unity 3 d Shader(三)Pass(Alpha testing)植物の透明剪断
7563 ワード
The alpha test is a last chance to reject a pixel from being written to the screen.
透明度テストは、ピクセルがスクリーンに書き込まれるのを阻止する最後の機会です.
After the final output color has been calculated, the color can optionally have its alpha value compared to a fixed value. If the test fails, the pixel is not written to the display.
最終的にレンダリングされたカラーを計算した後、カラーの透明度値と固定値を比較することを選択します.比較の結果が失敗した場合、ピクセルは表示出力に書き込まれません.
AlphaTest Off
Render all pixels (default).
すべてのピクセルをレンダリング(デフォルト)
AlphaTest
comparison AlphaValue
Set up the alpha test to only render pixels whose alpha value is within a certain range.
透明度テストを設定すると、特定の範囲内の透明度値のピクセルのみがレンダリングされます.
Comparison is one of the following words:
次の言葉を比較します.
Greater
Only render pixels whose alpha is greater than AlphaValue.より大きい
GEqual
Only render pixels whose alpha is greater than or equal to AlphaValue.以上
Less
Only render pixels whose alpha value is less than AlphaValue.より小さい
LEqual
Only render pixels whose alpha value is less than or equal to from AlphaValue.以下
Equal
Only render pixels whose alpha value equals AlphaValue.に等しい
NotEqual
Only render pixels whose alpha value differs from AlphaValue.等しくない
Always
Render all pixels. This is functionally equivalent to AlphaTest Off.すべてのピクセルをレンダーすると、透明度テストAlphaTest Offをオフにします.
Never
Don't render any pixels.ピクセルをレンダリングしない
A floating-point number between 0 and 1. This can also be a variable reference to a float or range property, in which case it should be written using the standard square bracket notation ([VariableName]).
0~1の範囲の浮動小数点値.浮動小数点属性または範囲属性を指すインデックスであるもよく、後者の場合は(変数名)のように標準的な角括弧でインデックス名を表記する必要がある.
The alpha test is important when rendering concave objects with transparent parts. The graphics card maintains a record of the depth of every pixel written to the screen. If a new pixel is further away than one already rendered, the new pixel is not written to the display. This means that even with Blending, objects will not show through.
このグラフでは、左側のツリーが透明度テストを使用します.グラフィック上のピクセルが完全に透明または不透明であることに注意してください.中間のツリーは透明度ブレンドのみを使用してレンダリングされます.深度バッファのためにブランチに近い透明な部分が、より遠い葉をどのように上書きするかに注意してください.右側のツリーは、次の例のシェーダによってレンダリングされます.ブレンドと透明度テストの組み合わせによって人工的な痕跡が隠されることができます.
In this figure, the tree on the left is rendered using AlphaTest. Note how the pixels in it are either completely transparent or opaque. The center tree is rendered using only Alpha Blending - notice how transparent parts of nearby branches cover the distant leaves because of the depth buffer. The tree on the right is rendered using the last example shader - which implements a combination of blending and alpha testing to hide any artifacts.
The simplest possible example, assign a texture with an alpha channel to it. The object will only be visible where alpha is greater than 0.5
最も簡単な例は、透明度のあるチャネルを持つテクスチャを使用します.オブジェクトは、透明度が0.5より大きい場合にのみ表示されます.
This is not much good by itself. Let us add some lighting and make the cutoff value tweakable:
これはあまりよくありません.照明を増やし、カット値を調整します.
When rendering plants and trees, many games have the hard edges typical of alpha testing. A way around that is to render the object twice. In the first pass, we use alpha testing to only render pixels that are more than 50% opaque. In the second pass, we alpha-blend the graphic in the parts that were cut away, without recording the depth of the pixel. We might get a bit of confusion as further away branches overwrite the nearby ones, but in practice, that is hard to see as leaves have a lot of visual detail in them.
木や植物をレンダリングすると、透明度テストで多くのゲームで鋭いエッジが表示されます.この問題を解決する方法の1つは、オブジェクトを2回レンダリングすることです.最初のチャネルでは、透明度が50%を超えるピクセルのみをレンダリングします.2番目のチャネルでは、ピクセルの深さを記録することなく、前回カットした部分を透明度でブレンドします.いくつかの源の枝を近い枝で覆う可能性があるが,実際には葉に多くの視覚的細部がある場合,このような欠陥を見ることは難しい.
Note that we have some setup inside the SubShader, rather than in the individual passes. Any state set in the SubShader is inherited as defaults in passes inside it.
サブシェーダで行ったいくつかの設定に注意してください.個別のチャネルでも.サブシェーダで行った設定は、チャネルによって既定値に継承されます.
透明度テストは、ピクセルがスクリーンに書き込まれるのを阻止する最後の機会です.
After the final output color has been calculated, the color can optionally have its alpha value compared to a fixed value. If the test fails, the pixel is not written to the display.
最終的にレンダリングされたカラーを計算した後、カラーの透明度値と固定値を比較することを選択します.比較の結果が失敗した場合、ピクセルは表示出力に書き込まれません.
Syntax構文
AlphaTest Off
Render all pixels (default).
すべてのピクセルをレンダリング(デフォルト)
AlphaTest
comparison AlphaValue
Set up the alpha test to only render pixels whose alpha value is within a certain range.
透明度テストを設定すると、特定の範囲内の透明度値のピクセルのみがレンダリングされます.
Comparison対照表
Comparison is one of the following words:
次の言葉を比較します.
Greater
Only render pixels whose alpha is greater than AlphaValue.より大きい
GEqual
Only render pixels whose alpha is greater than or equal to AlphaValue.以上
Less
Only render pixels whose alpha value is less than AlphaValue.より小さい
LEqual
Only render pixels whose alpha value is less than or equal to from AlphaValue.以下
Equal
Only render pixels whose alpha value equals AlphaValue.に等しい
NotEqual
Only render pixels whose alpha value differs from AlphaValue.等しくない
Always
Render all pixels. This is functionally equivalent to AlphaTest Off.すべてのピクセルをレンダーすると、透明度テストAlphaTest Offをオフにします.
Never
Don't render any pixels.ピクセルをレンダリングしない
AlphaValue
A floating-point number between 0 and 1. This can also be a variable reference to a float or range property, in which case it should be written using the standard square bracket notation ([VariableName]).
0~1の範囲の浮動小数点値.浮動小数点属性または範囲属性を指すインデックスであるもよく、後者の場合は(変数名)のように標準的な角括弧でインデックス名を表記する必要がある.
Details詳細
The alpha test is important when rendering concave objects with transparent parts. The graphics card maintains a record of the depth of every pixel written to the screen. If a new pixel is further away than one already rendered, the new pixel is not written to the display. This means that even with Blending, objects will not show through.
このグラフでは、左側のツリーが透明度テストを使用します.グラフィック上のピクセルが完全に透明または不透明であることに注意してください.中間のツリーは透明度ブレンドのみを使用してレンダリングされます.深度バッファのためにブランチに近い透明な部分が、より遠い葉をどのように上書きするかに注意してください.右側のツリーは、次の例のシェーダによってレンダリングされます.ブレンドと透明度テストの組み合わせによって人工的な痕跡が隠されることができます.
In this figure, the tree on the left is rendered using AlphaTest. Note how the pixels in it are either completely transparent or opaque. The center tree is rendered using only Alpha Blending - notice how transparent parts of nearby branches cover the distant leaves because of the depth buffer. The tree on the right is rendered using the last example shader - which implements a combination of blending and alpha testing to hide any artifacts.
Examplesの例
The simplest possible example, assign a texture with an alpha channel to it. The object will only be visible where alpha is greater than 0.5
最も簡単な例は、透明度のあるチャネルを持つテクスチャを使用します.オブジェクトは、透明度が0.5より大きい場合にのみ表示されます.
Shader "Simple Alpha Test" {
Properties {
_MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
}
SubShader {
Pass {
// Only render pixels with an alpha larger than 50%
// 50%
AlphaTest Greater 0.5
SetTexture [_MainTex] { combine texture }
}
}
}
This is not much good by itself. Let us add some lighting and make the cutoff value tweakable:
これはあまりよくありません.照明を増やし、カット値を調整します.
Shader "Cutoff Alpha" {
Properties {
_MainTex ("Base (RGB) Transparency (A)", 2D) = "" {}
_Cutoff ("Alpha cutoff", Range (0,1)) = 0.5
}
SubShader {
Pass {
// Use the Cutoff parameter defined above to determine
// what to render.
// Cutoff
AlphaTest Greater [_Cutoff]
Material {
Diffuse (1,1,1,1)
Ambient (1,1,1,1)
}
Lighting On
SetTexture [_MainTex] { combine texture * primary }
}
}
}
When rendering plants and trees, many games have the hard edges typical of alpha testing. A way around that is to render the object twice. In the first pass, we use alpha testing to only render pixels that are more than 50% opaque. In the second pass, we alpha-blend the graphic in the parts that were cut away, without recording the depth of the pixel. We might get a bit of confusion as further away branches overwrite the nearby ones, but in practice, that is hard to see as leaves have a lot of visual detail in them.
木や植物をレンダリングすると、透明度テストで多くのゲームで鋭いエッジが表示されます.この問題を解決する方法の1つは、オブジェクトを2回レンダリングすることです.最初のチャネルでは、透明度が50%を超えるピクセルのみをレンダリングします.2番目のチャネルでは、ピクセルの深さを記録することなく、前回カットした部分を透明度でブレンドします.いくつかの源の枝を近い枝で覆う可能性があるが,実際には葉に多くの視覚的細部がある場合,このような欠陥を見ることは難しい.
Shader "Vegetation" {
Properties {
_Color ("Main Color", Color) = (.5, .5, .5, .5)
_MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {}
_Cutoff ("Base Alpha cutoff", Range (0,.9)) = .5
}
SubShader {
// Set up basic lighting
//
Material {
Diffuse [_Color]
Ambient [_Color]
}
Lighting On
// Render both front and back facing polygons.
//
Cull Off
// first pass:
// render any pixels that are more than [_Cutoff] opaque
// [_Cutoff]
Pass {
AlphaTest Greater [_Cutoff]
SetTexture [_MainTex] {
combine texture * primary, texture
}
}
// Second pass:
// render in the semitransparent details.
//
Pass {
// Dont write to the depth buffer
//
ZWrite off
// Don't write pixels we have already written.
//
ZTest Less
// Only render pixels less or equal to the value
//
AlphaTest LEqual [_Cutoff]
// Set up alpha blending
//
Blend SrcAlpha OneMinusSrcAlpha
SetTexture [_MainTex] {
combine texture * primary, texture
}
}
}
}
Note that we have some setup inside the SubShader, rather than in the individual passes. Any state set in the SubShader is inherited as defaults in passes inside it.
サブシェーダで行ったいくつかの設定に注意してください.個別のチャネルでも.サブシェーダで行った設定は、チャネルによって既定値に継承されます.