71 [xobt@̐xāH
@|S̑OWfu[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Ă|SoȂ鋗܂ŗKv܂B
@őfpȋ^₪oĂ܂BuAĂ|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ɗǂ̂őOWȂǂ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
@łꂱꎎĂ݂Ɓ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ׂ̑OW͐Êǂɒ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ł(^-^)