Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

codingfarm

28. 혼합(Blending) - 작성 중 본문

computer graphics/DirectX12

28. 혼합(Blending) - 작성 중

scarecrow1992 2021. 9. 27. 22:37

혼합

  1. 현재 pipeline에서 래스터화하는 픽셀(PS에서 출력된 픽셀)
  2. 이전 pipeline결과 backbuffer에 저장된 pixel

위 2가지 자원을 섞는 기법

주로 반투명 물체의 렌더링에 사용된다.

 

목표

  1. 혼합의 작동 방식과 Direct3D에서 혼합을 사용하는 법을 이해
  2. Direct3D가 지원하는 여러 혼합모드를 배운다.
  3. 기본 도형의 투명도를 알파 성분으로 제어하는 법을 파악한다.
  4. HLSL의 clip 함수를 이용ㅇ하여 한 픽셀이 후면 버퍼에 아예 그려지지 않게 만드는 법을 배운다.

 

1. 혼합공식

혼합 : PS에서 출력된 원본 픽셀($C_{src}$)과 이미 back buffer에 저장되어 있는 대상 픽셀($C_{dst}$)의 색상을 혼합하는것

$C_{src}$ : 현재 래스터화 중인 $ij$ 번째 픽셀, 즉 원본 픽셀(source pixel)에 대해 픽셀 셰이더가 출력한 색상

$C_{dst}$ : 현재 후면 버퍼에 있는 $ij$번째 픽셀, 즉 대상 픽셀(destination pixel)의 색상

$F_{src}, \; F_{dst}$ : 각 원본과 대상의 혼합 계수(blend factor)

위 2가지 색상을 적절히 섞어 새로운 색 $C$를 얻는것을 혼합이라 한다.

Direct3D가 사용하는 혼합 공식은 아래와 같다.

$$C = C_{src}\otimes F_{src} \boxplus C_{dst}\otimes F_{dst}$$

$$A = A_{src}  F_{src} \boxplus A_{dst} F_{dst}$$

위 처럼 혼합공식은 RGB성분과 A성분이 따로 존재한다.

벡터 $C$와 달리 $A$는 스칼리 이므로 성분별 곱셈이 아닌 스칼라곱을 사용한다는 차이가 있다.

 

RGB색상의 이항 연산 $\boxplus$에 사용 가능한 연산자는 아래와 같다.

1
2
3
4
5
6
7
typedef enum D3D12_BLEND_OP {
  D3D12_BLEND_OP_ADD,            // $C = C_{src}\otimes F_{src} + C_{dst}\otimes F_{dst}$
 D3D12_BLEND_OP_SUBTRACT,       // $C = C_{dst}\otimes F_{dst} - C_{src}\otimes F_{src}$
 D3D12_BLEND_OP_REV_SUBTRACT,   // $C = C_{src}\otimes F_{src} - C_{dst}\otimes F_{dst}$
  D3D12_BLEND_OP_MIN,            // $C = min(C_{src}, C_{dst})$
 D3D12_BLEND_OP_MAX             // $C = max(C_{src}, C_{dst})$
} ;
cs

이 공식은 알파 혼합 공식에도 동일하게 쓰인다.

하지만 RGB 성분 혼합의 연산자와 알파 성분 혼합의 연산자를 따로 선택할 수 있다.

가령 아래와 같은 연산도 가능해진다.

$$C = C_{dst}\otimes F_{dst} +  C_{src}\otimes F_{src} \\
A = A_{dst} F_{dst} - A_{src}\otimes F_{src}$$

 

최근 direct3D에는 전통적인 혼합 공식 대신 아래처럼 논리 연산자를 이용해서 섞는 기능도 추가되었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
typedef enum D3D12_LOGIC_OP {
  D3D12_LOGIC_OP_CLEAR,
  D3D12_LOGIC_OP_SET,
  D3D12_LOGIC_OP_COPY,
  D3D12_LOGIC_OP_COPY_INVERTED,
  D3D12_LOGIC_OP_NOOP,
  D3D12_LOGIC_OP_INVERT,
  D3D12_LOGIC_OP_AND,
  D3D12_LOGIC_OP_NAND,
  D3D12_LOGIC_OP_OR,
  D3D12_LOGIC_OP_NOR,
  D3D12_LOGIC_OP_XOR,
  D3D12_LOGIC_OP_EQUIV,
  D3D12_LOGIC_OP_AND_REVERSE,
  D3D12_LOGIC_OP_AND_INVERTED,
  D3D12_LOGIC_OP_OR_REVERSE,
  D3D12_LOGIC_OP_OR_INVERTED
} ;
cs

주의사항

  1. 전통적인 혼합공식과 논리 연산자 혼합을 동시에 사용할 수는 없다.
  2. 논리연산은 그것을 지원하는 Render Target에만 사용 가능하다.
    • 가령 픽셀 형식이 부호 없는 정수형식 이어야 한다.

 

 

 

1-1. 혼합 방법

PSO를 생성하기 위한 D3D12_GRAPHICS_PIPELINE_STATE_DESC 구조체에 혼합상태를 정의하기 위한 D3D12_BLEND_DESC 구조체 필드가 존재한다. 이 구조체에서 알파 포괄도 변환 여부를 설정하고 D3D12_RENDER_TARGET_BLEND_DESC 구조체에서 파이프라인 실행시 혼합공식에 대한 상세한 설정을 진행한다.

 

2. 혼합 계수

앞서 $C_{src}$와 $C_{dst}$ 가 주어젔을 때, 혼합 연산자$\boxplus$와 원본 혼합계수($F_{src}$), 대상 혼합 계수($F_{dst}$)를 적절히 조합하여 수십가지의 서로 다른 혼합 효과를 얻을 수 있다. 혼합 계수(blend factor)를 설정하기 위해선 D3D12_BLEND 열거형을 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typedef enum D3D12_BLEND {
  D3D12_BLEND_ZERO,
  D3D12_BLEND_ONE,
  D3D12_BLEND_SRC_COLOR,
  D3D12_BLEND_INV_SRC_COLOR,
  D3D12_BLEND_SRC_ALPHA,
  D3D12_BLEND_INV_SRC_ALPHA,
  D3D12_BLEND_DEST_ALPHA,
  D3D12_BLEND_INV_DEST_ALPHA,
  D3D12_BLEND_DEST_COLOR,
  D3D12_BLEND_INV_DEST_COLOR,
  D3D12_BLEND_SRC_ALPHA_SAT,
  D3D12_BLEND_BLEND_FACTOR,
  D3D12_BLEND_INV_BLEND_FACTOR,
  D3D12_BLEND_SRC1_COLOR,
  D3D12_BLEND_INV_SRC1_COLOR,
  D3D12_BLEND_SRC1_ALPHA,
  D3D12_BLEND_INV_SRC1_ALPHA
} ;
cs

모든 멤버의 상세효과는 링크를 참조할것

RGB 혼합공식은 위의 혼합 계수들을 모두 사용할 수 있다.

alpha 혼합공식은 _COLOR로 끝나는 계수들은 사용할 수 없다.

 

혼합 계수 색상 설정

혼합 계수 색상은 다음 메서드로 pipeline에 설정할 수 있다.

1
2
3
void ID3D12GraphicsCommandList::OMSetBlendFactor(
  const FLOAT [4] BlendFactor
);
cs

nullptr을 지정하여 이 메서드를 호출하면 기본 혼합 계수인 (1, 1, 1, 1)로 설정된다

 

3. 혼합 상태(Blend State)

앞에서 배운 혼합 연산자혼합 계수와 같은 혼합 설정은 PSO의 일부인 혼합 상태에 담겨 pipeline에 반영된다.

혼합상태의 설정은 PSO의 멤버인 D3D12_BLEND_DESC 구조체를 채워야한다.

1
2
3
4
5
typedef struct D3D12_BLEND_DESC {
  BOOL                           AlphaToCoverageEnable;
  BOOL                           IndependentBlendEnable;
  D3D12_RENDER_TARGET_BLEND_DESC RenderTarget[8];
} D3D12_BLEND_DESC;
cs

1. AlphaToCoverageEnable

알파-포괄도(alpha-to-coverage) 변환의 활성화 여부를 결정

TRUE : 변환 활성화

FALSE : 변환 비활성화

알파-포괄도 변환

  • 다중표본화(multisampling) 기법
  • 창살 텍스처 및 식물 군엽의 렌더링에 유용함
  • 알파-포괄도 변환을 쓰기 위해선 반드시 다중표본화가 활성화 되어야 한다.
    (다중표본화에 맞는 back buffer와 depth buffer를 생성해 두어야 한다.)

 

2, IndependentBlendEnable

여러개의 Render Target에 혼합 방식을 각자 다른방식으로 수행할지 여부를 결정한다.
(혼합 활성화 여부, 혼합 계수, 연산자 등을 다르게 둠)
최대 8개의 Render Target에 수행 가능

세번째 멤버인 D3D12_BLEND_DESC::RenderTaget  배열에 각 Render Target에 적용될 혼합 방식을 적용한다.

True : 각 render taget에 다른 방식으로 혼합연산 수행

False : 배열의 첫 원소에 있는 설정을 모든 render target에 동일하게 수행

 

3. RenderTarget

D3D12_RENDER_TARGET_BLEND_DESC 원소 여덟개로 이루어진 배열

i번째 원소는 장면을 동시에 여러 Render Target에 렌더링 할 때 i 번째 render target에 적용할 혼합 설정을 담은 구조체이다.

두번째 멤버와 연동하여 사용됨

1
2
3
4
5
6
7
8
9
10
11
12
typedef struct D3D12_RENDER_TARGET_BLEND_DESC {
  BOOL           BlendEnable;
  BOOL           LogicOpEnable;
  D3D12_BLEND    SrcBlend;
  D3D12_BLEND    DestBlend;
  D3D12_BLEND_OP BlendOp;
  D3D12_BLEND    SrcBlendAlpha;
  D3D12_BLEND    DestBlendAlpha;
  D3D12_BLEND_OP BlendOpAlpha;
  D3D12_LOGIC_OP LogicOp;
  UINT8          RenderTargetWriteMask;
} D3D12_RENDER_TARGET_BLEND_DESC;
cs

1. BlendEnable

  • 혼합 활성화 여부를 설정
  • True : 활성화
  • False : 비활성화

 

2. LogicOpEnable

  • 논리 연산자 혼합 활성화 여부를 설정
  • True : 활성화
  • False : 비활성화

 

BlendEnable과 LogicOpEnable을 둘 다 TRUE로 설정할 수는 없다.

 

3. SrcBlend

  • RGB 혼합의 원본 혼합 계수 $F_{src}$에 해당
  • D3D12_BLEND 열거형의 한 멤버를 지정해야 함

 

4. DestBelnd

  • RGB 혼합의 원본 혼합 계수 $F_{dst}$에 해당
  • D3D12_BLEND 열거형의 한 멤버를 지정해야 함

 

5. BlendOp

  • RGB 혼합의 혼합 연산자에 해당
  • D3D12_BLEND_OP 열거형의 한 멤버를 지정해야 함

 

6. SrcBlendAlpha

  • 알파 혼합의 원본 혼합 계수 $F_{src}$에 해당
  • D3D12_BLEND 열거형의 한 멤버를 지정해야 함

 

7. DestBlendAlpha

  • 알파 혼합의 원본 혼합 계수 $F_{dst}$에 해당
  • D3D12_BLEND 열거형의 한 멤버를 지정해야 함

 

8. BlendOpAlpha

  • 알파 혼합의 혼합 연산자에 해당
  • D3D12_BLEND_OP 열거형의 한 멤버를 지정

 

9. LogicOp

  • 원본 색상과 대상 색상을 섞을 논리 연산자에 해당
  • D3D12_LOGIC_OP 열거형의 한 멤버를 지정

 

10. RenderTargetWriteMask

  • 렌더 대상 쓰기 마스크
  • D3D12_COLOR_WRITE_ENABLE 열거형의 플래그를 조합하여 지정
  • 혼합의 결과가 기록될 back buffer 색상 채널들을 결정한다.
    • 가령 결과가 RGB 채널들에는 기록되지 않고 알파 채널에만 기록되게 하고 싶으면 D3D12_COLOR_WRITE_ENABLE_ALPHA를 지정하면 된다.
    • 혼합을 비활성화 하면 pixel shader가 돌려준 색상에 그 어떤 쓰기 마스크도 적용되지 않는다.
1
2
3
4
5
6
7
typedef enum D3D12_COLOR_WRITE_ENABLE {
  D3D12_COLOR_WRITE_ENABLE_RED,
  D3D12_COLOR_WRITE_ENABLE_GREEN,
  D3D12_COLOR_WRITE_ENABLE_BLUE,
  D3D12_COLOR_WRITE_ENABLE_ALPHA,
  D3D12_COLOR_WRITE_ENABLE_ALL
} ;
cs

 

혼합 상태 생성, 설정 예

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Start from non-blended PSO
D3D12_GRAPHICS_PIPELINE_STATE_DESC transparentPsoDesc
= opaquePsoDesc;
 
D3D12_RENDER_TARGET_BLEND_DESC transparencyBlendDesc;
transparencyBlendDesc.BlendEnable = true;
transparencyBlendDesc.LogicOpEnable = false;
transparencyBlendDesc.SrcBlend = D3D12_BLEND_SRC_ALPHA;
transparencyBlendDesc.DestBlend = D3D12_BLEND_INV_SRC_ALPHA;
transparencyBlendDesc.BlendOp = D3D12_BLEND_OP_ADD;
transparencyBlendDesc.SrcBlendAlpha = D3D12_BLEND_ONE;
transparencyBlendDesc.DestBlendAlpha = D3D12_BLEND_ZERO;
transparencyBlendDesc.BlendOpAlpha = D3D12_BLEND_OP_ADD;
transparencyBlendDesc.LogicOp = D3D12_LOGIC_OP_NOOP;
transparencyBlendDesc.RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL;
 
transparentPsoDesc.BlendState.RenderTarget[0= transparencyBlendDesc;
ThrowIfFailed(md3dDevice->CreateGraphicsPipelineState(
    &transparentPsoDesc,
    IID_PPV_ARGS(&mPSOs[“transparent”])));
cs

 

혼합의 비 활성화는 아래처럼 기본 혼합 상태를 사용하면 된다.

1
2
3
4
D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc;
ZeroMemory(&psoDesc, sizeof(D3D12_GRAPHICS_PIPELINE_STATE_DESC));
...
psoDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT);
cs

 

 

4. 예제

특정 효과를 위한 혼합 계수들과 혼합 연산자 조합의 몇가지 예 들

여기서는 RGB 성분 조합만 다루지만, 알파 성분 혼합도 적용 가능함

 

 

4-1. 색상 기록 금지

원본 픽셀($C_{src}$)이 대상 픽셀($C_{dst}$)을 덮어쓰거나 섞이게 하지 않고, 항상 대상 픽셀이 유지되게끔한다.

렌더링 결과를 depth stencil buffer에만 기록하고 back buffer에는 기록하지 않고자 할 때 유용함

1
2
3
4
D3D12_RENDER_TARGET_BLEND_DESC transparencyBlendDesc;
transparencyBlendDesc.BlendOp = D3D12_BLEND_OP_ADD;
transparencyBlendDesc.SrcBlendAlpha = D3D12_BLEND_ONE;
transparencyBlendDesc.DestBlendAlpha = D3D12_BLEND_ZERO;
cs

$$\begin{align*}
& C = C_{src} \otimes F_{src} \boxplus C_{dst} \otimes F_{dst} \\
& C = C_{src} \otimes (0, 0, 0) + C_{dst} \otimes (1, 1, 1) \\
& C = C_{dst}
\end{align*}$$

 

4-2. 가산 혼합

원본 픽셀을 대상 픽셀에 더한다.

$$\begin{align*}
& C = C_{src} \otimes F_{src} \boxplus C_{dst} \otimes F_{dst} \\
& C = C_{src} \otimes (1, 1, 1) + C_{dst} \otimes (1, 1, 1) \\
& C = C_{src} + C_{dst}
\end{align*}$$

1
2
3
4
D3D12_RENDER_TARGET_BLEND_DESC transparencyBlendDesc;
transparencyBlendDesc.BlendOp = D3D12_BLEND_OP_ADD;
transparencyBlendDesc.SrcBlendAlpha = D3D12_BLEND_ONE;
transparencyBlendDesc.DestBlendAlpha = D3D12_BLEND_ONE;
cs

가산  혼합을 통해 기존 이미지에 색(빛)을 더하여 밝은 이미지를 만들 수 있다

 

4-3. 감산 혼합

원본 픽셀을 대상 픽셀로 뺀다

\begin{align*}
& C = C_{src} \otimes F_{src} \boxplus C_{dst} \otimes F_{dst} \\
& C = C_{src} \otimes (1, 1, 1) - C_{dst} \otimes (1, 1, 1) \\
& C = C_{src} +C_{dst}
\end{align*}

1
2
3
4
D3D12_RENDER_TARGET_BLEND_DESC transparencyBlendDesc;
transparencyBlendDesc.BlendOp = D3D12_BLEND_OP_SUBTRACT;
transparencyBlendDesc.SrcBlendAlpha = D3D12_BLEND_ONE;
transparencyBlendDesc.DestBlendAlpha = D3D12_BLEND_ONE;
cs

감산 혼합에 의해 색(빛)이 제거되므로 더 어두운 이미지가 만들어 진다.

 

4-4. 승산 혼합

원본 픽셀을 대상 픽셀에 성분별로 곱한다

$$\begin{align*}
& C = C_{src} \otimes F_{src} \boxplus C_{dst} \otimes F_{dst} \\
& C = C_{src} \otimes (0, 0, 0) + C_{dst} \otimes C_{src} \\
& C = C_{src} \otimes C_{dst}
\end{align*}$$

1
2
3
4
D3D12_RENDER_TARGET_BLEND_DESC transparencyBlendDesc;
transparencyBlendDesc.BlendOp = D3D12_BLEND_OP_ADD;
transparencyBlendDesc.SrcBlendAlpha = D3D12_BLEND_ONE;
transparencyBlendDesc.DestBlendAlpha = D3D12_BLEND_SRC_COLOR;
cs

 

 

5. 투명도(Transparency)

불투명도가 A이고 투명도가 T이면 이 둘의 관계는 $A = 1 - T$ 이다. 즉, 어떤 픽셀이 0.4 만큼 불투명하다는것은 0.6만큼 투명하다는것과 같은 뜻이다.

어떤 물체를 불투명하게 만든다는것은 원본 픽셀과 대상 픽셀을 불 투명도에 비례해서 혼합한다는 것을 의미한다.

이를 위해서는 원본 혼합 계수를 D3D12_BLEND_SRC_ALPHA로, 대상 혼합 계수를 D3D12_BLEND_INV_SRC_ALPHA로, 그리고 혼합 연산자를 D3D12_BLEND_OP_ADD로 두면 된다.

1
2
3
4
D3D12_RENDER_TARGET_BLEND_DESC transparencyBlendDesc;
transparencyBlendDesc.BlendOp = D3D12_BLEND_OP_ADD;
transparencyBlendDesc.SrcBlendAlpha = D3D12_BLEND_SRC_ALPHA;
transparencyBlendDesc.DestBlendAlpha = D3D12_BLEND_INV_SRC_ALPHA;
cs

$$\begin{align*}
& C = C_{src} \otimes F_{src} \boxplus C_{dst} \otimes F_{dst} \\
& C = C_{src} \otimes (a_s, a_s, a_s) + C_{dst} \otimes (1-a_s,1- a_s, 1-a_s) \\
& C = a_sC_{src} + (1-a_s) C_{dst}
\end{align*}$$

위 혼합방법을 통해 아래와 같은 반 투명한 물체를 만들 수 있다.

 

혼합 방법에서는 물체들을 그리는 순서가 중요하다. 일반적인 절차는 아래와 같다.

  1. 혼합을 사용하지 않는 물체들을 먼저 그린다.
  2. 혼합을 사용하는 물체들을 카메라로부터 멀리있는 물체부터 그린다.
    • 투명한 물체는 그 뒤에 있는 사물들도 모두 보인다.
    • 그러기 위해선 투명한 물체 뒤에 있는 사물들이 미리 back buffer에 기록되어 있어야 한다.
    • 그래야 투명한 원본 픽셀을 그 뒤에 있는 장면의 대상 픽셀과 혼합할 수 있다.

혼합을 사용하지 않는 물체란 기본 혼합상태로 설정된체 그려지는 물체라 볼 수 있다.

psoDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT);

 

만약 혼합을 사용하는 반투명한 물체를 카메라에 가까운것부터 배치하면, 그 이후 뒤에 있는 물체들은 depth 판정에 의해 막히게 되어 backbuffer에 그릴 수 없게된다. 

 

 

아니면 정렬할 필요 없이 렌더링 결과를 다른 백버퍼에 모두 저장 한 후, 이후 한꺼번에 연산하는 방법도 존재한다.

가령 $B$가 back buffer의 픽셀색상이고, $C_n$이 혼합물체의 렌더링 결과 나온 픽셀색상일 경우, 혼합 연산들이 교환법칙을 만족한다는 특징을 이용하여, 그려지는 순서에 상관 없이 동일한 결과를 얻을 수 있다.

위 처럼 입자들이 많이 겹처지는 방출점 부근이 제일 밝으며, 분산되기 시작하면 겹치는(색이 더해지는) 입자가 줄어서 빛(색)이 약해진다

 

깊이 판정을 수행하지 않는것으로 예방 가능하다. 깊이 판정을 수행하지 않으면, 먼저 그려진 혼합물체에 이후 물체가 거려저서 그리기가 실패할 일도 없으며, 혼합물체들을 정렬할필요도 없게 된다.

깊이판정 비활성화 방법

<나중에>

 

 

https://www.slideshare.net/jpcorp/5-10351002

보다자세한 정보는 링크를 참조

 

 

6. 알파 채널

일반적으로 혼합 공식에 쓰이는 원본 색상($C_{src}$)는 Pixel Shader가 출력한것이지만, 알파값은 해당 오브젝트의 material 정보에서 가저온다.

일반적으로 이미지의 색정보를 담는 RGB 정보와 alpha 정보는 별개 파일로부터 읽어와 채널을 형성한다.

이를 위해선 알파 채널을 지원하는 파일 형식을 사용한다.

1
2
3
4
5
6
7
8
9
10
float4 PS(VertexOut pin) : SV_Target
{
    float4 diffuseAlbedo = gDiffuseMap.Sample(
        gsamAnisotropicWrap, pin.TexC) * gDiffuseAlbedo;
    
    // ...
 
    litColor.a = diffuseAlbedo.a;
    return litColor;
}
cs

 

 

7. 픽셀 잘라내기(Clipping Pixels)

내장 HLSL 함수 clip(x)를 이용하여 원본 픽셀을 완전히 기각(reject)하여 더 이상의 처리가 일어나지 않게 할 수 있다.

$x<0$ 이면 현재 픽셀을 폐기해서 더 이상의 처리가 일어나지 않게 한다.

위 이미지의 알파채널에서 검은색으로 표시된곳은 현재 픽셀을 폐기하여 완전 투명하게 만들 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
float4 PS(VertexOut pin) : SV_Target
{
    float4 diffuseAlbedo = gDiffuseMap.Sample(
        gsamAnisotropicWrap, pin.TexC) * gDiffuseAlbedo;
    
#ifdef ALPHA_TEST
    // Discard pixel if texture alpha < 0.1.  We do this test as soon 
    // as possible in the shader so that we can potentially exit the
    // shader early, thereby skipping the rest of the shader code.
    clip(diffuseAlbedo.a - 0.1f);
#endif
 
    // ...
 
    litColor.a = diffuseAlbedo.a;
    return litColor;
}
cs

혼합을 이용해도 같은 효과를 얻을 수 있지만, 효율만 보자면 폐기가 더 좋다.

 

폐기의 장점

  • 혼합 계산이 불필요
  • 그리기 순서에 무관
  • 이후 명령을 생략하여 연산량을 줄임

 

 

8. 안개

<추후 작성>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'computer graphics > DirectX12' 카테고리의 다른 글

30. 계산 셰이더(Compute Shader) - 작성중  (0) 2021.10.17
29. 스텐실 적용(Stenciling)  (0) 2021.10.03
27-1. 텍스처적용 예제 코드  (0) 2021.09.22
27. 텍스처 적용(Texturing)  (0) 2021.09.19
26. 좌표 변환  (0) 2021.08.23
Comments