2020 이전/DirectX 12

다이렉트X Stream Output을 이용한 파티클

스트림 출력 개요 DirectX10부터 렌더링 파이프라인에 Stream-Out(스트림출력) 단계가 추가되었다. 스트림 출력 단계를 이용하면, GPU에서 Stream Output에 묶인 "정점 버퍼"에 기하 셰이더에서 정점을 출력하는 방법으로 직접 정점목록 형태를 정점 버퍼에 기록할 수있다. 그리고 그 정점 버퍼에 저장된 정점들을 차후의 렌더링 파이프라인의 입력으로 사용할 수 있다. 스트림 출력을 이용한 파티클 구현 스트림 출력을 이용하여 파티클을 구현하는 방법은 다음과 같다. 1. 스트림 출력을 거친 정점의 렌더링을 막기위해 픽셀 셰이더와 뎁스/스텐실을 비활성화 한다. 2. 정점 버퍼를 스트림 출력에 묶어 새로운 정점을 기하셰이더로 정점을 출력한다. (SO 단계) 3. 스트림 출력에 묶인 정점 버퍼를 떼..

2020 이전/DirectX 2019.09.19

Depth bias Blend, Two pass Render 이용한 배리어 만들기

depth bias blend는 겹쳐진 오브젝트들의 경계면이 날카롭게 되는것을 픽셀 셰이더 단에서 뒷 오브젝트와의 거리가 근접할 수록 alpha 값을 빼주어 부드럽게 만드는 방법이다. 디퍼드 렌더링에서는 Depth Buffer에 깊이값을 기록해두고 있으므로 이 렌더타겟에 기록된 값을 가져와 지금 그릴 오브젝트와 이미 그려진 오브젝트의 거리를 얻을 수 있다. 소프트 파티클은 아니지만 이 방법을 이용해서 배리어와 겹쳐지는 부분의 alpha를 1로 주어 효과를 줄때, 경계면의 픽셀들은 원하는 색으로 칠할 수 있다. 문제는 반투명한 구체를 생성하여 Back face culling을 껐을 때 위의 이미지처럼 얼룩지는 경우가 생긴다. Depth Read를 끄고 렌더링 깊이 버퍼 읽기를 끄고 렌더링했을 때는 "일단은..

2020 이전/DirectX 2019.08.30

접선공간(tangent space)

한 점의 법선(normal)벡터, 그리고 접선(tangent)벡터, 그리고 법선과 접선을 외적한 바이노멀(binormal)벡터를 축으로 하는 공간이다. 왜 tangent space라고 부르나요? 평면을 옆에서 봤을 때 밑면과 이루는 탄젠트 값이 즉 이 평면의 기울기를 결정하기 때문에 tangent space 라고 부른다. 폴리곤의 평면에서 수직인 법선(normal)로 폴리곤의 기울기 값을 만들고, 접선의 나머지 두 축으로 어느방향으로 기울었는지를 나타내어, 이 세개의 축을 가지고 만든 좌표계를 접선 좌표계라고 부르고 이 좌표계가 존재하는 공간을 접선 공간(tangent space)이라고 한다. 계산 참고: https://mgun.tistory.com/1289 tangent space, 접선 공간 접선 공..

2020 이전/DirectX 2019.07.11

비쥬얼 스튜디오 그래픽 디버깅

1. 디버그 모드에서 그래픽 디버깅 시작을 누른다 2. 프레임 캡처 버튼 또는 print screenshot 키를 눌러서 프레임 캡쳐 3. 원하는 프레임의 빨간 부분을 누른 4. 해당 프레임이 그려지는 순서를 확인할 수 있다. 5. 눌러서 정보를 확인할 수 있다. 디퍼드 렌더링이기때문에 Albedo, Normal, Depth, Material 4개의 렌더타겟 뷰들이 있다. 셰이더 코드에서 vDepth 텍스처의 X,Y,Z에는 투영창에서의 z값/w를, 알파에는 뷰공간 상에서의 z값 깊이를 저장하고있다. 그래픽 디버깅에서는 위와같 해당 오브젝트가 그려진 렌더타겟 픽셀 값을 확인할 수 있다.

2020 이전/DirectX 2019.06.13

스텐실 버퍼를 이용한 라이트 볼륨 디퍼드 렌더링

디퍼드 렌더링. 다수의 광원을 처리하기 위해서 효율성을 위해 GBuffer(Albedo, Normal, Depth, Material)를 만들고 그 위에 라이팅을 처리한다. 문제점. 각 조명을 리스트를 돌면서 전체 픽셀에 대해서 체크한다는것 점광같은 경우, 빛의 영향을 주는 범위를 r이라고 했을때 파란색 영역은 빛이 닿지 않음에도 일단 픽셀셰이더로 들어가게 된다는 단점이 있다. 이것을 개선하기 위한 방법 중 하나인 Tiled deferred shading은 화면을 타일로 나누어 타일별 조명 리스트를 작성하여 타일별로 처리하는 방법이다. 하지만 렌더하기전 매 프레임 각 타일별 조명 리스트를 작성을 요구한다. light volume with deferred rendering 라이트 볼륨 디퍼드 셰이딩은 각 라..

2020 이전/DirectX 2019.06.05

HLSL 셰이더: paper burn, mask, distortion

R채널에는 포토샵으로 생성한 구름 텍스쳐, 그리고 G채널에는 마스킹에 쓸 텍스쳐를 넣었다. 1. paper burn 셰이더 셰이더 코드로 누적시간값에 사인을 연산한 값을 넘겨줘(g_vMtrlDif.a 에 넘겨주었다) 필터의 값으로 썼다. 해당 텍스처의 r값이 g_vMtrlDif.a의 값보다 작으면 해당 텍스처를 출력하지 않는다. g_vMtrlDif.a값을 증가시키면 1이될때 어떤 텍스처도 출력되지 않을 것이다. 이러면 심심하니까 좀더 불에 타는듯이 하려면 테두리가 있어야하는 것을 알 수 있다필터 크기에 간격을 두어 빨강-노랑-흰색을 출력하도록 한다. 내새꾸는 메인컬러는 빨강이므로 (1,0,0,1)로 간다. PS_OUTPUT_SINGLE FX_PaperBurn(VS_OUTPUT_TEX input) { PS..

2020 이전/DirectX 2019.03.04

상수버퍼 패딩

문제: Constant Buffer create에 실패함 시간에 흐름에 따라 흐르는 셰이더를 구현하기 위해서 시간을 상수버퍼에 넘겨줄 일이 생겼다. 이쪽에서 계속 FAILED해서 레지스터 번호를 바꿔도 보고 고민했는데 원인은 CreateBuffer가 16바이트를 요구한다는 것이다. 실제로 필요한 값은 4byte이므로 C++코드 쪽에서 12byte를 패딩해줌. 이제 텍스처가 흐르는것을 확인할 수 있다. HLSL 코드 상수버퍼

2020 이전/DirectX 2019.02.07