DirectX::SpriteBatch에서 원형 게이지 표시(DirectX11)

이미지를 표시하는 방법을 모르는 사람은
htps : // 코 m / 하품 t / ms / 26d5f43 a d325 3439
봐, 어쩌면 이것으로 할 수 있다고 생각합니다 ...

개요



이번에 설명하는 방법은 픽셀 셰이더에서 불필요한 픽셀을 삭제하는 것입니다.



이런 식으로 각도 θ보다 작은 각도의 픽셀은 남겨두고, 크면 픽셀을 삭제하도록 합니다.
x는 각도가 θ보다 작기 때문에 남긴다, z는 θ보다 크기 때문에 삭제한다는 느낌입니다.

CPU측



sprite.h
const float PI = 3.14159f;

class Sprite {
public:
    .
    .
    .
private:
    DirectX::SpriteBatch* m_spriteBatch   //SpriteBatch
    ID3D11Buffer* m_buffer = nullptr;   //定数バッファです
    float m_degree = 360.0f;   //角度です
    ID3D11Device* m_device   //構築済みとする
    ID3D11PixelShader* m_shader   //シェーダーの読み込みについてはよくわからなかったです...
};

정수 버퍼의 작성을 합니다.

sprite.cpp
int bufferSize = sizeof(float);
    //どんなバッファを作成するのかをせてbufferDescに設定する。
    D3D11_BUFFER_DESC bufferDesc;
    {
        ZeroMemory(&bufferDesc, sizeof(bufferDesc));                //0でクリア。
        bufferDesc.Usage = D3D11_USAGE_DEFAULT;                     //バッファで想定されている、読み込みおよび書き込み方法。
        bufferDesc.ByteWidth = (((bufferSize2 - 1) / 16) + 1) * 16; //バッファは16バイトアライメントになっている必要がある。
                                                                        //アライメントって→バッファのサイズが16の倍数ということです。
        bufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;          //バッファをどのようなパイプラインにバインドするかを指定する。
                                                                        //定数バッファにバインドするので、D3D11_BIND_CONSTANT_BUFFERを指定する。
        bufferDesc.CPUAccessFlags = 0;
    }                               
    m_device->CreateBuffer(&bufferDesc, NULL, &m_buffer);


드로우할 때에 각도를 정수 버퍼로서 GPU에 보냅니다.
DirectX::SpriteBatch에서는 Begin 함수로 정수 버퍼를 GPU에 보내거나 셰이더의 설정 등을 씁니다.

sprite.cpp
Draw()
{
    //1フレームごとに角度を-1します
    m_degree -= 1.0f; 


    m_spriteBatch>Begin(
    DirectX::SpriteSortMode_BackToFront,
                        nullptr,
                        nullptr,
                        nullptr,
                        nullptr,
                        [=]
        {
            //角度をラジアン単位に変換します
            float angle = (m_degree * PI) / 180.0f;
            //角度用の定数バッファを更新します
            m_device->UpdateSubresource(
                                    m_buffer,
                                    0,
                                    nullptr,
                                    &angle,
                                    0,
                                    0);

            //角度用の定数バッファを更新します
            m_device->PSSetConstantBuffers(1, 1, &m_buffer);
            //ピクセルシェーダーを設定します
            m_device->PSSetShader(m_shader, nullptr, 0);
        }
    );
    //以下は通常と同じ
     .
     .
     .

}

셰이더



sprite.fx
//角度
float Angle : register(t1);
//カラーテクスチャ
Texture2D<float4> Texture : register(t0);
//サンプラー
sampler TextureSampler : register(s0);

//ピクセルシェーダー
//引き数はこれで固定です、多分
float4 PSMain(
    float4 color : COLOR0,
    float2 texCoord : TEXCOORD0) : SV_Target0
{
    float PI = 3.14159f;
    //こっからなんかおかしいかもしれません
    float2 Center = {0.5f,0.5f};
    float2 Up = { 0.5f,1.0f };
    float2 Vector1 = {0.0f,-1.0f};
    float2 Vector2 = texCoord - Center;
    Vector1 = normalize(Vector1);
    Vector2 = normalize(Vector2);
    float Deg = acos(dot(Vector1, Vector2));
    Deg = abs(Deg);
    //中心からピクセルの座標へのベクトルと中心から上方向へのベクトルの内積を求め
    //逆コサインをとり、設定した角度より小さければ表示、大きければピクセルを破棄する
    if (Vector2.x < Vector1.x) {
        Deg = PI + (PI - Deg);
    }
    if (Deg >= Angle) {
        //ピクセルを破棄する
        clip(-1);
    }
    float4 Color = Texture.Sample(TextureSampler, texCoord);
    return Color;
}

좋은 웹페이지 즐겨찾기