DirectX::SpriteBatch에서 원형 게이지 표시(DirectX11)
htps : // 코 m / 하품 t / ms / 26d5f43 a d325 3439
봐, 어쩌면 이것으로 할 수 있다고 생각합니다 ...
개요
이번에 설명하는 방법은 픽셀 셰이더에서 불필요한 픽셀을 삭제하는 것입니다.

이런 식으로 각도 θ보다 작은 각도의 픽셀은 남겨두고, 크면 픽셀을 삭제하도록 합니다.
x는 각도가 θ보다 작기 때문에 남긴다, z는 θ보다 크기 때문에 삭제한다는 느낌입니다.
CPU측
sprite.hconst 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.cppint 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.cppDraw()
{
//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;
}
Reference
이 문제에 관하여(DirectX::SpriteBatch에서 원형 게이지 표시(DirectX11)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/akurobit/items/ab90b88088678f706e3a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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;
}
Reference
이 문제에 관하여(DirectX::SpriteBatch에서 원형 게이지 표시(DirectX11)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/akurobit/items/ab90b88088678f706e3a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
//角度
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;
}
Reference
이 문제에 관하여(DirectX::SpriteBatch에서 원형 게이지 표시(DirectX11)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/akurobit/items/ab90b88088678f706e3a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)