DEFAULT

GPU가 이 리소스를 빠르게 읽기 및 쓰기 권한이 가능하다.

오직 UpdateSubresource만을 사용하여 업데이트 할 수 있다.

렌더타겟에서 사용될때 좋은 후보가 될수있다 =>무슨말?

 

 

IMMUTABLE

GPU만이 이 리소스를 빠르게 읽을 수 있다.
일단 생성되면 업데이트할 수 없습니다.
생성 호출 중에 초기 데이터를 전달해야 합니다.
변하지 않는 리소스(정적 텍스처, Vb/Ib)에 좋은 후보가 될 수 있습니다.

Vb/Ib : VertexBuffer, IndexBuffer

모든것을 IMMUTABLE로 만들려 애쓰지 마라

 

 

DYNAMIC

빠른 CPU 쓰기 액세스가 필요한 리소스에 사용
(GPU 읽기 액세스 속도가 느려짐)
CPU 읽기 액세스 없음
밑의 두가지 플래그와 Map을 사용하여만 업데이트할 수 있습니다.

  • D3D10_MAP_WRITE_DISCARE
  • D3D10_MAP_WRITE_DNO_OVERWRITE

동적 텍스처, 동적 VertexBuffer는 좋은 후보입니다.

 

 

STAGING

GPU에서 데이터를 다시 읽을 수 있는 유일한 방법입니다.
MAP을 사용해야만 업데이트할 수 있습니다.
단 밑의 플래그와는 매핑할 수 없음

  • D3D11_MAP_WRITE_DISCARD
  • D3D11_MAP_WRITE_NO_OVERWRITE

gpu가 지연되지 않도록 버퍼를 두 배로 늘릴 수 있습니다.
GPU는 이것들을 직접 사용할 수 없다.

 

 


Vertex Buffer의 경우

 

버텍스 버퍼가 프레임당 한 번 미만의 CPU에 의해 터치됨
=> D3D11_USAGE_DEFAULT로 생성하여 UpdateSubresource를 사용하여 업데이트 해라


정점 버퍼는 동적 지오메트리에 사용되며 CPU에서 프레임당 여러 번 업데이트할 필요가 있는 경우

=> D3D11_USAGE_DYNAMIC으로 생성하여 MAP을 통해 업데이트 해라

 

 


사용하면서 내 경험으로 더 알아가면서 추가로 포스팅해야겠다.

 

https://www.slideshare.net/cagetu/windows-to-reality-getting-the-most-out-of-direct3-d-10-graphics-in-your-games

 

Windows to reality getting the most out of direct3 d 10 graphics in…

Windows to Reality: Getting the Most out of Direct3D 10 Graphics in Your Games Shanon Drone Software Development Engineer XNA Developer Connection Microsoft

www.slideshare.net

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=masca140&logNo=220719096462 

 

Direct3D 11의 자원들 (1)

자원을 이야기 하자면 자원 사용의 두 측면을 모두 살펴보는 것이 타당하다. 응용 프로그램의 관점에서 중...

blog.naver.com

 

'DirectX 11 > 개념 정리' 카테고리의 다른 글

동차 표기법 (Homogeneous)  (0) 2022.02.09
Vertex Shader, Pixel Shader, Rasterizer  (0) 2022.02.07
Device & Device Context / COM객체  (0) 2022.02.06

결과물

WVP 변환이 되지 않은 로컬공간의 삼각형


코드

예제에서는 fx셰이더를 사용한다.

 

TriangleList.cpp

 


Triangle.fx

Vertex Shader나 Pixel Shader를 생성하는건 hlsl과 비슷

fx에서는 technique과 pass가 있는데

편하게 골라 사용할 수 있다.

 

'DirectX 11 > 코드 분석' 카테고리의 다른 글

Texture Sampler  (0) 2022.02.08
Texture  (0) 2022.02.08
Grid / Camera  (0) 2022.02.08
Index Buffer / World Scale, World Translation  (0) 2022.02.08
World, View, Projection  (0) 2022.02.08

Vertex Shader

주 역할은 3D공간 상의 정점들의 위치를 화면좌표로 변환한다.

고로 정점하나당 Vertex Shader가 한번 실행된다.

 


Rasterizer

정점이 찍힌다면 이제 정점과 정점사이에 선을 그릴것이다.

그 선이 이어져서 삼각형을 만들수있다.

 

그렇다면 정점과 정점사이에는 몇개의 픽셀이 들어가있을까?

혹은 만들어진 삼각형안에 몇개의 픽셀이 어떻게 있을까?

 

이러한 정점 사이에 있는 픽셀들을 어디에 몇개나 그려야 하는지 알아내는 단계가 레스터라이저에서 이루어진다.

 


Pixel Shader

Vertex shader는 정점하나당 실행된다.

그렇다면 Pixel Shader는?

래스터라이저에서 계산된 픽셀 수 만큼 실행된다.

 

역할은 그 픽셀의 최종색상을 계산하는것

 


Shader

고로 셰이더란 화면에 존재하는 각 픽셀의 위치와 색상을 계산하는 함수이다.

 

셰이더에서 사용할 수 있는 입력 값으로는 전역변수와 정점데이터가 있다.

 

한 물체를 구성하는 모든 정점이 동일한 값을 사용한다면 전역변수가 될수있고

한 물체를 구성하는 모든 정점 : 예를들어 한 캐릭터를 그리기 위한 모든 정점

각 정점마다 다른 값을 사용하면 정점 하나하나의 데이터로 받아들여야한다.


https://kblog.popekim.com/2011/11/01-part-1.html

 

[포프의 쉐이더 입문강좌] 01. 쉐이더란 무엇이죠? Part 1

게임 프로그래머 김포프의 블로그

kblog.popekim.com

https://gasbebe.github.io/shader/

 

'DirectX 11 > 개념 정리' 카테고리의 다른 글

동차 표기법 (Homogeneous)  (0) 2022.02.09
D3D11_USAGE / Resource Usage Type  (0) 2022.02.08
Device & Device Context / COM객체  (0) 2022.02.06

Device & Device Context

 

이 두 인터페이스는 Dx의 주된 인터페이스로 물리적인 그래픽 장치 하드웨어에 대한 제어기다.

ID3D11Device, ID3D11DeviceContext 의 맨 앞이 모두 ' I ' 이므로 인터페이스인걸 확인 알 수 있다.

ID3D11Device / 모두 순수가상함수로 이루어져있다.

 

가장 주요한 인터페이스기에 Direct3D 초기화의 시작은 Device와 Device Context의 생성으로 시작 된다.

 

생성의 함수는

D3D11CreateDevice ( 혹은 D3D11CreateDeviceAndSwapChain사용 )

 

HRESULT D3D11CreateDevice(

     IDXGIAdapter *pAdapter,

     D3D_DRIVER_TYPE DriverType,

     HMODULE Software,

     UINT Flags,

     const D3D_FEATURE_LEVEL *pFeatureLevels,

     UINT FeatureLevels,

     UINT SDKVersion,

     ID3D11Device **ppDevice,

     D3D_FEATURE_LEVEL *pFeatureLevel,

     ID3D11DeviceContext **ppImmediateContext

);

 

주요 매개변수만 보자면

pAdapter : 디스플레이 어댑터를 지정한다

디스플레이 어댑터 : 그래픽 카드

ID3D11Device **ppDevice : 생성된 Device를 돌려줌

ID3D11DeviceContext **ppImmediateContext : 생성된 DeviceContext를 돌려줌

 

이러한 매개변수를 받는다는게

이 함수에서 그래픽 카드를 연결해준다는걸 추리해볼수있다.

 

 

ID3D11Device의 함수를 보면 거의 다 함수 앞에 Create가 붙어있었다.

셰이더를 만들고(Create)

텍스처의 배열을 만들고(Create)

버퍼를 만들고(Craete)

이런걸로 봤을때 Device의 역할은 그래픽을 그리는 자원들을 생성하고 준비하게끔 도와주는 역할이라 생각한다.

 

ID3D11DeviceContext의 함수는 대부분 Set과 Get이 많이 들어가 보였다.

버퍼를 세팅하고, 가져오고(Set, Get)

셰이더를 세팅하고(Set)

각 파이프라인 단계를 세팅하고(Set)

이런걸로 봤을때 Device로 생성된 자원들을 디스플레이 어댑터에 세팅하고 세팅되었던걸 가져오고 이러한 역할같다.

 

+DeviceContext는 주 쓰레드와 그외의 쓰레드일때 다른 문맥을 생성해야한다고 한다.

주 쓰레드면 위의 방식으로 생성, 즉시문맥이 생성되고( immediate context )

멀티 쓰레딩 환경에서 그 외의 쓰레드(일꾼쓰레드)이면 ID3D11Device::CreateDeferredContext으로

지연문맥을 생성한다 ( deferred context )

 

그래서 일꾼쓰레드가 ID3D11CommandList에 그리기 명령을 기록한다.

주쓰레드에서 그 기록들을 실행한다고 한다.

 


COM 객체 (Component Object Model)

 

COM객체또한 액터가 아닌 언어의 독립성과 호환성을 가능하게 하는 기술이라고 한다.

언어의 독립성 : 극단적 예시로 A라는 COM객체를 c++ 에서도 사용하고 java에서도 사용하고 python에서도 사용한다

 

갑자기 왜 나왔냐면 Device & Device Context가 COM객체이기 때문이다.

이유는 모든 COM객체는 IUnknown이라는 COM 인터페이스 기능을 상속받기 때문이다.

IUKnown을 상속받는 이유는 모든 COM객체가 같은 고유한 방식으로 메모리를 관리하기때문

Device Context는 ID3D11DeviceChild를 상속받는다.

일단 언리얼에서 컴포넌트를 다뤘다면 대강 그림이 그려진다.

컴포넌트의 이유가 어느 액터이던간에 땟다 붙엿다 하려고 컴포넌트를 생성했었는데

 

이러한 COM객체는 인터페이스형태로 우리에게 보여지며

New처럼 객체를 생성하지 못하고 특별한 함수나 다른 COM인터페이스의 메서드를 이용하여 얻어야한다.

 


맨위 사진의 맨 첫줄 MIDL_INTERFACE("db6f6ddb-ac77-4e88-8253-819df9bbf140") 는

uuid라는걸 뜻하는데 개념이 아직 너무 막연하고 아직 필요성은 없는거 같아 나중에 필요해질때 다시 찾아보자

 

'DirectX 11 > 개념 정리' 카테고리의 다른 글

동차 표기법 (Homogeneous)  (0) 2022.02.09
D3D11_USAGE / Resource Usage Type  (0) 2022.02.08
Vertex Shader, Pixel Shader, Rasterizer  (0) 2022.02.07

말그대로 사용자의 지정 축을 만들 수 있는 기능이다.

 

  • C++

FRotator UKismetMathLibrary::MakeRotationFromAxes(FVector Forward, FVector Right, FVector Up)

 

각 매개변수 Forward, Right, Up 벡터를 넣으면 하나의 축을 만들어 FRotator형으로 반환해준다.

 

  • Blueprint


나의 사용처

 

현재 벽에서 뛰어다닐 수 있는 기능을 구현중인데

WASD로 벽에서 자연스럽게 움직이려면

trace로 충돌한 벽의 hitResult에 Normal값을 Up vector (벽에 수직방향)

카메라가 바라보는 방향을 벽에 붙여 Forward vector으로 하나의 축을 만들어야했다.

 

그래서 위의 함수를 사용했다.

 

Forward와 Up은 위의 설명대로 넣었고 Right 같은경우에는 외적을 이용하면 바로 나온다.

 

더 응용하는 법은 밑 처럼 FVector UKismetMathLibrary::Get ??? Vector( FRotator) 을 이용하면 된다.

 

밑은 위의 함수로 만든 하나의 축을 arrow로 디버깅했다.

Yellow(forward ) / red(right) / up(blue)

 

데이터 통신의 개요

 

데이터 통신 = 각종 통신기기 사이에서 2진수로 된 정보를 송,수신 하는 것을 말한다.

데이터 통신 = 데이터 전송 기술(송신) + 데이터 처리 기술(수신)

 

정보통신 = 데이터 통신을 포함하며 거기에 정보의 변환, 저장 과정이 추가된 형태의 통신이다.

 

데이터 통신과 정보 통신의 차이는

 

일단 DB를 배울때 자료(Data)와 정보(Information)의 차이가 나오는데

정보가 자료를 가공하여 처리한 결과물을 뜻한다.

 

고로 데이터 통신은 단순 송 수신 통신을 뜻하고

정보 통신은 데이터를 처리하는 과정이 추가되었다고 볼수있겠다.


통신의 3요소

 

  • 정보원(정보를 처리하여 전송하는 장치)
  • 전송매체(통신회선)
  • 수신원(정보를 수신하는 장치) 

뭐 당연한말이다.

 


전송매체(통신회선)

 

  • 꼬임선(이중 나선, 랜선)
  • 동축 케이블
  • 광섬유 케이블
  • 위성마이크로파

와 집에서 동축케이블쓰는데 느리다..

암튼 건 이러한게 있구나 넘어가야겠다.

 


통신 제어장치(Communication Control Unit)

 

통신 제어장치는 데이터 전송 회선과 주컴퓨터를 전기적으로 연결한다.

컴퓨터를 대신해 데이터 전송에 관한 전반적인 제어기능을 수행한다.

전반적인 제어기능 : 데이터의 실제 송신과 수신, 전송 제어 문자와 부호의 검출, 전송 과정에서의 오류 검사, 컴퓨터의 처리 능력에 비하여 과도하게 정보가 전달되는 것을 예방하는 흐름 제어, 회선 상태의 감시, 패킷 단위로 이루어지는 데이터 전송에서 패킷의 순서를 유지하고 각각의 패킷이 올바른 순서에 따라 전달되도록 보장하는 작업 등이 통신 제어에 포함된다.

 

제어기능에는 크게 3가지가 있다.

 

전송제어

  • 다중 접속 제어 : 하나의 통신회선을 여러개의 장치가 공유할 때 전송 회선을 선택
  • 교환 접속 제어 : 데이터 송/수신을 위한 회선의 설정과 절단

교환 : 영어로 Switching, 네트워크에서 적절한 경로를 선택하는 과정을 의미한다.

  • 통신 방식 제어 : 단방향, 반이중, 전이중의 통신 방식 제어

단방향 : 한쪽 방향으로만 전송 가능

반이중 : 양방향 전송이 가능하나 동시에는 불가능

전이중 : 동시에 양방향 전송 가능

  • 우회 중계 회선 설정 : 데이터 송/수신시 통신 회선에 오류가 발생한 경우 다른 우회 경로나 중계 경로로 정보를 전송한다.

동기 및 오류 제어

  • 동기 제어 : 컴퓨터의 처리 속도와 통신 회선 상의 전송 속도 차이 제어
  • 오류제어 : 통신회선과 단말기에서 발생하는 오류 제어
  • 흐름제어 : 수신 가능한 데이터의 양을 송신측에 알려 원활한 정보 전송 가능
  • 응답제어 : 수신 정보 확인 제어

기타

  • 제어 정보 식별 : 일반 데이터와 제어 정보 구분
  • 기밀 보호 : 암호화 제어

 


전처리기 (Front End Processor)

 

중앙 컴퓨터와 단말기사이에서 전송 처리를 먼저 수행함으로 컴퓨터의 부하를 줄여줍니다.

전송처리 : 메세지의 조립과 분해, 전송 메세지 검사

단말기 : 중앙 컴퓨터와 통신망으로 연결되어 자료를 입력하거나 출력하는 장치

ex) 컴퓨터, 핸드폰

 


주파수(Frequency) / 대역폭(Bandwidth)

 

 

주파수 : 단위시간(보통1초) 내에 신호 파형이 반복되는 횟수, Hz로 표현한다.

대역폭 : 주파스의 변화 범위, 상한 주파수와 하한 주파수의 차이

 


아날로그 / 디지털 전송

 

아날로그 전송

  • 아날로그 형태의 신호로 전달 됨
  • 신호 감쇠 현상이 심하여 장거리에 오류율 높음

 

디지털 전송

  • 디지털 형태의 신호로 전달 됨
  • 장거리 전송시 중계기(Repeater)에 의해 원래의 신호 내용을 다시 복원한 다음 전송하여 오류율 낮음
  • 대역폭을 효율적으로 이용해 더 많은 용량을 전송할 수 있음
  • 암호화가 쉬움

 


https://many258.github.io/study/data-communication-base/

 

[데이터통신] 데이터 통신 시스템의 기본

통신의 3요소 정보원(Source) 수신원(Destination) 전송매체(Transmission Media)

many258.github.io

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=deepb1ue&logNo=221182409375 

 

통신 제어장치

1. 통신 제어장치의 기능통신 제어장치(CCU, Communication Control Unit)는 데이터 전송 회선과 주...

blog.naver.com

소프트웨어

 

오늘날의 소프트웨어는

컴퓨터를 작동하고 특정 작업을 실행하는 데 사용되는 명령, 데이터 또는 프로그램의 집합 이라한다

저 특정작업에 따라 소프트웨어도 크게 두가지로 나뉜다.

 

1.응용 프로그램 소프트웨어(application software)

운영체제에서 실행되는 모든 소프트웨어

ex) 모든 게임, 파워포인트, 웹브라우저

 

2.시스템 소프트웨어 (Computer system software)

시스템 리소스를 관리 및 활용하기 위해 사용하는 프로그램

시스템 리소스 : 하드웨어

실행되는 응용 프로그램을 위한 플랫폼을 제공한다.

어셈블리 언어와 같은 저수준 언어로 작성된다.

ex) 운영체제, 어셈블러, 디버거, 컴퓨터 언어 번역기, 시스템 유틸리티

 


시스템 소프트웨어

 

시스템 소프트웨어도 기능별로 크게 두가지로 나뉜다.

 

1. 제어 프로그램(Control Program)

 

제어 프로그램이란 말 자체가 운영체제를 뜻하는 말 같다.

말그래도 제어를 담당하는 프로그램.

제어 : 시스템 전체의 작동 상태 감시, 작업의 순서 지정(스케줄링), 작업에 사용 되는 데이터 관리

감시 프로그램 각종 프로그램의 실행과
시스템 전체의 작동 상태를 감시한다.
작업 제어 프로그램 어떤 업무를 처리하고 다른 업무로의 이행을 자동으로 수행하기 위한 준비 및 그 처리에 대한 완료를 담당한다.
자료 관리 프로그램 주기억장치와 보조기억장치 사이의 데이터 전송과
보조기억장치 자료 갱신 및 유지 보수 기능을 수행한다.

 

2. 처리 프로그램

 

제어 프로그램의 지시를 받아 사용자가 요구한 문제를 해결하기 위한 프로그램

언어번역 프로그램 원시 프로그램을 기계어 형태의 목적 프로그램으로 번역함
ex) 어셈블러, 컴파일러, 인터프리터
서비스 프로그램 컴퓨터를 효율적으로 사용할 수 있는
사용 빈도가 높은 프로그램
문제 프로그램 특정 업무 및 해결을 위해 사용자가 작성한 프로그램

 


운영체제(Operating System)

 

밑의 두가지가 정의이자 목적이다.

 

1. Performance improvement

컴퓨터 하드웨어를 잘 관리하여 성능을 높인다.

- 운영체제가 없다면 사용자가 하드웨어를 모두 컨트롤해야함

 

2. Convenience to use

사용자에게 편의성을 제공하는것

- 운영체제가 없다면 이렇게 편하게 컴퓨터를 다룰수가 없다.

옛날에는 이렇게 다루기 쉽지가 않아서 컴퓨터를 전문적으로 다루는 직업까지 있었는데

그 직업의 이름이 Operator 였다.

 


기능 

 

1. 프로세스 관리(프로세스 생성과 제거, 중지 및 재수행)
2. 프로세서, 기억장치, 입출력장치, 파일 등의 자원 관리
3. 자원의 스케줄링
4. 사용자에게 편리한 인터페이스 제공
5. 시스템의 각종 하드웨어와 네트워크 관리
6. 시스템의 오류 검사 및 복구, 데이터 관리, 데이터 및 자원 공유
7. 자원 보호 기능 제공
9. 가상 계산기 능력 제공

가상계산기 : 한 대의 컴퓨터에 여러 운영 체제를 가동하여, 마치 여러 대의 컴퓨터를 사용하는 것과 같은 환경을 제공하는 기술

 

 

이 모든 기능들의 목적이 위에서 언급한 성능을 높이고 편의성을 제공 이라 할 수 있다. 

 


https://softwaretestingreference.tistory.com/143

 

소프트웨어 시스템의 범위와 종류는 무엇인가요?

목차 질문 ISTQB에는 "소프트웨어 시스템을 비즈니스 애플리케이션(예, 은행업무)에서 소비자 제품(예, 자동차)까지 생활의 많은 부분에서 사용되고 있으며..."라고 되어 있는데, 소프트웨어 시스

softwaretestingreference.tistory.com

추가로 보면 정말 좋은데 정말 명강의다

https://www.youtube.com/watch?v=mcS4n34wBcY 

 

스키마(Schema)

 

데이터베이스의 구조와 제약조건에 관한 전반적인 명세를 기술하는 것

명세 : 자세히

기술 : 대상의 과정의 내용과 특징을 있는 그대로 서술

 

영문사이트

https://www.educative.io/blog/what-are-database-schemas-examples#what

데이터베이스에 데이터를 저장하는 것을 타나내는 추상적인 디자인

 

=>한마디로 데이터베이스의 디자인을 어떻게 할것인가? (설계도 느낌)

디자인이라 하니까 이해하기 편해졌다.


스키마의 종류

 

추상적인 디자인이라 하였는데 시점에 따라 3가지로 디자인이 나뉜다.

 

1.개념스키마(Conceptual Schema)= 데이터베이스 관리자의 시점

 

데이터베이스 관리자의 시점이라는건 부분부분적인 데이터가 아닌

전체 데이터베이스 를 목적으로하는 시점이며 (정말 개발하는데 있어서 저장되는 모든 데이터)

데이터베이스 : 데이터의 모음

개체 간의 관계와 제약조건을 디자인한다. (접근권한, 보안 및 무결성 규칙)

개체 : 실제로 저장된 값(인스턴스)

 

 

2.외부스키마(External Schema) = 서브 스키마 = 사용자 뷰

 

개념스키마가 전체적인 데이터를 의미한다.

그럼 사용자는 그 전체적인 데이터를 다 알아야할까?

사용자는 필요한 데이터만 접근하면 된다.

즉, 사용자에게 필요한 데이터를 목적으로하는 구성을 디자인한다.

이게 좀 이해하기 애매했었는데 내 생각에는 DB가 응용프로그램 하나에만 쓰이는게 아니라 여러 프로그램에 쓰이기 때문에

각 프로그램마다 필요한 데이터구성이 있을텐데 이 하나하나의 디자인을 외부스키마라고 하는거 같다.

 

3.내부스키마(Internal Schema) = 저장 스키마

 

저장장치의 시점으로 보는 디자인이다.

말 그대로 전체 데이터베이스가 저장 장치에 실제로 저장되는 방법을 디자인

(레코드의 구조, 필드 크기, 표현방법...)

 

이 그림이 이해하기 제일 쉬웠다.


데이터베이스 언어(Database Language)

 

DBMS를 통해 사용 가능하며 기능과 목적에 의해 3가지로 나뉜다. 아잇싯팔 또 세가지네

 

1. 데이터 정의 언어(DDL : Data Definition Language)

 

DB를 구축하거나 수정할 목적으로 사용하는 언어

수정할 목적 : DB구조, 데이터 형식, 접근 방식, 외부 스키마 정의, 데이터의 물리적 순서 등 

데이터베이스 관리자가 사용한다.

종류 역할
CREATE DB, 테이블등을 생성
ALTER 테이블을 수정
DROP DB, 테이블을 삭제
TRUNCATE 테이블 초기화

 

2. 데이터 조작 언어(DML : Data Manipulation Language)

 

사용자로 하여금 데이터를 처리할 수 있게 하는 언어,

사용자와 DBMS간의 인터페이스를 제공한다.

사용자가 사용한다는걸 옆집 개도 알수있다.

종류 역할
SELECT 데이터를 조회
INSERT 데이터를 삽입
UPDATE 데이터를 수정
DELETE 데이터를 삭제

 

3.데이터 제어 언어(DCL : Data Control Language)

 

데이터를 보호하고 데이터를 관리하는 목적으로 사용

데이터를 관리 : 보안, 무결성, 데이터 회복....

종류 역할
GRANT 특정 DB사용자에게 특정 작업에 대한 수행권 부여
REVOKE 특정 DB사용자에게 특정 작업에 대한 수행권 박탈
COMMIT 데이터 처리의 작업 결과를 저장 반영,
하나의 복구 기점이 된다.
ROLLBACK 마지막 commit시점의 상태로 복원

 

+ Recent posts