ページ「ブラック・タイディングス」と「深度バッファ」の間の差分
(ページ間の差分)
ナビゲーションに移動
検索に移動
imported>Administrator (→深度テスト) |
|||
1行目: | 1行目: | ||
− | + | 深度バッファ(depth buffer)とは、3DCGにおいて深度情報を用いて物体の描画処理を省略し高速化するために確保されたメモリ領域である。 | |
== 概要 == | == 概要 == | ||
− | + | 一般的に深度バッファは「0.0〜1.0」までの範囲の24ビットの[[固定小数点数]]で表されることが多い。これは処理系により異なる。16ビットや32ビットの[[浮動小数点数]]を用いるものもある。 | |
− | + | 「24ビット固定小数点数の深度バッファ」は[[DirectX]]が長らく採用してきた関係で広まっているだけである。 | |
− | + | また、24ビットでは転送効率が良くないので、8ビットに[[ステンシルバッファ]]を割り当て、計32ビットで処理することが多い。 | |
− | + | == 深度テスト == | |
− | + | 深度バッファは以下のような使われ方をする。 | |
− | + | これは擬似的なプログラミング言語である。 | |
+ | <source> | ||
+ | // 深度バッファを準備する | ||
+ | var depthBuffer = new DepthBuffer[w,h]; | ||
+ | // 深度バッファは1.0で埋めておく | ||
+ | depthBuffer.fill(1.0); | ||
− | + | // ポリゴンをピクセル群にラスタライズする | |
+ | foreach (var pixel in polygon.toPixels()) | ||
+ | { | ||
+ | // ピクセルとカメラの距離(深度)を求める | ||
+ | var depth = vector3.distance( pixel.position, camera.position); | ||
+ | |||
+ | // 深度を比較する | ||
+ | if ( depthBuffer[pixel.position.xy] <= depth ) | ||
+ | {// 後ろなので何もしない | ||
+ | nop(); | ||
+ | } | ||
+ | else | ||
+ | {// 描画と深度の記録をする | ||
+ | pixel.draw(); | ||
+ | depthBuffer[pixel.position.xy] = depth; | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
== 関連項目 == | == 関連項目 == | ||
− | * [[ | + | * [[深度バッファ]] |
− | * [[ | + | * [[ステンシルバッファ]] |
− | + | * [[カリング]] | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | [[ |
2019年10月17日 (木) 09:12時点における版
深度バッファ(depth buffer)とは、3DCGにおいて深度情報を用いて物体の描画処理を省略し高速化するために確保されたメモリ領域である。
概要
一般的に深度バッファは「0.0〜1.0」までの範囲の24ビットの固定小数点数で表されることが多い。これは処理系により異なる。16ビットや32ビットの浮動小数点数を用いるものもある。
「24ビット固定小数点数の深度バッファ」はDirectXが長らく採用してきた関係で広まっているだけである。
また、24ビットでは転送効率が良くないので、8ビットにステンシルバッファを割り当て、計32ビットで処理することが多い。
深度テスト
深度バッファは以下のような使われ方をする。
これは擬似的なプログラミング言語である。
// 深度バッファを準備する
var depthBuffer = new DepthBuffer[w,h];
// 深度バッファは1.0で埋めておく
depthBuffer.fill(1.0);
// ポリゴンをピクセル群にラスタライズする
foreach (var pixel in polygon.toPixels())
{
// ピクセルとカメラの距離(深度)を求める
var depth = vector3.distance( pixel.position, camera.position);
// 深度を比較する
if ( depthBuffer[pixel.position.xy] <= depth )
{// 後ろなので何もしない
nop();
}
else
{// 描画と深度の記録をする
pixel.draw();
depthBuffer[pixel.position.xy] = depth;
}
}