C#、XNAとその他いろいろについて
かんたんXNA その23 深度バッファ関数
※このページは古いです。
最新版はこちら
さて、深度バッファとは物体の前後関係から
適切に描画するためのデータでした。
カメラからの距離がより小さいときには描画し、
より大きいときには描画しないのです。
こうすることによって近くにあるものは遠くにあるものを隠し、
遠くにあるものは近くにあるものに隠されるのです。
実はこの挙動は変更することが出来ます。
例えば全く逆、カメラからの距離がより大きいときには描画し、
より小さいときには描画しないということができます。
近くにあるものは遠くにあるものに隠れ、
遠くにあるものは近くにあるものを隠すことが可能となるのです!!
(そんなことをして何が楽しいのかは知りませんが)
最新版はこちら
さて、深度バッファとは物体の前後関係から
適切に描画するためのデータでした。
カメラからの距離がより小さいときには描画し、
より大きいときには描画しないのです。
こうすることによって近くにあるものは遠くにあるものを隠し、
遠くにあるものは近くにあるものに隠されるのです。
実はこの挙動は変更することが出来ます。
例えば全く逆、カメラからの距離がより大きいときには描画し、
より小さいときには描画しないということができます。
近くにあるものは遠くにあるものに隠れ、
遠くにあるものは近くにあるものを隠すことが可能となるのです!!
(そんなことをして何が楽しいのかは知りませんが)
こういった挙動はRenderState.DepthBufferFunctionプロパティで
設定します。
public CompareFunction DepthBufferFunction { get; set; }
このプロパティで表される条件を満たしたときのみ描画し、
満たさないときは描画しません。
そしてデフォルトの条件は「より小さいとき」です。
このプロパティの型は
Microsoft.Xna.Framework.CompareFunction列挙体です。
デフォルトの値はLessEqualです。
カメラからの距離が「より小さいとき」、
つまりカメラに近いときは描画すると言うことです。

このサンプルプログラムは、奇妙なことに
「近くのものが遠くのものに隠される」ようになっています。
カメラからの距離が「大きいか等しい」ときのみ描画するようなっているのです。
実際にこれがなんの役に立つかはさっぱりわかりませんが
こういうのもあるということです。
設定します。
public CompareFunction DepthBufferFunction { get; set; }
このプロパティで表される条件を満たしたときのみ描画し、
満たさないときは描画しません。
そしてデフォルトの条件は「より小さいとき」です。
このプロパティの型は
Microsoft.Xna.Framework.CompareFunction列挙体です。
| メンバ名 | 説明 |
| Always | 常に描画 |
| Equal | == |
| Greater | > |
| GreaterEqual | >= |
| Less | < |
| LessEqual | <= |
| Never | 常に描画しない |
| NotEqual | != |
デフォルトの値はLessEqualです。
カメラからの距離が「より小さいとき」、
つまりカメラに近いときは描画すると言うことです。
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
class Triangle
{
VertexPositionColor[] vertices = new VertexPositionColor[3];
public Triangle(Vector3 p1, Vector3 p2, Vector3 p3, Color color)
{
vertices[0] = new VertexPositionColor(p1, color);
vertices[1] = new VertexPositionColor(p2, color);
vertices[2] = new VertexPositionColor(p3, color);
}
public void Draw(GraphicsDevice graphicsDevice, BasicEffect effect)
{
graphicsDevice.VertexDeclaration = new VertexDeclaration(
graphicsDevice,
VertexPositionColor.VertexElements);
effect.VertexColorEnabled = true;
effect.Begin();
foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
pass.Begin();
graphicsDevice.DrawUserPrimitives<VertexPositionColor>(
PrimitiveType.TriangleList,
vertices,
0,
1
);
pass.End();
}
effect.End();
}
}
class MyGame : Game
{
GraphicsDeviceManager graphics;
BasicEffect basicEffect;
Triangle blueTriangle = new Triangle(
new Vector3(0,1, 0),
new Vector3(1, -0.5f, 0),
new Vector3(-1, -0.5f, 0),
Color.Blue
);
Triangle redTriangle = new Triangle(
new Vector3(1, 0.5f, -1),
new Vector3(0, -1, -1),
new Vector3(-1, 0.5f, -1),
Color.Red
);
public MyGame()
{
graphics = new GraphicsDeviceManager(this);
}
protected override void LoadGraphicsContent(bool loadAllContent)
{
if (loadAllContent)
{
basicEffect = new BasicEffect(graphics.GraphicsDevice, null);
basicEffect.View = Matrix.CreateLookAt(
new Vector3(0, 0, 3),
new Vector3(0, 0, 0),
new Vector3(0, 1, 0)
);
basicEffect.Projection = Matrix.CreatePerspectiveFieldOfView(
MathHelper.ToRadians(45),
Window.ClientBounds.Width / (float)Window.ClientBounds.Height,
1, 100
);
}
}
protected override void Draw(GameTime gameTime)
{
graphics.GraphicsDevice.Clear(
ClearOptions.Target | ClearOptions.DepthBuffer, //色と深度バッファをクリア
Color.CornflowerBlue, //色の初期値
0, //深度バッファの初期値(いちばん近い所からはじめる)
0 //ステンシルバッファの初期値
);
graphics.GraphicsDevice.RenderState.DepthBufferFunction = CompareFunction.GreaterEqual;
blueTriangle.Draw(graphics.GraphicsDevice, basicEffect);
redTriangle.Draw(graphics.GraphicsDevice, basicEffect);
}
}
このサンプルプログラムは、奇妙なことに
「近くのものが遠くのものに隠される」ようになっています。
カメラからの距離が「大きいか等しい」ときのみ描画するようなっているのです。
実際にこれがなんの役に立つかはさっぱりわかりませんが
こういうのもあるということです。
PR
COMMENT
TRACKBACK
TrackbackURL

