71 [xobt@̐xāH

z[ < Q[‚[I < DirectXZp

71 [xobt@̐xāH


@|S̑O֌W𔻒fu[xiDepthjvi[obt@łu[xobt@iDepth bufferjvB̃obt@͒ʏڂɂ鎖G鎖o܂񂪁Aɏ܂Ă[xZeXgŔr鎖3D̃fɁuO̊֌Wv^邽ߋɂ߂ďdvłB

@[xobt@ł΂ɂȂ̂̑O𔻒肷鐸xłBFfW^Ȑlł疳ɍׂxőO㔻͏o܂B|SwǖĂ悤ȏԁiLN^ĂߕGUȈdˍ킹Ȃǁj̏ꍇA{͗Ă͂Ȃ̂ɁAxsõ|S̐[xuvƔ肳A`悪‚Ă܂܂BuZt@CgvƌĂ΂A[eBt@NgłBɂ́AĂ|S‚oȂ鋗܂ŗKv܂B

@őfpȋ^₪oĂ܂Bu񂶂AĂ|Sǂꂾ΂́HvƁB̓fUCiɂ܂ɕ܂BłA̋߂͎̂͂PȘbł͂ȂłB̏͂ł́AȐ[xobt@̐xɂ‚Č@艺Ă݂悤Ǝv܂B



@ [xobt@́uŒ菬_v

@킸ȂȂ炢łA[xobt@̓obNobt@̂1_ɑΉ[xis̋jۑ郁̉łB[x0.0`1.0܂ł̏ŕ\A0.0ԎO̐[xA1.0ԉ̐[xƂȂ܂BȊO͈̔͂ɂ|S͕`ΏۂO܂B̐[x̏_\łAiBgĂfloatƂdoubleȂǂ́u_vł͂ȂuŒ菬_vŕ\鎖łB

@DirectX̏ꍇA[xobt@̃tH[}bgɂD3DFMT_D24S8yD3DFMT_D32ǂg܂BO҂24bit[xobt@A҂32bit[xobt@łB́u24bitvu32bitvƂ̂́AŒ菬_̃rbgłBႦ24bit[xobt@Ȃ[x0.0`1.0̊Ԃ224敪Ă܂F

@}͐[xobt@̗̕lq͂̂łB0.01.0܂Ő[xl傫ȂĂ܂B`́u[xvƂ݂Ȃ͈͂ŁA24bit[xobt@̏ꍇ̋ԋ24biťŒ菬_Ȃ̂Ŗ5.98e-08i2^(-24))ƂȂ܂B̋`0.0`1.0̊Ԃ16677216‚܂i224jB

@u1667ď\ɍׂvƎv܂Bup[XyNeBuŝvlƎ͂Ƃ؂ȂłB



A p[XyNeBuŝ

@p[XyNeBus̓fɃ[hϊsyуr[sKpɂɓKpsŁAߊoĂςɏdvȍsłBD3DXMatrixPerspectiveFovLH֐Ȃǂō邠łB̃p[XyNeBus̓T^IȗȉɎ܂F

@H/W̓AXyNg̋tAƂ͉pAnZfZ͂ꂼꎋ̍ŋߖʂƍʼnʂ܂ł̋łBr[Ԃɂ|S̒_W͂̍sʂŕ`ԁi(-1,-1,0)`(1, 1, 1)͈̔́jɂ[[Ək܂B

@sɊ֌Ŵ̓|S_WzłB͏̍syсuwŊvƂŐ[xdɕς܂B𐔎ŕ\Ǝ̂悤ɂȂ܂F

ۂ̎ŋߕʂ܂ł̋łz=nZ̏ꍇ͐[xd0.0ɁAʂ܂ł̋łz=fZd1.0ɕϊ܂BÅԂzd̊֌W͔i`jł͂܂Bނ낻̕ϊՂ͂Ȃɒ[łāAꂪ̖{łB̃OtF

@nZ=100AfZ=10000Ƃ̊ezlɑ΂[xdvbĝłBzlAc[xłB̃OtƁAߕʂɂ߂iz=100`1000炢j̏Ő[xl0.00.95炢܂ŋ}㏸Ă̂킩܂Bz=1000̌͋}ɂȂ炩ɂȂĂ܂Bz̒l傫ωĂ[x̒lSRωĂȂ\Ă܂B

@zω邾Ő[x傫z=100`1000炢͈̔͂ȂA[x̊xɗǂ̂őO֌WȂǂxŔ肵Ă܂Bz艓ȂƋɒ[ɐxȂ܂B}̂F

@

@̓r[ԂłzlŁAԋԂ͂zł̓[xƂ݂Ȃ͈͂łBߕʋ߂ɒ[ɐxŁAz=1000߂邭炢ӂ肩琸xKNƈȂlqĎ܂B

@łu߂̐xǂĉ͈vA͂Ӗs̗ǂłBڂ̑Ȍڍׂȃ|S͍xőO㔻肵ė~ǍiF͏FȂ̂Ń|SêʂłB炻xKvƂ܂Buł͉̂HvƂȂ܂A̐[x̋Ԃ̕zɒ[Ȃ̂ȂłB

@24bit[xobt@0.0`1.0̊Ԃ1600ȏ㕪鐸xĂ̂łAnZ=100AfZ=10000ƂꍇAz=100`1000ƍXʼn10̋ōŏ1500炢Ă܂łBŎcz=1000`10000炢͈̒͂100炢Ɍ܂BełA̐x̗܂܂Ȃ܂B

@A̐x̗Ղߕʂ܂ł̋Ɖʂ܂ł̋̔傫ȂƂ܂܂ɂȂĂ܂łBł́A̓Iɂǂ̂炢΂Ă܂̂Hm邽߂ɁAɓzlɂ|S̔wƂȂŒZ̋iŒZԋj߂鎮𓱏oĂ݂܂傤B



C ǂꂾzW𗣂ΔwɂȂ̂HiŒZԋj

@Ɛ܂BCӂnZAfZp[XyNeBusɐݒ肵Az1ɑΉ[xd1́A

ƌvZ܂BoĂ̂܂܂łBz1ɈʒuŒZzz1+ƕ\ƂƁA̐[x͏̎A

ƕ\ł܂Bd1d[x܂ƂC[WłˁB@ɂ悤24bit[xobt@͂̐[x5.96e-08ȂΊmɑO𔻒ł܂Ad5.96e-08ċ܂郿z1ɑ΂ėׂŒZԋƂȂ܂Bd1ɍŏ̎ă𒊏oƂȂ܂F

řvZߒ͂ĒuA̎d=5.96e-08Ƃċ܂郿z1痣ׂŒZԋłBƑSRC[WoȂ̂ŃOtĂ݂܂F

@Ot̉z̒liz1jAczɑ΂Đ[xołŒZԋdłBp[^nZ=100fAZ=10000fłBۂ̐lAz=nZ=100.0f͍̎ŒZԋ5.90e-06ƂȂAɋ͂Ɍɂ|Smł̂łAԉłz=fZ=10000.0f̎5.90e-02Ǝߕʎ10000{ȂƑO𔻒肵ĂȂȂ܂I

@C[W₷悤ɒPʂ‚Ă݂܂BZ1Pʁiz=1.0j1mƂEƂ܂傤B̋ߕʂ100mAʂ10kmi10000mjɐƂ܂B̎Aߕʕt߂̃|S̏dȂ5.90e-06mA‚܂0.006mmƔɋĂOオ肳܂A500mɂȂ0.15mm܂ʼnKv܂B1km0.7mmAꂪ5kmɂȂ1.5cmȂƑOオ肳ȂȂ܂Bԉ10kmł͖6cmłB

@u1km0.7mmȂ薳ˁHvƎv܂BA̗͋ߕʂ100mƐɂAʏ̃Q[Ŏg鋗ɂȂĂ܂Bߕʂ1mƎpx̋ɂAʂ܂łƂ̋1:10000ɐݒ肷ƂǂȂ邩HȂ܂F

@ڑSRςĂȂ悤Ɍ܂Ac̃XP[100{Ⴄ̂ɒӂĉBقڒPɂǂzlł100{ԂJȂƑO㔻ɎsƂłB500mł0.15mmŗǂŒZԋ͂100{15cmɍL܂Bԉ10km悾ƂȂ6mȂƂ܂B

@̂悤ɁuO㔻̐xɔɑ傫ê͋ߕʂƉʂ܂ł̐΋ł͂ȂyzvȂłB



D [x̐x̊Ă݂悤

@Cłꂱ؂Ă݂tH[Ă݂܂B
@ߕ(nZ)A(fZ)܂ł̋ݒ肵āÅԂ̔Cӂzl^Ƃ̋ߕӂ̐[xlƁAwƂĔʉ”\ȍŒZԋvZĂ܂F

nZ fZ z

[xd

ŒZԋ(24bit)

ŒZԋ(32bit)

@łꂱꎎĂ݂ƁA24bit[xobt@̏ꍇ͋ߕʁ`ʂ̋͂1:1000`1:3000ʂMMȂƊ܂B32bit2xオƂ͂A1:10000炢ł͂hȂĂ܂B



E 񂶂Aǂꂾ΂́H

@܂łb𓥂܂āAł̓f鎞ɂǂꂾ|S̊Ԃ𗣂č΂́HƂ{̖͂{ɓݍł݂܂B̓IȐl͐[xobt@biti24bit32bitjAߕʂƉʂ܂ł̋yт̔Aăfǂ̋Ŏgp邩ɂČ܂Ă܂Bȉ̐lׂ͂ď̃tH[ŎZolQlɂĂ܂B

@ߕʂ1.0fAʂ1000.0fȂƋE肵܂imPʂƎvĉjBĝ24bit[xobt@B̃tH[ŌvZƁAʂ̋iz=1000jőO㔻肪łŒZԋ0.0595f炢łBꂪׂĂzɑΉł傫ŒZԋȂ̂ŁAȏLԂŃ|Sׂ΂̑O֌W͐ÊǂɒuĂIɂ͔ł鎖ɂȂ܂BwifȂۏ2{0.12炢ΊmłB

@LȃtB[h̒nʂɖ쑐Ȃǂƒ|ŕׂꍇŁAĂz=200f炢͈̔͂ɂ쑐ƒ|`ΏۂƂiȏ̂̓JOĕ`悵ȂjꍇAz=200ł̍ŒZԋ0.00238f炢Ȃ̂ŁAۏKxɎ0.005ȏ̊ԊuŕׂZt@CgNɖ쑐tB[hɕ~l߂鎖ł܂B

@x͂ƍLEBႦ΁unvƂK͂ōlĂ݂܂BLN^̐g1.7mAǏ]J3mʂ̍ɂƂ܂B3m̍猩n܂ł̋́An̒a6000kmƂĖ12kmłF

@z1Pʂ1mƂƁAfZ12000mBnZ1.0mɂƂ̔nZ:fZ=1:12000ɂȂ܂B12000mɉ傫ȔwiꍇAZt@Cgɂ8.6m|S։Kv܂BႦΓVɉ_ȃeNX`d˂ꍇȂǂ̕ӂ̐llȂƃołˁBA1:12000Ƃ䂪܂̂ŁAfZ̋𔼕6000mɉA͉”\ȌnZɂ悤߂܂B3mɃJȂAȂƂ3mȓ̒nʂ͕`͈͊OɂȂ܂AnZ=3Ƃ΂̔1:2000܂ʼnP܂B̏ꍇ6000mł̑O㔻”\ȍŒZԋ71cmɂ܂ŋ܂܂B

@̂悤ɁA̓Iȃ[h̍Lz肵ď̃tH[̂悤ȍŒZԋvZƁA`ɕsK؂ɋNZt@Cg𖢑RɖhANꍇ̉P鎖oƎv܂B



F ϓz[xobt@͈ĊOǂȂ

@[xobt@̂̐x͌Œ菬_i24bity32bitjŎ͍xłBA܂ŌĂ悤Ƀp[XyNeBusōWϊiKŋߕʑɃobt@̐xɒ[ɏWĂ܂߁As10ȍ~̋Ń|S̑O㔻̐x傫Ă܂܂B̋ɒ[ȕ΂AƂȂȂł傤H

@‚łȂƎv̂up[XyNeBusz̕ϊA_VF[_œƗĐ[x߂vƂ@BȀŏoĂ悤ɁAp[XyNeBus͈ȉ̐zl[xɕϊĂ̂łF

̎fZ/zƂ̊jƂȂ镔BɂȂĂ̂Ő[x̕zɒ[ȂłBŁǍvẐs񂩂炲ȂĂ܂ƔzĂ݂܂B‚܂Ap[XyNeBuŝ悤ɁF

zlvZ3ڂPʍsɂăr[Ԃłzl̂܂܍̗p悤ɂĂ܂܂B̏ԂŒ_VF[_ɓ˓܂Bȉ̒_VF[_R[hF

float nearZ, farZ;   // ߉ʂ܂ł̋

VSOUT vs_main( float4 pos : POSITION ) {

    VSOUT Out = (VSOUT)0;

    Out.pos = mul( pos, worldViewProjMat );

    // [xŌvZi`j
    Out.pos.z = (Out.pos.z - nearZ) / ( farZ - nearZ );
    Out.pos.z *= Out.pos.w;

    return Out;
}

@_VF[_ōWsϊAɐ[xvZOłĂ܂BvZ͍ŏ̍sϊŎZozlił̓r[ԂłzlƓjnearZZAifarZ - nearZjł[Ək߂Ă܂B̕ϊC[WO͂QB̂悤ɐ[xvZƁAnZ`fZ0.0`1.0ɐ`ɕϊ܂Bw|Ă̂́AretrunŒ_VF[_Wo͂㏟ɑS̗vfwŊZǍʂ𑊎E邽߂łBۂ̐[x1sڂ̌vZʂ̂̂ƂȂ܂B

@̂悤zlƐ[x`ɂ̍ŒZԋCƓ悤ɌvZĂ݂܂B[x̌vZ͏̃VF[_ɂ悤ɁF

łBVvłˁBO㔻ʂ”\ƂȂŒZԋA̎̍[xdƂƁA

ŁA̎ă𒊏oƂȂ܂F

܁`Vv(^-^)BĎ̒z1ɒڂłBzǂ̒lłŒZԋEӂ̂悤Ɉł鎖\Ă܂B24bit[xobt@̏ꍇd2^(-24)łAnZ=1.0fAfZ=10000.0f炢̔ɂƃ͂悻5.96e-04i0.000596jƂȂ܂BĺuAƂ񂶂ˁHvƊ܂B

@̃VF[_͂ƕsB_VF[_nearZfarZn̂hNTCłBŁAp[XyNeBuˉeϊŝ悤ɂ܂F

zvZ鏊ɃXP[ƃItZbg܂B͐̒_VF[_̐[xvZ1sڂSĂ܂Bł璸_VF[_̒́A

VSOUT vs_main( float4 pos : POSITION ) {

    VSOUT Out = (VSOUT)0;

    Out.pos = mul( pos, worldViewProjMat );

    // ẑ܂ܐ[xƂi`j
    Out.pos.z *= Out.pos.w;

    return Out;
}

̂悤ɐ[xvZ1sڂȂAƂĂVvɂȂ܂B

@_VF[_Œw|ZĂ̂ŁA̋ϓz[xobt@gɂ̓VF[_ςȂƂ܂񂪁AɃVF[_萔lj鎖͖̂Ŋ̃VF[_ς̂͖Ǝv܂B

@ł͒ʏ̃p[XyNeBuŝƐ`̂ƂőO㔻”\ȍŒZԋ̐xrĂ݂܂傤F

@zlłBnZ=1.0fAfZ=1000.0fƂ܂Bc͂zőO𔻒łŒZԋijłBƂ܂ɈႢ߂ēǂݎȂ̂őΐɂĂ܂B1ႤƐx10{ႤӖĂ܂BOt̉̕قǑO㔻̐xǂ\Ă܂BƂڗđRłˁBʏ̃p[XyNeBus͋̕ߕʂɈႢł͐`1`1000{xǂ̂łAꂽł͐x傫t]Ă܂B

@`̍ŒZԋׂ͂Ăzl0.0001f邭炢ɂȂĂ܂A1kmȉs̐E0.1mm̑O𔻒ł鐸xłB\Ǝv܂BނA̐xʂ܂ŕۂĂ̂Ɏv܂BA̐`̃Ot`Ă炤ƁAz=500ȍ~炿ƂlオĂ܂Bfloat^̐x̌Eɂz=500肩牓ł͗z̐xōiZjoȂ邽߂łBłق̋͂łp͂܂肠܂B

@nZ:fZ=1:1000ƂƋ̂ŁAnZ=1.0fAfZ=10000.0f̏ꍇF

@p[XyNeBusiʏj͋̕߂őϐx̂킩܂A͂킸z=200̏Ő`Ƌt]܂B`͐̕Ŝ̐x10{܂Bz=1.0f1mƂ1mm|S𗣂Kv܂BnC|ȃfŃ|S1mmPʂŕׂdȂĂ鏊΁AZt@CgNĂ܂܂񂪁A10kmXP[ȐEłAf͋HȂƎv܂B


@̏͂ł͐[xobt@̐xɂ‚ĂꂱlĂ܂BڂɌȂǂɖȐĂ[xobt@B̎dg݂mZt@Cg胏[h̑傫œKɌ߂Ap[XyNeBű߉ʂւ̋ł܂BǂĂƂȂ΋ϓz[xobt@g܂B₱Ǒ؂Ȑ[xBɕtł(^-^)