제 목 S*R*T 결합 중 T에 수치가 들어가면 사다리꼴 출력되는 현상
작성자 혜헤헤헤 등록날짜 2023-09-21 23:20:52 / 조회수 : 9
강좌명 [단과] DirectX 11 2D Part 3
첨부파일
  • 글 작성에 앞서 일전의 맵 부분 질문에 대해서는 얼추 가닥을 잡았습니다, 감사합니다 :)

    ---------

    Win SDK를 이용해서 프로그래밍 중인데 Constant Buffer을 복습하던 도중 렌더링에 이상한 점이 생겨 질문 남깁니다.

    Scale과 Rotation은 제대로 작동하는것을 확인했으나 Translation만 적용하면 사각형이 첨부된 사진처럼 비틀어집니다.

    여러가지를 찾아보고 시도해봤으나 전부 실패해서 이렇게 질문을 남깁니다 ㅠ

    현재 카메라와 월드는 분리하지 않은 상태입니다.

     

    [World, View, Projection 초기화 함수]

    //world
    {
        DirectX::XMVECTOR scale = DirectX::XMVectorSet(100.0f, 100.0f, 1.0f, 0.0f);
        DirectX::XMVECTOR rotation = DirectX::XMVectorSet(0.0f, 0.0f, 0.0f, 0.0f);
        DirectX::XMVECTOR translate = DirectX::XMVectorSet(1.0f, 0.0f, 0.0f, 1.0f);

        DirectX::XMMATRIX S = DirectX::XMMatrixScalingFromVector(scale);
        DirectX::XMMATRIX R = DirectX::XMMatrixRotationRollPitchYawFromVector(rotation);
        DirectX::XMMATRIX T = DirectX::XMMatrixTranslationFromVector(translate);

        mat_data.world = S * R * T;
    }

    //view
    {
        DirectX::XMVECTOR pos = DirectX::XMVectorSet(0.0f, 0.0f, 0.0f, 1.0f); // 카메라 위치
        DirectX::XMVECTOR at = DirectX::XMVectorSet(0.0f, 0.0f, 1.0f, 1.0f); // 카메라 타겟 위치
        DirectX::XMVECTOR up = DirectX::XMVectorSet(0.0f, 1.0f, 0.0f, 1.0f); // 카메라 상단 방향

        mat_data.view = DirectX::XMMatrixLookAtLH(pos, at, up);
    }

    //projection
    {
        mat_data.projection = DirectX::XMMatrixOrthographicLH(Settings::Get().GetWidth(), Settings::Get().GetHeight(), 0, 1);
    }

     

    [Constant Buffer 함수]
        D3D11_BUFFER_DESC desc;
        ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
        desc.Usage = D3D11_USAGE_DYNAMIC;
        desc.ByteWidth = sizeof(MatrixData);
        desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
        desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;

        HRESULT hr = d3d->GetDevice()->CreateBuffer(&desc, nullptr, &constant_buffer);

        assert(SUCCEEDED(hr));

        D3D11_MAPPED_SUBRESOURCE mappedResource;
        d3d->GetDeviceContext()->Map(constant_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
        memcpy(mappedResource.pData, &mat_data, sizeof(MatrixData));
        d3d->GetDeviceContext()->Unmap(constant_buffer, 0);
     

    [Viewport 초기화]

     viewport.Width = Settings::Get().GetWidth();
     viewport.Height = Settings::Get().GetHeight();
     viewport.MinDepth = 0.0f;
     viewport.MaxDepth = 1.0f;
     viewport.TopLeftX = 0.0f;
     viewport.TopLeftY = 0.0f;
     g_pd3dDeviceContext->RSSetViewports(1, &viewport);

     

    [Shader.hlsl]

    struct VertexInput
    {
        float4 position : POSITION0; // POSITION이 Semantic, 0가 Semantic Index
        float4 color : COLOR0;
    };

    struct PixelInput
    {
        float4 position : SV_POSITION0;
        float4 color : COLOR0;
    };

    cbuffer ConstanceBuffer : register(b0)
    {
        matrix world;
        matrix view;
        matrix projection;
    }

    PixelInput VSMain(VertexInput input)
    {
        PixelInput output;
        output.position = mul(input.position, world);
        output.position = mul(output.position, view);
        output.position = mul(output.position, projection);
        
        output.color = input.color;
        
        return output;
    }

    float4 PSMain(PixelInput input) : SV_Target
    {
        return input.color;
    }

     

     

     

  • 작성자 : 게임클래스 / 등록날짜 : 2023-09-22 11:16:08
  • 안녕하세요 게임클래스 입니다.

    해당 질문에 대해 담당 교수님께 답변을 요청드린 상태 입니다.

    교수님께서 답변 주시면 바로 답변후 문자메시지를 통해 답변완료 안내 드리도록 하겠습니다.