목록전체 보기 (124)
서의 공간
[문제]: 5430번: AC (acmicpc.net) 이 문제의 핵심은 D 앞에 있는 R의 개수가 짝수인지 홀수인지 아는 것이다. D 앞에 R이 짝수개이면 짝수개의 R에 대해 뒤집는 연산은 의미가 없다. 따라서 D 연산을 할 때 앞에 원소를 삭제하면 된다. 만약 R이 홀수개라면 뒤집는 연산을 딱 한번만 한 것과 같으므로 한 번만 뒤집는다, 그러나 실제로는 배열을 뒤집지 않고 마지막 원소를 삭제하는 방법으로 원소를 삭제하는 위치만 바꾸어서 구현했다. 또한 실제로는 D 앞에 R이 짝수개인지 홀수개인지 카운트 하지 않고 짝수개이면 popWhere = false로, 홀수개이면 popWhere = true로 두어 D 연산이 삭제할 위치를 결정했다. 마지막에는 R의 총 개수가 짝수개인지 홀수개인지 확인해서 최종 배..
[문제]: 2217번: 로프 (acmicpc.net) #include #include using namespace std; int W[100001]; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int N; cin >> N; for (int i = 0; i > W[i]; sort(W, W + N); int ret = 0; for (int i = 1; i
이번 주제는 DirectX 11에서 HLSL을 사용해 3D 모델을 렌더링 하는 방법을 알아본다. 이전 튜토리얼 디퓨즈 라이팅 코드를 베이스로 하여 진행한다. 사실 이미 이전 튜토리얼에서 3D 모델을 렌더링 했었다. 다만 그 모델들이 그저 하나의 삼각형이거나 사각형이었기 때문에 우리가 원했던 입체적인 느낌의 모델은 아니었다. 앞서 기본 도형을 다루었기 때문에 이제는 좀 더 복잡한 모델을 렌더링 해볼 것이다. 가장 먼저 큐브를 렌더링 해보고 점차 복잡한 모델로 넘어가겠다. 3D 모델을 만들 수 있는 여러 가지 도구가 있다. 그중에 Maya와 3D Studio Max는 가장 많이 사용되는 3D 모델링 프로그램들이다. Blender는 오픈소스 3D 모델링 프로그램으로서 무료로 사용할 수 있다. 이 각각의 프로그..
이번 튜토리얼에서는 디퓨즈 라이팅(분산광 조명, diffuse lighting)과 DirectX 11을 사용해서 3D 객체를 비추는 방법을 다룬다. 이전 튜토리얼의 코드에서 시작하여 수정한다. 우리가 구현할 디퓨즈 라이팅 유형을 디렉셔널 라이팅(지향광 조명, directional lighting)이라고 한다. 디렉셔널 라이팅은 태양이 지구를 비추는 방식과 유사하다. 먼 거리에 있는 광원이 빛을 보내는 방향에 따라 모든 물체가 받는 빛의 양을 조절할 수 있으며, 광원의 거리가 아주 멀리 있으므로 모든 입사 광선이 서로 평행하다고 간주한다. 또한 앰비언트 라이팅(주변광 조명, ambient lighting)과는 달리 직접 닿지 않는 표면은 비추지 않는다. 앰비언트 라이팅은 곧 다루게 될 예정이다. 디렉셔널 ..
이 튜토리얼에서는 DirectX 11에서 텍스처링을 사용하는 방법을 설명한다. 텍스처링을 사용하면 사진과 기타 이미지를 다각형면에 적용하여 씬에 사실감을 더할 수 있다. 해당 튜토리얼에서는 다음 이미지를 사용한다. 필요한 경우 Convertio 웹사이트에서 이미지 파일의 형식을 변환하여 사용한다. 다음은 위 이미지를 이전 튜토리얼에서 그렸던 삼각형에 적용한 결과이다. 우리가 사용할 텍스처의 형식은 .tga 파일이다. 이 형식의 파일은 빨강, 초록, 파랑 및 알파 채널을 지원하는 일반적인 그래픽 형식이다. 일반적으로 모든 이미지 편집 소프트웨어를 사용하여 targa 파일을 만들고 편집할 수 있다. 코드를 시작하기 전에 텍스처 매핑이 어떻게 작동하는지 이해해야 한다. .tga 이미지의 픽셀을 다각형에 매핑하..
이번 튜토리얼에서는 DirectX 11에서 정점 및 픽셀 셰이더를 작성하는 방법에 대해 알아볼 것이다. 또한 DirectX 11에서 정점 및 인덱스 버퍼를 사용하는 방법을 소개한다. 이는 3D 그래픽을 렌더링 하기 위해 이해하고 활용해야 하는 가장 기본적인 개념이다. Vertex Buffers 첫 번째 개념은 정점 버퍼이다. 이 개념을 설명하기 위해 다음 구의 3D 모델을 예로 들어 살펴본다. 우리가 화면에서 바라보는 구의 이미지는 실제로 다음과 같이 수백 개의 삼각형으로 구성된다. 구 모델의 각 삼각형은 3개의 점으로 이루어 있고 이 점을 정점(꼭짓점)이라고 한다. 이러한 구 모델을 렌더링 하려면 구를 형성하는 모든 정점을 정점 버퍼라고 하는 특수한 데이터 배열에 넣어야 한다. 구 모델의 모든 점을 정..
이번 튜토리얼은 Direct3D를 초기화하고 종료하는 방법과 윈도우에 렌더링 하는 방법을 설명한다. 프레임워크 모든 Direct3D 시스템 기능을 처리 할 다른 클래스를 프레임워크에 추가한다. 이 클래스는 D3DClass라고 할 것이다. 다음은 업데이트된 프레임워크 다이어그램이다. 다이어그램을 살펴보면 D3DClass는 GraphicsClass 내부에 있다. 이제 GraphicsClass의 변경 사항을 살펴본다. GraphicsClass.h 첫 번째 변경 사항은 Windows.h 헤더 파일을 인클루드 하는 대신에 D3DClass.h를 인클루드 했다. 두 번째 변경 사항은 D3DClass 객체의 포인터를 GraphicsClass의 멤버 변수로 추가했다. #ifndef _GRAPHICSCLASS_H_ #de..
DirectX 11 프로그래밍을 시작하기 전에 간단한 코드 프레임워크를 구축할 것이다. 이 프레임워크는 기본 Windows 기능을 관리하고 DirectX 11 학습을 위해 체계적이고 가독성 좋은 코드로 쉽게 확장할 수 있는 방법을 제공한다. 이 튜토리얼의 목적은 DirectX 11의 다양한 기능을 시도하는 것이므로 프레임 워크를 가능한 가볍게 유지할 것이다. 결코 종합적인 풀 렌더링 엔진을 만드는 것이 아님을 알린다. DirectX 11을 확실히 이해했다면 어떻게 최신 그래픽 렌더링 엔진을 만들지 연구할 수 있게 될 것이다. 프레임워크 프레임 작업은 4개의 항목으로 시작한다. 1. 응용프로그램의 진입점(entry point)을 처리하는 WinMain 함수. 2. WinMain 함수 내에서 호출될 전체 응..
Visual Studio 2017 버전을 사용했다. 다음은 이 튜토리얼을 진행하기 위한 프로젝트의 설정이다. 특별히 어렵게 설정할 부분은 없으며 자신만의 다양한 설정도 문제없을 것이다. Visual Studio 2017을 열어 새 프로젝트 -> 빈 프로젝트를 통해 프로젝트를 만든다. 그 다음 프로젝트 설정에서 설정할 부분이다. 1. 프로젝트 설정 -> 링커 -> 시스템 -> 하위 시스템 -> 창(/SUBSYSTEM:WINDOWS)으로 설정한다. 2. 프로젝트 설정 -> 일반 -> 문자 집합 -> 유니코드 문자 집합 사용 마지막으로 프로젝트를 Debug, x64모드로 설정한다. 32비트 애플리케이션을 원한다면 x86을 선택하면 된다. 이로써 모든 준비는 끝났다. 다음 장에서 본격적으로 튜토리얼을 시작한다.
재귀호출을 이용하여 \(n\)까지의 합을 계산하는 것보다 더 빠른 합 함수를 알아본다. n까지의 합을 구하는 함수 \(fastSum()\)은 다음과 같이 표현할 수 있다. \begin{align} fastSum(n)&=1+2+\cdots+n\\&=\left(1+2+\cdots+\frac{n}{2}\right)+\left(\left(\frac{n}{2}+1\right)+\cdots+n\right)\\\end{align} 합을 두 부분으로 분리하면, 첫 번째 부분은 \(fastSum\left(\frac{n}{2}\right)\)으로 나타낼 수 있지만, 두 번째 부분은 그럴 수 없다. 다음은 두 번째 부분 식을 어떻게 정리하는지 보여준다. \begin{align} \left(\frac{n}{2}+1\right..