04 삼각형 그리기

한경식·2024년 12월 17일
  • 화면 좌표처리
    • 가로는 x축, 세로는 y축
    • 화면은 중심(0,0)을 기준으로 왼쪽/아래는 -1, 오른쪽/위 +1
  • Vertex Buffer 만들기

    • Vertex
      • 삼각형을 그리기 위해서는 총 3개의 점이 있어야 하므로 vector를 통해 Vertex를 배열로 만들어준다
      • 이때 Vertex의 안에는 위치와 색의 정보를 가질 것이다
      • 이때 DirectX에서 삼각형을 그릴때는 시계 방향으로 그리므로 정점의 위치를 반 시계에 맞게 순서를 지켜줘야 한다
    • Vertex Buffer
      • Buffer를 만들기 위해 desc를 만들어 어떻게 사용할 지와 크기를 설정해 준다
      • Subresource Data를 만들어 cpu에서 만든 데이터를 GPU에서 사용할 수 있게 주소를 넘겨준다
      • device를 통해 desc, data의 정보를 가지고 Buffer를 만들어 vetexBuffer에 저장해주면 버퍼가 만들어진다.
  • Shader

    • 사용방법
      • .cso
        • Shader 빌드 후 생기는 파일
        • 실행 시 이 파일을 가져와 실행
      • 동적사용
        • hlsl 파일을 컴파일 후 사용
      • .cso를 사용하면 오류가 생겼을 때 실행 파일이 터지며, 오류를 찾기 힘들다
      • 그래서 동적으로 사용해 Shader 코드에 오류를 찾을 수 있게 혼용해서 예제를 사용할것이다
    • Shader 코드 작성
      • 렌더링파이프라인의 VS 단계에서 정점의 정보를 가져와 연산을 할 것이다
      • VS_INPUT
        • 우리가 만든 Vertex정보를 Shader 파일에서 똑같이 만들어 줄 것인데 : POSITION 이런 식으로 변수를 만드는 것을 볼 수 있다
        • .cpp 파일에서 Shader로 정보를 넘겨줄 때 이름과 일치 시켜주면 된다
      • VS_OUTPUT
        • SV_POSITION
          • System Value로 예약된 값을 GPU 렌더링 파이프 라인에 넘겨주는 값
          • 반드시 필요하며 SV_OUTPUT 함수에 만들어 다음 파이프라인에 넘겨줄 수 있게 해준다
      • VS_OUTPUT VS(VS_INPUT input)
        • VS_INPUT 구조체로 들어온 값을 VS_OPUT 구조체 변수에 저장하여 return시켜주는 함수
        • 이 정보를 토대로 정점들을 RS 단계로 넘겨준다
      • float4 PS(VS_OUTPUT input) :SV_Target
        • SV_Target
          • Pixel Shader의 출력에 사용
          • 그릴 타겟의 색을 지정할 때 사용
            - VS 단계에서 RS로 넘겨준 데이터가 VS_OUTPUT 이므로 VS_OUTPUT에 저장된 데이트를 가져와 색상을 return해줌
    • 오류 발생
      • VS단계에서 RS로 넘겨주는 함수 main이 없다는 뜻
      • Shader 속성 페이지에 들어가 진입점 이름을 우리가 만든 함수 이름으로 바꿔주면 됨
  • CreateInputLayout
    • 정의
      • 정점 입력 레이아웃을 정의하여 GPU에 전달하는 역할
      • 이 레이아웃은 정점 버퍼의 데이터 형식을 DirectX에 알려주어 GPU가 데이터를 올바르게 해석하고 처리할 수 있다
    • D3D11_INPUT_ELEMENT_DESC
      • 정의
        • 정점 데이터의 구조와 형식을 정의하는 구조체
        • 정점 데이터의 각 속성이 어떤 형식과 레이아웃으로 구성되어있는지 설명하는 역할
      • 첫번째 파라미터는 정점 속성의 이름을 지정하는 것으로 정보를 넘겨줄 Shader 변수에 속성 이름과 맞춰줘야한다
      • 5번째 파라미터는 Vertex 구조체 내의 속성 바이트 단위 오프셋으로 position은 vector3 자료형으로 float 3개를 묶어놓은 자료형이다. 그래서 4바이트인 float 3개의 크기가 12이므로 다음 배열에 offset은 12를 넣어줘야 정보가 잘 들어간다
        • offset 크기를 잘 계산해서 넣어줘야한다
    • CreateInputLayout
      • ID3DBlob
        • 정의
          • Shader 컴파일의 결과나 데이터 Buffer를 저장하는 인터페이스
      • ID3D11InputLayout
        • 정의
          • 정점 입력 레이아웃을 정의하는 인터페이스
          • Vertex Data가 GPU로 전달될 때, GPU가 해당 데이터를 올바르게 해석할 수 있도록 정점의 각 속성에 대한 정보를 설정
      • 정점 데이터의 구조와 형식을 가져와 Shader 컴파일 된 결과등을 ID3D11InputLayout 변수에 저장해준다
  • D3DCompileFromFile
    • 정의
      • Shader 파일을 컴파일하여 바이트 코드로 변환하는 함수
      • 이 바이트 코드는 GPU가 이해할 수 있는 형태로 변환된 코드
      • Shader를 GPU로 업로드해 렌더링에 사용
    • 쉐이더 파일들을 가져와 컴파일 한 후 바이트 코드로 변환하여 처리해 주는 함수로 만들었다
  • Vertex Shader, Pixel Shader 만들기

    • 좀전에 만든 LoadShaderFromFile을 통해 Shader 코드에서 원하는 정보를 가져와 바이트 코드 형태로 만들어 ID3DBlob 변수에 저장해준다
    • CreateVertexShader
      • 최종적으로 device를 통해 바이트 코드를 가져와 VertexShader/PixelShader 에 저장해주어 범용적으로 사용 가능하게 만들어주었다
  • Init 함수

    - CreateGeometry 함수부터 CreatePS 함수를 Init 에서 실행하여 프로그램 실행 시 정점 정보들을 Shader로 만들어 준다

  • Render

    • Render 함수에서 렌더링 파이프라인을 순서대로 실행하여 그림을 그릴것이다
    • IA
      • deviceContext를 통해 IA단계에서 정점 버퍼, Input Layer를 설정하고 그릴 모양까지 설정해 준다
    • VS
      • deviceContext를 통해 VS단계에서 Vertex Shader를 설정한다
    • PS
      • deviceContext를 통해 PS단계에서 Pixel Shader를 설정한다
    • OM
      • deviceContext를 통해 렌더링 파이프 라인을 지나오면서 GPU에 넘겨준 정보를 토대로 그림을 그려준다
  • 결과 값
profile
게임 개발 지망생

0개의 댓글