본문 바로가기

일하면서 사용한 짧은 지식

(15)
DirectX11의 Shader를 컴파일하여 헤더파일로 만들기 1. 상황 DirectX11 렌더러 구성 작업 중 셰이더 코드를 수정하면서 동작을 확인해야할 필요가 있어서 렌더링할 때마다 셰이더 파일에서 컴파일하는 방법으로 구성했었다. 테스트를 완료하여 이제 셰이더 코드를 변경할 필요가 없어졌고, 현재 상태는 셰이더 코드가 그대로 노출되어 있기에 미리 컴파일하여 렌더링할 필요가 있었다. 검색결과 .cso(compiled shader object) 파일로 만들어서 패키지에 포함시킬 건지, 아니면 .header파일에 BYTE 배열로 만들어 빌드하여 렌더러 DLL에 합치는 방법 이렇게 2가지로 고민했었다. 이번 작업에서는 Shader를 미리 컴파일하는 목적이 셰이더 코드를 노출하지 않기 위함이라 헤더파일로 만들어서 DLL에 포함시키는 방법을 선택하였다. 2. 셰이더 컴파일..
C++에서 인터페이스로 사용하기 위해 Class를 정의한다면, 소멸자에 virtual를 지정해 줘야 한다. 1. 문제 상황 C++ 코드로 DirectX11을 활용하여 렌더러를 만드는 작업 중이었다. 여러 조건에 따라 옵션을 교체하여 사용하기 위해 인터페이스 클래스를 구현하고 이를 상속받아 각각의 클래스를 구현하였었다. 그런데 해당 클래스에서 사용하는 DirectX 리소스가 해제가 안되어, 재할당할 때 프로그램이 다운되는 에러가 발생했었다. 디버깅하여 확인해보니 리소스가 해제되는 조건에서 delete가 호출되어도 소멸자가 호출 안되고 있었다. 2. 원인 인터페이스를 정의할 때 공통으로 사용할 메시지만 정의하였지 소멸자를 신경 쓰지 않았었다. 인터페이스에 가상 소멸자를 추가하지 않아 delete 호출 시 인터페이스를 상속받은 클래스의 소멸자가 실행되지 않는다. public class Interface { publ..
ID2D1GeometrySink의 AddLines 메서드를 이용해 ID2D1PathGeometry*에 Underline(밑줄), Strikethrough(취소선) 추가하기 1. AddLines 메서드를 이용해 직접 윤곽선을 추가해야 했던 동기 https://myoung-min.tistory.com/60 GDI의 LOGFONT에서 DirectWrite 폰트를 생성할 때 가져오지 못하는 정보도 있다. (Underline, StrikeOut) Glyph를 이용해 텍스트를 그리는데 Bold, Italic, Underline, StrikeOut 효과를 적용할 필요가 있었다. IDWriteFontFace*에서 GlyphIndices 받아와 ID2D1PathGeometry*를 생성하고 그려야하는 상황이었다. IDWrite.. myoung-min.tistory.com 위 내용처럼 LOGFONT에 밑줄, 취소선의 값을 설정하고 IDWriteGdiInterop*로 CreateFontFrom..
GDI의 LOGFONT에서 DirectWrite 폰트를 생성할 때 가져오지 못하는 정보도 있다. (Underline, StrikeOut) Glyph를 이용해 텍스트를 그리는데 Bold, Italic, Underline, StrikeOut 효과를 적용할 필요가 있었다. IDWriteFontFace*에서 GlyphIndices 받아와 ID2D1PathGeometry*를 생성하고 그려야하는 상황이었다. IDWriteFont를 GDI의 LOGFONT를 통해 생성하여 위 과정을 수행. https://docs.microsoft.com/en-us/windows/win32/directwrite/interoperating-with-gdi Interoperating with GDI - Win32 apps DirectWrite provides a migration path from, and some interoperability with, GDI's font..
Direct2D Factory를 통해 생성한 리소스는 모두 같은 Factory에서 생성해야한다. ID2D1Factory1*에서 생성하는 ID2D1Device*, ID2D1PathGeometry*, ID2D1TransformedGeometry* 모두 같은 ID2D1Factory1*에서 생성해야 문제가 없다. https://www.codeproject.com/Articles/376597/Outline-Text-With-DirectWrite Outline Text With DirectWrite Draw text outline using DirectWrite www.codeproject.com 위 예제와 같이 윤곽선이 있는 텍스트를 그리는 작업을 진행할 때 발생했던 문제. 처음 코드를 작성했을 때 ID2D1Factory1*를 멤버로 갖고 유지할 필요가 없을 것이라 생각했었다. D2D1CreateFactor..
Thread와 ThreadPool 중 선택하기 Thread 일반적으로 하나의 쓰레드를 오래 동안 사용하거나 동일한 쓰레드에서 계속 작업을 진행해야 하는 경우 사용하는 것이 좋다. ThreadPool .NET의 Thread 클래스를 이용하여 쓰레드를 하나씩 만들어 사용하는 것이 아니라, 이미 존재하는 쓰레드풀에서 사용가능한 작업 쓰레드를 할당 받아 사용하는 방식이다. 다수의 쓰레드를 계속 만들어 사용하는 것보다 효율적이다. 짧게 짧게 실행되는 쓰레드를 사용할 때 이미 존재하는 쓰레드풀에서 할당 받아 사용하는 게 좋다. 내가 구현해야할 쓰레드 작업이 주기적으로 한번씩 비동기로 동작하고 종료하는 메서드라 ThreadPool을 이용하는 것이 좋다고 판단하였다. C# Task 클래스는 쓰레드풀로부터 쓰레드를 가져와 비동기 작업을 실행 Task클래스 사용을 위..
새로운 셰이더를 추가할 때 발생한 에러 ('main': entrypoint not found, overlapping register semantics not yet implemented 't1') 'main': entrypoint not found https://blog.naver.com/PostView.naver?blogId=junsueg5737&logNo=220465647770&redirect=Dlog&widgetTypeCall=true&directAccess=false [Error][HLSL] X3501 'main': entrypoint not found 해결하기 가끔 셰이더를 처음하는 프로그래머에게 나타는 오류(아닌가?) 요런 질이 나쁜 오류를 해결해보자 대부분 ... blog.naver.com Properties > HLSL Compiler > General > Entrypoint Name 이 부분이 셰이더 처음 생성하면 main으로 되어있음 진입점을 추가한 셰이더 함수와 같은 것으로 변..