Three.js: r112์˜ ์ƒˆ๋กœ์šด MeshStandardMaterial์—๋Š” ์ผ๋ถ€ GPU์—์„œ ๋ฐด๋”ฉ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2019๋…„ 12์›” 30์ผ  ยท  18์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mrdoob/three.js

r112๋ถ€ํ„ฐ ๊ธฐ๋ณธ MeshStandardMaterial (์ด ๊ฒฝ์šฐ ํŠนํžˆ glTF ํŒŒ์ผ์„๋กœ๋“œ ํ•  ๋•Œ ์‚ฌ์šฉ๋˜์ง€๋งŒ ๋‹ค๋ฅธ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋„ ์‚ฌ์šฉ๋จ)์€ ์ผ๋ถ€ GPU์—์„œ ๋ฐด๋”ฉ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํŠนํžˆ Pixelbook๊ณผ ๋ชจ๋“  ์„ธ๋Œ€์˜ Pixel ํœด๋Œ€ ์ „ํ™”์—์„œ์ด ๋ฌธ์ œ๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๋‚ด๊ฐ€ ์‹œ๋„ํ•œ Nvidia ๋ฐ์Šคํฌํ†ฑ GPU, Oculus Go ๋˜๋Š” Oculus Quest์—์„œ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋จธํ‹ฐ๋ฆฌ์–ผ์˜ ์ƒˆ ์…ฐ์ด๋”๊ฐ€ ๋ Œ๋”๋ง ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š” ๋ชจ๋ฐ”์ผ ์žฅ์น˜๋ฅผ ํฌํ•จํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๋ชจ๋ฐ”์ผ ์žฅ์น˜์—์„œ ๋‚ด ํŠน์ • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด r111์— ๋น„ํ•ด ๋ˆˆ์— ๋„๋Š” ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•˜๋Š” ๊ฒƒ์„ ๊ด€์ฐฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์•„ํ‹ฐํŒฉํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค (Pixelbook์—์„œ Three.js r112๋กœ ๋ Œ๋”๋ง ๋จ).

Screenshot 2019-12-29 at 9 15 19 PM

์˜ˆ์ƒ ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค (๋™์ผํ•œ Pixelbook์—์„œ Three.js r111๋กœ ๋ Œ๋”๋ง ๋จ).

Screenshot 2019-12-29 at 9 24 31 PM

ํ˜„์žฌ r112๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ ๋งํฌ : https://xrdinosaurs.com

ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ๋ชจ๋“  ๊ณต๋ฃก์ด ๋ฌธ์ œ๋ฅผ ๋‚˜ํƒ€๋‚ด์ง€ ๋งŒ, ํ‰ํ‰ํ•˜๊ฑฐ๋‚˜ ๋ถ€๋“œ๋Ÿฌ์šด ์ƒ‰์ƒ์˜ ๋„“์€ ์˜์—ญ (์˜ˆ : TRex์˜ ๋ฐฐ)์ด ๋” ๋‘๋“œ๋Ÿฌ์ง€๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฐ ์ƒท์˜ ์žฌ์งˆ (์•„๋ž˜์— ์ „์ฒด ๋ถ™์—ฌ ๋„ฃ๊ธฐ)์€ glTF ํ™•์žฅ "KHR_materials_pbrSpecularGlossiness"๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ํ™•์‚ฐ, ์ผ๋ฐ˜ ๋ฐ ๋ฐ˜์‚ฌ / ๊ด‘ํƒ ํ…์Šค์ฒ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    {
      "doubleSided": true,
      "emissiveFactor": [
        0,
        0,
        0
      ],
      "extensions": {
        "KHR_materials_pbrSpecularGlossiness": {
          "diffuseFactor": [
            0.46512957319999998,
            0.46512957319999998,
            0.46512957319999998,
            1
          ],
          "diffuseTexture": {
            "index": 4,
            "texCoord": 0
          },
          "glossinessFactor": 0.27610518290000002,
          "specularFactor": [
            0.92244664629999995,
            0.92244664629999995,
            0.92244664629999995
          ],
          "specularGlossinessTexture": {
            "index": 6,
            "texCoord": 0
          }
        }
      },
      "name": "TRex",
      "normalTexture": {
        "index": 5,
        "scale": 1,
        "texCoord": 0
      }
    }
Bug Device Issue

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@elalish ์—ฌ๋Ÿฌ ์˜ˆ์ œ์—์„œ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ ํ•œ ํ›„ ์ด๋Ÿฌํ•œ ์•„ํ‹ฐํŒฉํŠธ์˜ ์‹ค์ œ ์›์ธ์„ ์ •ํ™•ํžˆ ์ฐพ์•„ ๋‚ผ ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ๊ฒŒ์‹œ๋ฌผ์—์„œ ๋งํ•œ ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์€ ์ž˜๋ชป๋œ ์ขŒํ‘œ ์ƒ˜ํ”Œ๋ง๊ณผ ๊ด€๋ จ์ด ์—†์ง€๋งŒ PMREMGenerator ์ด devicePixelRatio ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต์นญ ๋ถ€๋™ ์†Œ์ˆ˜์  pixelRatio ์—์„œ ์ƒ์„ฑ ๋œ ํ…์Šค์ฒ˜์— "์ž˜๋ชป๋œ"๋ฐ‰๋งต ์ขŒํ‘œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž‘์€ ๊ฐ„๊ฒฉ๊ณผ ๊ฒน์น˜๋Š” ์˜์—ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋กœ์ปฌ (0.899 ..) ๋˜๋Š” ์˜จ๋ผ์ธ (1) ์˜ˆ์ œ๋ฅผ๋ณด๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‚ด ์ปดํ“จํ„ฐ๊ฐ€ devicePixelRatios ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์œผ๋ฉฐ, ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ด๋Ÿฌํ•œ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋กœ์ปฌ์—์„œ๋งŒ ๊ฒฝํ—˜ ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

setPixelRatio ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์„ค์ •ํ–ˆ๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๊ฒฝ์šฐ๋ผ๋ฉด PMREMGenerator ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฆฌํŒฉํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

@toji @ plut0nist ๋Š” ์ด๋Ÿฌํ•œ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ œ์‹œ ํ•œ ์žฅ์น˜์—์„œ ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ํ™•์ธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

DEV ์˜ˆ
ํ…Œ์ŠคํŠธ ์˜ˆ

๋ชจ๋“  18 ๋Œ“๊ธ€

๋‚ด Pixel (1)์—์„œ ๊ธ€๋ฆฌ์น˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„ํ‹ฐํŒฉํŠธ๋Š” KHR_materials_pbrSpecularGlossiness ๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ๋งŒ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

18042๋Š” ๊ธฐํ•˜ํ•™์  ์•ˆํ‹ฐ ์•จ๋ฆฌ์–ด์‹ฑ์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ GLTFLoader ๋Š” lights_physical_fragment ์…ฐ์ด๋” ์ฒญํฌ์˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

https://github.com/mrdoob/three.js/blob/3ba0553208cfc9113152f5f39b4036a448cf3f25/examples/js/loaders/GLTFLoader.js#L683 -L688

@toji ์œ„ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์•ฑ์˜ GLTFLoader ์‚ฌ๋ณธ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

var lightPhysicalFragmentChunk = [
    'PhysicalMaterial material;',
    'material.diffuseColor = diffuseColor.rgb;',
    'vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );',
    'float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );',

    'material.specularRoughness = max( 1.0 - glossinessFactor, 0.0525 );// 0.0525 corresponds to the base mip of a 256 cubemap.',
    'material.specularRoughness += geometryRoughness;',
    'material.specularRoughness = min( material.specularRoughness, 1.0 );',
    'material.specularColor = specularFactor.rgb;',
].join( '\n' );

@elalish ์ด ํŒจ์น˜๋กœ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋”๋ผ๋„ GLTFLoader ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜์ฃ ?

@ Mugen87 ๋„ค, ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. Pixel 3์—์„œ๋„ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

@toji ๋‚˜๋Š” Android 10์ด ๋ชจ๋“  Pixel์ด ์•„๋‹™๋‹ˆ๋‹ค ...

๋“œ๋ผ์ด๋ฒ„ ๋ฒ„๊ทธ? ๊ทธ๋ž˜๋„ ์–ด๋–ค ๋ผ์ธ์ด ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐํ•˜ํ•™์  ์•คํ‹ฐ ์•จ๋ฆฌ์–ด์‹ฑ์˜ ์กด์žฌ / ๋ถ€์žฌ๋Š” ์–ด์จŒ๋“  ๊ทธ๋Ÿฐ ์œ ํ˜•์˜ ์ธ๊ณต๋ฌผ์„ ๋งŒ๋“ค์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@toji ๋‚˜๋Š” ๋˜ํ•œ ๋‚ด

๊ฒ€์€ ํ•˜๋Š˜์€ ์‹ค์ œ๋กœ PMREM ์ƒ์„ฑ์ด ์™„์ „ํžˆ ์‹คํŒจํ–ˆ์Œ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฐœ๊ฒฌ ํ•œ ์ด์ƒํ•œ ๋ฒ„๊ทธ์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ( https://github.com/GoogleWebComponents/model-viewer/pull/920) ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ r112์— ๋„ฃ์œผ๋ ค๊ณ ํ–ˆ์ง€๋งŒ ๋‚˜์— ์˜ํ•ด ๋ฏธ๋„๋Ÿฌ์กŒ๋‹ค. ๊ทธ๋ž˜๋„ OP์˜ ๋ฒ„๊ทธ์™€ ๊ด€๋ จ์ด ์—†์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Chrome๊ณผ Firefox ๋ชจ๋‘์—์„œ OnePlus 5T์˜ OP ์˜ค๋ฅ˜๋ฅผ ์žฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ! ํŒจ์น˜๋ฅผ GLTFLoader ํ•˜๊ณ  ๋ฐด๋”ฉ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ๊ฐ์†Œํ–ˆ์ง€๋งŒ ์ œ๊ฑฐ๋˜์ง€ ์•Š์•˜ ์Œ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒจ์น˜ ์ „ :

Screenshot 2019-12-30 at 12 11 36 PM

ํŒจ์น˜ ํ›„ :

Screenshot 2019-12-30 at 12 10 35 PM

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐด๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ณ ์ •ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. :) (Pixelbook์—์„œ ์ฐ์€ ์Šคํฌ๋ฆฐ ์ƒท์ด์ง€๋งŒ Pixel 4 XL์—์„œ๋„ ๊ด€์ฐฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ๊ธฐ๊ธฐ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.)

ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ๋‹ค๋ฅธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ํŒจ์น˜๋ฅผ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด https://github.com/toji/xr-dinosaurs๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. (์„œ๋ฒ„ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

์„ฑ๋Šฅ์— ๊ด€ํ•ด์„œ๋Š” : ์ •ํ™•ํžˆ ๋ฒ„ํ„ฐ ๊ฐ™์€ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋‚˜์˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜ ์—ด์‹ฌํžˆ ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ r112๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋™์•ˆ ์„ฑ๋Šฅ ํšŒ๊ท€๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  @mrdoob ์—๊ฒŒ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ฌผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ๊ทธ๊ฒƒ์ด ์ƒˆ๋กญ๊ณ  ๋” ์ •ํ™•ํ•œ ํ‘œ์ค€ ์…ฐ์ด๋” ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ–ˆ๊ณ  ํ™•์ธ์„ ์œ„ํ•ด ์ผ๋ถ€ ์žฌ์งˆ์„ MeshLambertMaterial ๋กœ ๊ต์ฒด ํ•  ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด์ฐจํ”ผ ํ™˜๊ฒฝ ๋ชจ๋ธ์ด PBR ์žฌ์งˆ์„ ์ ์ ˆํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ Lambert์— ๊ฐ•์ œ๋กœ๋‘๊ณ  ๊ฑฐ๊ธฐ์— ๋‚จ๊ฒจ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์„ฑ๋Šฅ ํšŒ๊ท€๋ฅผ ๋˜์ฐพ์€ ๋‹ค์Œ ์ผ๋ถ€ (๋ทฐํฌํŠธ์˜ ํฐ ๋ฉ์–ด๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.) ํ‘œ์ค€ ์žฌ๋ฃŒ๋Š” "์˜์›…"์ž์‚ฐ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ  : ๋ Œ๋”๋Ÿฌ๊ฐ€ MeshStandardMaterial ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์— GLTFLoader ๋ฐ˜์‚ฌ / ๊ด‘ํƒ ์žฌ์งˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์‹œ๋ฅผ๋กœ๋“œ ํ•  ๋•Œ Scene.environment ๋Š” ํ˜„์žฌ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

https://github.com/mrdoob/three.js/blob/dd81aad5513d66e35e51f3a3b42555bc8aef5cbc/src/renderers/WebGLRenderer.js#L1633

๊ทธ๋Ÿฌ๋‚˜ GLTFLoader ShaderMaterial ๋Š” ๊ฐ ๋ฐ˜์‚ฌ / ๊ด‘ํƒ ์žฌ์งˆ์— ๋Œ€ํ•ด

ํ™˜๊ฒฝ ๋งต์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐด๋”ฉ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฃผ๋ณ€ ์กฐ๋ช… ๋ฐ ํฌ์ธํŠธ ์กฐ๋ช…๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์กฐ๋ช… ์„ค์ •์œผ๋กœ Pixel (1)์—์„œ ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ๋ณด์ž…๋‹ˆ๋‹ค.

์Œ, ํ™˜๊ฒฝ ๋งต์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฌผ๋ฆฌ์  ์žฌ๋ฃŒ์—๋Š” ๋” ๋งŽ์€ ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๊ฐ€ Pixel 1, Android 10์—์„œ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

https://threejs.org/examples/webgl_materials_envmaps_exr

Screenshot_20200106-111923

https://threejs.org/examples/webgl_materials_physical_clearcoat

Screenshot_20200106-111856

https://threejs.org/examples/webgl_materials_envmaps_hdr

Screenshot_20200106-111809

๋‚ด iMac์—์„œ ์ด๋Ÿฌํ•œ ์ธ๊ณต๋ฌผ์„ ์žฌํ˜„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด ์ปดํ“จํ„ฐ์—์„œ ๊ฝค ์ด์ƒํ•œ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด PMREMGenerator ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ชจ๋“  ์˜ˆ์ œ์—์„œ ์ด๋Ÿฌํ•œ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•  ๋•Œ๋งŒ; ์˜จ๋ผ์ธ์œผ๋กœ ๋ณผ ๋•Œ (threejs.org ํŽ˜์ด์ง€์—์„œ) ๋ชจ๋‘ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๋Ÿฐ ๋ฌธ์ œ๋ฅผ ๊ฒฝํ—˜ ํ•œ ์ ์ด ์—†์œผ๋ฉฐ ๊ทธ ์›์ธ์— ๋Œ€ํ•ด ์™„์ „ํžˆ ์žƒ์–ด ๋ฒ„๋ ธ์Šต๋‹ˆ๋‹ค.

GeForce GTX 750 TI์™€ ํ•จ๊ป˜ Windows 10์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด๊ฒƒ์ด ์žฅ์น˜ ๊ด€๋ จ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•  ๋•Œ๋งŒ; ์˜จ๋ผ์ธ์œผ๋กœ ๋ณผ ๋•Œ (threejs.org ํŽ˜์ด์ง€์—์„œ) ๋ชจ๋‘ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

dev ๋ฒ„์ „์—๋Š” ์•„์ง prod ์—†๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ master ์ง€์ ์„ ํ™•์ธํ•œ ๋‹ค์Œ ๋กœ์ปฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ˜„์žฌ ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜๋ฅผ ์ฒดํฌ ์•„์›ƒ ํ•œ ๋‹ค์Œ ๋กœ์ปฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋™์ž‘์„ ์•Œ์•„ ์ฐจ๋ฆฐ ํ›„ ๊ฐ€์žฅ ๋จผ์ € ์‹œ๋„ํ•œ ๊ฒƒ์€ ๋™์ผํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์ •๋ง ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์‹œํฌ๋ฆฟ ์ฐฝ์œผ๋กœ ํ…Œ์ŠคํŠธ ํ•ด ์ฃผ ์‹œ๊ฒ ์–ด์š”? ๋•Œ๋•Œ๋กœ ํ•ญ๋ชฉ์ด ์บ์‹œ๋˜๊ฑฐ๋‚˜ ๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ์ด ๋ฐฉํ•ด๋ฅผ ๋ฐ›์•„ ์ •๋ง ํ˜ผ๋ž€ ์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œํฌ๋ฆฟ์œผ๋กœ ์‹œ๋„ํ–ˆ๋Š”๋ฐ ๋™์ผํ•œ ๊ฒฐ๊ณผ :(

์ด ๋ฐด๋”ฉ์ด ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.
๋ฐ‰ ์ƒ์„ฑ ์ค‘์— ๋‚ด ๋กœ์ปฌ (์ž˜๋ชป๋œ) ๋ฒ„์ „์ด ๋ผ์ด๋ธŒ ๋ฒ„์ „์—์—†๋Š” ๊ฒ€์€ ์ƒ‰ ๋ฐด๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

local
online

์ด๊ฒƒ์€ ๋‚ฎ์€ mip ๋ ˆ๋ฒจ์—๋„ ๋ณต์ œ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ž˜๋ชป๋œ ์ขŒํ‘œ ์ƒ˜ํ”Œ๋ง์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฐฉ์„ฑ ํ•„ํ„ฐ๋ง์„ ์ˆ˜๋™์œผ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ์‹คํ—˜์„ ํ•ด ๋ณด์•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ •ํ™•ํžˆ ์ง€์ ํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๊ฐ™์€ ๊ธฐ๊ณ„์—์„œ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ํ–‰๋™์„ ๋ณด์ด๋Š” ์ด์œ ๋ฅผ ๋จธ๋ฆฌ๋กœ ๊ฐ์Œ€ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@elalish ์—ฌ๋Ÿฌ ์˜ˆ์ œ์—์„œ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ ํ•œ ํ›„ ์ด๋Ÿฌํ•œ ์•„ํ‹ฐํŒฉํŠธ์˜ ์‹ค์ œ ์›์ธ์„ ์ •ํ™•ํžˆ ์ฐพ์•„ ๋‚ผ ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ๊ฒŒ์‹œ๋ฌผ์—์„œ ๋งํ•œ ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์€ ์ž˜๋ชป๋œ ์ขŒํ‘œ ์ƒ˜ํ”Œ๋ง๊ณผ ๊ด€๋ จ์ด ์—†์ง€๋งŒ PMREMGenerator ์ด devicePixelRatio ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต์นญ ๋ถ€๋™ ์†Œ์ˆ˜์  pixelRatio ์—์„œ ์ƒ์„ฑ ๋œ ํ…์Šค์ฒ˜์— "์ž˜๋ชป๋œ"๋ฐ‰๋งต ์ขŒํ‘œ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž‘์€ ๊ฐ„๊ฒฉ๊ณผ ๊ฒน์น˜๋Š” ์˜์—ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋กœ์ปฌ (0.899 ..) ๋˜๋Š” ์˜จ๋ผ์ธ (1) ์˜ˆ์ œ๋ฅผ๋ณด๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‚ด ์ปดํ“จํ„ฐ๊ฐ€ devicePixelRatios ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์œผ๋ฉฐ, ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ด๋Ÿฌํ•œ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ๋กœ์ปฌ์—์„œ๋งŒ ๊ฒฝํ—˜ ํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค.

setPixelRatio ๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์„ค์ •ํ–ˆ๋Š”๋ฐ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๊ฒฝ์šฐ๋ผ๋ฉด PMREMGenerator ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฆฌํŒฉํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

@toji @ plut0nist ๋Š” ์ด๋Ÿฌํ•œ ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ์ œ์‹œ ํ•œ ์žฅ์น˜์—์„œ ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ํ™•์ธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

DEV ์˜ˆ
ํ…Œ์ŠคํŠธ ์˜ˆ

@sciecode ๊ทผ๋ณธ ์›์ธ์„

@sciecode : ๋‚ด ๊ธฐ๊ธฐ์—์„œ ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. DEV ์˜ˆ์ œ ํ…Œ์ŠคํŠธ๋Š” ํ™˜๊ฒฝ ๋งต์—์„œ ๋งค์šฐ ๋ถ„๋ช…ํ•œ ๊ฒ€์ •์ƒ‰ ์„ ์„ ํ‘œ์‹œํ•˜์ง€๋งŒ TEST ์˜ˆ์ œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฉ‹์ง„ ๋””๋ฒ„๊น…, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์™œ PMREMGenerator ๊ฐ€ devicePixelRatio ๋ฅผ ๊ณ„์‚ฐํ•ด์•ผํ•˜๋Š”์ง€ ๋งค์šฐ ๊ถ๊ธˆํ•ด์„œ ํŒŒํ—ค ์ณค์Šต๋‹ˆ๋‹ค. renderer.setViewport() ๋Š” DPR์„ ์ „์†กํ•˜๋Š” ๋ชจ๋“  ๊ฐ’์œผ๋กœ ์ž๋™์œผ๋กœ ์ธ์žํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ ํ”„๋ ˆ์ž„ ๋ฒ„ํผ๊ฐ€ ์•„๋‹Œ ๋ Œ๋” ํƒ€๊ฒŸ์— ๋Œ€ํ•ด ๋ถ„๋ช…ํžˆ ์ž˜๋ชป๋œ ๋™์ž‘ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์€ ์ •ํ™•ํ•œ ํ”ฝ์…€ ๊ฐ’์œผ๋กœ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ํ”ฝ์…€ ๋น„์œจ์„ ์ „ํ˜€ ์„ค๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ "์˜ฌ๋ฐ”๋ฅธ"๋™์ž‘์€ ๋‚ด๋ถ€์ ์œผ๋กœ rendere.setViewport() ์ด getTargetPixelRatio() ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ™œ์„ฑ ๋ Œ๋”๋ง ๋Œ€์ƒ์ด ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹Œ ๊ฒฝ์šฐ 1 ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰