목록전체 글 (65)
Visual Studio
Vulkan에서 Descriptor를 추가하여 사용할 수 있도록 Texture를 로드하여 준비하는 과정은 다음과 같다. 1. Staging Buffer를 생성한다. (이미지에 픽셀 데이터를 복사하기 위한 임시 버퍼)2. vkMapMemory() 함수로 Staging Buffer의 가상 주소를 포인터에 저장한다.3. memcpy 함수로 이미지를 Staging Buffer의 메모리에 복사한다.4. vkUnmapMemory() 함수로 매핑한 가상 주소를 해제한다.5. Image를 생성한다.6. vkCmdPipelineBarrier() 함수로 이미지의 레이아웃을 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL로 변경한다.7. vkCmdCopyBufferToImage() 함수로 버퍼 안의 데이터..
Geometry Shader를 사용하여 TBN 행렬의 각 요소를 시각화하였다.아래는 사용된 쉐이더 소스코드이다.#version 450struct Light{ vec3 position; vec4 ambient; vec4 diffuse; vec4 specular; vec4 attenuation; float shininess;};layout(std140, binding = 0) uniform UniformBufferObject{ mat4 view; mat4 projection; vec3 cameraPosition; Light light;} ubo;layout(location = 0) in vec3 inPosition;layout(location = 1) i..
실제 게임 플레이시에는 BackBuffer에 직접 씬을 렌더링하지만,Unreal Editor에서 편집중인 월드를 뷰포트에 그릴 때는 BackBuffer에 그리지 않고 BufferedRT라는 텍스쳐를 렌더 타겟으로 하여 그린 후 Slate UI 그릴때 BufferedRT 텍스쳐를 가져와서 뷰포트에 그린다. RenderDoc에서 뜯어본 BufferedRT 텍스쳐
테스트를 위해 주어진 개수만큼 오브젝트를 범위내 랜덤 위치, 랜덤 회전값으로 배치시키도록 구성했다.쉐이더는 Blinn-phong 모델을 구현하였다. Debug, 인스턴스 100000개, Instance Buffer(= Second Vertex Buffer, Binding 1) 평균 25.52 fps Debug, 인스턴스 100000개, Storage Buffer 평균 25.78 fps Debug 모드에서는 Instance Buffer와 Storage Buffer가 큰 차이가 없었다.이제 Release 모드에서 해보자. Release, 인스턴스 100000개, Instance Buffer 평균 60.06 fps Release, 인스턴스 100000개, Storage Buffer 평균..
중요한 포인트는 "Relative"와 "Local"의 차이이다.Relative는 부모 Component의 트랜스폼에 기반한 좌표계를 의미하며,Local은 자기 자신의 트랜스폼에 기반한 좌표계를 의미한다.따라서 "AddRelativeLocation" 함수는 부모 트랜스폼의 좌표계에서 주어진 벡터만큼 이동하는 것이고,"AddLocalOffset" 함수는 자기 자신의 좌표계에서 주어진 벡터만큼 이동하는 것을 의미한다.참고자료https://forums.unrealengine.com/t/difference-between-addlocaloffset-and-addrelativelocation-nodes/53731/3
FFrameNumberFFrameRateFFrameTime 혹시 사용할 일이 있을 수도 있으니 기억해두자.
소량의 데이터를 빠르게 전달할 때 사용한다. 변환 행렬 등을 쉐이더로 넘길 때도 사용할 수 있다.모든 쉐이더 단계에 데이터를 전송할 수 있다.Command Buffer 자체에 저장되기 때문에 Command Buffer를 다시 만들지 않는 한 변경할 수 없다.vkCmdPushConstants() 함수를 사용하여 데이터를 Command Buffer에 입력한다.쉐이더에서는 다음과 같이 사용한다.layout( push_constant ) uniform constants{ vec4 data; mat4 render_matrix;} PushConstants;
Fragment Shader (Direct X에서는 Pixel Shader) 이후 Depth test를 수행하여 Depth test에 실패한 Fragment를 폐기하는 과정을 거치는데, 이를 Fragment Shader 이전으로 앞당겨 그려지지 않을 Fragment에 대한 불필요한 Fragment Shader 연산을 하지 않도록 할 수 있다. 장점- 불필요한 Fragment Shader 연산을 줄일 수 있다.- 따라서 GPU 부하가 감소한다. 단점- Fragment Shader가 깊이값을 변경하는 경우에는 의도대로 렌더링되지 않을 수 있다.- 반투명 오브젝트가 Depth test에 실패하여 렌더링되지 않을 수 있다.- 사용하는 Fragment shader의 연산이 가벼운 경우 Early depth tes..
Primary Command Buffer- Queue에 직접 제출할 수 있다.- 여러개의 Secondary Command Buffer를 호출할 수 있다.- Seconary Command Buffer와 달리 Render Pass 내부에서 호출되어야 한다는 제약이 없다.Secondary Command Buffer- Queue에 직접 제출할 수 없다.- Render Pass 내부에서만 호출될 수 있다.- Primary Command Buffer에서 Secondary Command Buffer를 호출하여 간접적으로 Queue에 제출할 수 있다.- 다른 Primary Command Buffer를 호출할 수 없다.- 여러 Primary Command Buffer에서 재사용이 가능하다.- Primary Command..
아이디어- 폰트 관련 데이터 객체들(FCodepointFontCacheData, FFontData, FFreeTypeFaceGlyphData)을 가져올 때 유효한지 검사하는 로직이 오버헤드가 큼. - 정확히는 아래 두 함수 내부의 검사 로직이 오버헤드가 크다. - FSlateFontRenderer::GetFontDataForCodepoint() - FCompositeFontCache::GetFontFaceForCodepoint()- 유효함이 이미 검증된 폰트 데이터는 한번 더 캐싱함. (편의를 위해 2차 캐시라고 부르겠음)- 이후 같은 글자에 대해서 폰트 데이터가 필요할 경우 2차 캐시가 있다면 검사 과정을 스킵하고 가져옴. 구현영향을 미치는 범위를 줄이기 위해 Ascii code 범위의..