πŸ“˜ Direct3D Tutorial6

파인·2022λ…„ 2μ›” 9일
0

Directx

λͺ©λ‘ 보기
6/8
post-thumbnail

https://docs.microsoft.com/en-us/previous-versions//ff729723(v=vs.85)?redirectedfrom=MSDN

μœ„ λ‚΄μš©μ„ μ°Έκ³ ν•˜μ—¬ μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.

Tutorial6 : λΌμ΄νŒ…

λž¨λ²„νŠΌ μ‘°λͺ…(lambertian lighting)을 μ μš©ν•΄λ³΄μž.


πŸ“Œ Lighting

λž¨λ²„νŠΈ μ‘°λͺ…은 λΉ›μœΌλ‘œλΆ€ν„°μ˜ 거리에 관계없이 κ· μΌν•œ 강도λ₯Ό 가진닀. 빛이 ν‘œλ©΄μ— λ‹ΏμœΌλ©΄ λ°˜μ‚¬λ˜λŠ” λΉ›μ˜ 양은 빛이 ν‘œλ©΄μ— λ―ΈμΉ˜λŠ” μž…μ‚¬κ°μ— 따라 κ³„μ‚°λœλ‹€.

κ°λ„μ˜ 계산은 λ‹¨μˆœ λ‚΄μ μœΌλ‘œ κ³„μ‚°λœλ‹€.

이번 νŠœν† λ¦¬μ–Όμ—μ„œ μ‚¬μš©λœ 빛은 directional lighting이닀. νƒœμ–‘μ²˜λŸΌ 물체가 어디에 μžˆλ“  빛이 λΉ„μΆ”λŠ” λ°©ν–₯이 λ™μΌν•˜λ‹€κ³  보며, κ°œλ³„ 물체에 λΉ„μΆ”λŠ” λΉ›μ˜ κ°•λ„λŠ” κ³ λ €ν•˜μ§€ μ•ŠλŠ”λ‹€.

λ‹€λ₯Έ μ’…λ₯˜μ˜ λΉ›μœΌλ‘œλŠ” μ€‘μ•™μ—μ„œ κ· μΌν•œ 빛을 λ°œμ‚°ν•˜λŠ” point lightκ³Ό, λͺ¨λ“  물체에 λ™μΌν•˜κ²Œ μ μš©ν•˜μ§€ μ•ŠλŠ” spot light이 μžˆλ‹€.


πŸ“Œ Initializing the Lights (λΉ› μ΄ˆκΈ°ν™”)

이 νŠœν† λ¦¬μ–Όμ—λŠ” 두 개의 광원이 μžˆλ‹€. ν•˜λ‚˜λŠ” μ •μ μœΌλ‘œ μ •μœ‘λ©΄μ²΄μ˜ μœ„, 뒀에 놓이고, λ‹€λ₯Έ ν•˜λ‚˜λŠ” μ •μœ‘λ©΄μ²΄ μ£Όμœ„λ₯Ό λˆλ‹€.

μ‘°λͺ…은 셰이더에 μ˜ν•΄ κ³„μ‚°λ˜λ―€λ‘œ λ³€μˆ˜λ“€μ€ μ„ μ–Έλœ λ‹€μŒ λ°”μΈλ”©λ˜μ–΄μ•Ό ν•œλ‹€. 이 μƒ˜ν”Œμ—μ„œλŠ” κ΄‘μ›μ˜ λ°©ν–₯κ³Ό 색상 κ°’λ§Œ 있으면 λœλ‹€.
첫 번째 빛은 νšŒμƒ‰μ΄κ³  κ³ μ •λ˜μ–΄ 있으며, 두 번째 빛은 ꢀ도λ₯Ό λ„λŠ” λΉ¨κ°„ 빛이닀.

    // Setup our lighting parameters
    XMFLOAT4 vLightDirs[2] =
    {
        XMFLOAT4( -0.577f, 0.577f, -0.577f, 1.0f ),
        XMFLOAT4( 0.0f, 0.0f, -1.0f, 1.0f ),
    };
    XMFLOAT4 vLightColors[2] =
    {
        XMFLOAT4( 0.5f, 0.5f, 0.5f, 1.0f ),
        XMFLOAT4( 0.5f, 0.0f, 0.0f, 1.0f )
    };

λΉ›μ˜ λ°©ν–₯이 항상 쀑앙을 ν–‰ν•˜λ„λ‘ νšŒμ „ 행렬을 μ μš©ν•œλ‹€. XMVector3Transform ν•¨μˆ˜λŠ” 벑터와 행렬을 κ³±ν•˜λŠ”λ° μ‚¬μš©λœλ‹€. 이전 νŠœν† λ¦¬μ–Όμ—μ„œλŠ” λ³€ν™˜ ν–‰λ ¬λ§Œ μ›”λ“œ 행렬에 κ³±ν•œλ‹€μŒ μ…°μ΄λ”λ‘œ μ „λ‹¬ν•˜μ—¬ λ³€ν™˜μ„ μˆ˜ν–‰ν–ˆλ‹€.
κ·ΈλŸ¬λ‚˜ 이 κ²½μš°μ—λŠ” λ‹¨μˆœμ„±μ„ μœ„ν•΄ CPUμ—μ„œ 빛을 λ³€ν™˜ν•˜λŠ” μž‘μ—…μ„ ν•œλ‹€.

    // Rotate the second light around the origin
    XMMATRIX mRotate = XMMatrixRotationY( -2.0f * t );
    XMVECTOR vLightDir = XMLoadFloat4( &vLightDirs[1] );
    vLightDir = XMVector3Transform( vLightDir, mRotate );
    XMStoreFloat4( &vLightDirs[1], vLightDir );

λΉ›μ˜ λ°©ν–₯κ³Ό 색상은 λͺ¨λ‘ ν–‰λ ¬μ²˜λŸΌ 셰이더에 μ „λ‹¬λœλ‹€. κ΄€λ ¨ λ³€μˆ˜κ°€ ν˜ΈμΆœλ˜μ–΄ μ„€μ •λ˜κ³  맀개 λ³€μˆ˜κ°€ μ „λ‹¬λœλ‹€.

    //
    // Update matrix variables and lighting variables
    //
    ConstantBuffer cb1;
    cb1.mWorld = XMMatrixTranspose( g_World );
    cb1.mView = XMMatrixTranspose( g_View );
    cb1.mProjection = XMMatrixTranspose( g_Projection );
    cb1.vLightDir[0] = vLightDirs[0];
    cb1.vLightDir[1] = vLightDirs[1];
    cb1.vLightColor[0] = vLightColors[0];
    cb1.vLightColor[1] = vLightColors[1];
    cb1.vOutputColor = XMFLOAT4(0, 0, 0, 0);
    g_pImmediateContext->UpdateSubresource( g_pConstantBuffer, 0, NULL, &cb1, 0, 0 );

πŸ“Œ Rendering the Lights in the Pixel Shader (ν”½μ…Έ 셰이더에 λΉ› λ Œλ”λ§ ν•˜κΈ°)

λΉ›κ³Ό 노멀을 λ‚΄μ ν•˜λ©΄ λΉ›μ˜ 효과(색상)λ₯Ό 계산할 수 μžˆλ‹€.
이 값은 λ²”μœ„λ₯Ό [0. 1]둜 λ³€ν™˜ν•˜λŠ” saturate ν•¨μˆ˜λ₯Ό 톡해 μ „λ‹¬λœλ‹€.
λ§ˆμ§€λ§‰μœΌλ‘œ, 두 개λ₯Ό 합쳐 μ΅œμ’… 색이 κ²°μ •λœλ‹€.

ν‘œλ©΄μ˜ 머터리얼은 계산에 ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€κ³  κ°€μ •ν•˜μ—¬ ν‘œλ©΄μ˜ μ΅œμ’…μ μΈ 색깔 = λΉ›μ˜ 색깔이닀.

    //
    // Pixel Shader
    //
    float4 PS( PS_INPUT input) : SV_Target
    {
        float4 finalColor = 0;
        
        //do NdotL lighting for 2 lights
        for(int i=0; i<2; i++)
        {
            finalColor += saturate( dot( (float3)vLightDir[i],input.Norm) * vLightColor[i] );
        }
        return finalColor;
    }

일단 ν”½μ…Έ 셰이더λ₯Ό ν†΅κ³Όν•˜λ©΄, 픽셀듀은 빛에 μ˜ν•΄ 변쑰될 것이고, 큐브 ν‘œλ©΄μ— 각 빛이 λ―ΈμΉ˜λŠ” 영ν–₯을 λ³Ό 수 μžˆλ‹€.

profile
κ³΅λΆ€μ •λ¦¬μš©

0개의 λŒ“κΈ€