DirectX11의 툰 셰이더
툰 셰이더란?
툰 셰이더는 이렇게 음영이 분명합니다. 애니메이션 톤의 게임 등에서 사용되고 있습니다.
ToonMap 클래스
툰 셰이더는 툰 셰이더에 대한 텍스처를 제공합니다.
확산 반사광 등은 계산에 의해 색을 결정합니다만, 툰 셰이더는 이 텍스처로부터 색을 결정합니다.
조명을 계산한 후 UV 좌표의 X 성분으로 값을 이 이미지에서 조명 값을 가져옵니다.
ToonMap.hID3D11Device* g_d3dDevice; //構築済みとする
ID3D11DeviceContext* g_d3dDeviceContext //構築済みとする
public:
ToonMap() {}
~ToonMap() {}
//初期化
void Init();
//テクスチャをピクセルシェーダーに設定する、モデルをドローする時に呼んでください
void SetShaderResourceView();
private:
ID3D11ShaderResourceView* m_srv = nullptr;
ToonMap.cppvoid ToonMap::Init()
{
//テクスチャを読み込みます
DirectX::CreateDDSTextureFromFile(
g_d3dDevice, // D3Dデバイス
L"Assets/shader/toonmap.dds", //テクスチャのファイルパス
nullptr, //nullptrでいい
&m_srv //シェーダーリソースビュー
);
}
void ToonMap::SetShaderResourceView()
{
//ピクセルシェーダーにテクスチャを設定します。
ID3D11ShaderResourceView* srvArray[]{
m_SRV
};
d3dDeviceContext->PSSetShaderResources(4, 1, srvArray);
}
셰이더
model.fxTexture2D<float4> toonMap : register(t4); //toonシェーダー用のテクスチャー
//以下の実装と頂点シェーダーの実装は省きます
Texture2D<float4> albedoTexture : register(t0); //モデルのテクスチャー
sampler Sampler : register(s0); //サンプラー
//ディレクションライト
cbuffer LightCb : register(b1) {
float3 dligDirection;
};
///ピクセルシェーダーの入力
struct PSInput{
float3 Normal : NORMAL;
float2 TexCoord : TEXCOORD0;
};
//ピクセルシェーダー
float4 PSMain( PSInput In ) : SV_Target0
{
//モデルのテクスチャから色をフェッチする
float4 color = albedoTexture.Sample(Sampler, In.TexCoord);
//ハーフランバート拡散照明によるライティング計算
float p = dot(In.Normal * -1.0f, dligDirection.xyz);
p = p * 0.5f + 0.5f;
p = p * p;
//計算結果よりトゥーンシェーダー用のテクスチャから色をフェッチする
float4 Col = toonMap.Sample(Sampler,float2(p,0.0f));
//求まった色を乗算する
return albedoColor *= Col.xyz;
}
이 사이트를 참고로했습니다.
htp://진베리 ckp로j. 웨 b. FC2. 작은 m/pg35. html
Reference
이 문제에 관하여(DirectX11의 툰 셰이더), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/akurobit/items/a016ef4a022eed15c268
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
툰 셰이더는 툰 셰이더에 대한 텍스처를 제공합니다.
확산 반사광 등은 계산에 의해 색을 결정합니다만, 툰 셰이더는 이 텍스처로부터 색을 결정합니다.
조명을 계산한 후 UV 좌표의 X 성분으로 값을 이 이미지에서 조명 값을 가져옵니다.
ToonMap.h
ID3D11Device* g_d3dDevice; //構築済みとする
ID3D11DeviceContext* g_d3dDeviceContext //構築済みとする
public:
ToonMap() {}
~ToonMap() {}
//初期化
void Init();
//テクスチャをピクセルシェーダーに設定する、モデルをドローする時に呼んでください
void SetShaderResourceView();
private:
ID3D11ShaderResourceView* m_srv = nullptr;
ToonMap.cpp
void ToonMap::Init()
{
//テクスチャを読み込みます
DirectX::CreateDDSTextureFromFile(
g_d3dDevice, // D3Dデバイス
L"Assets/shader/toonmap.dds", //テクスチャのファイルパス
nullptr, //nullptrでいい
&m_srv //シェーダーリソースビュー
);
}
void ToonMap::SetShaderResourceView()
{
//ピクセルシェーダーにテクスチャを設定します。
ID3D11ShaderResourceView* srvArray[]{
m_SRV
};
d3dDeviceContext->PSSetShaderResources(4, 1, srvArray);
}
셰이더
model.fxTexture2D<float4> toonMap : register(t4); //toonシェーダー用のテクスチャー
//以下の実装と頂点シェーダーの実装は省きます
Texture2D<float4> albedoTexture : register(t0); //モデルのテクスチャー
sampler Sampler : register(s0); //サンプラー
//ディレクションライト
cbuffer LightCb : register(b1) {
float3 dligDirection;
};
///ピクセルシェーダーの入力
struct PSInput{
float3 Normal : NORMAL;
float2 TexCoord : TEXCOORD0;
};
//ピクセルシェーダー
float4 PSMain( PSInput In ) : SV_Target0
{
//モデルのテクスチャから色をフェッチする
float4 color = albedoTexture.Sample(Sampler, In.TexCoord);
//ハーフランバート拡散照明によるライティング計算
float p = dot(In.Normal * -1.0f, dligDirection.xyz);
p = p * 0.5f + 0.5f;
p = p * p;
//計算結果よりトゥーンシェーダー用のテクスチャから色をフェッチする
float4 Col = toonMap.Sample(Sampler,float2(p,0.0f));
//求まった色を乗算する
return albedoColor *= Col.xyz;
}
이 사이트를 참고로했습니다.
htp://진베리 ckp로j. 웨 b. FC2. 작은 m/pg35. html
Reference
이 문제에 관하여(DirectX11의 툰 셰이더), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/akurobit/items/a016ef4a022eed15c268
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Texture2D<float4> toonMap : register(t4); //toonシェーダー用のテクスチャー
//以下の実装と頂点シェーダーの実装は省きます
Texture2D<float4> albedoTexture : register(t0); //モデルのテクスチャー
sampler Sampler : register(s0); //サンプラー
//ディレクションライト
cbuffer LightCb : register(b1) {
float3 dligDirection;
};
///ピクセルシェーダーの入力
struct PSInput{
float3 Normal : NORMAL;
float2 TexCoord : TEXCOORD0;
};
//ピクセルシェーダー
float4 PSMain( PSInput In ) : SV_Target0
{
//モデルのテクスチャから色をフェッチする
float4 color = albedoTexture.Sample(Sampler, In.TexCoord);
//ハーフランバート拡散照明によるライティング計算
float p = dot(In.Normal * -1.0f, dligDirection.xyz);
p = p * 0.5f + 0.5f;
p = p * p;
//計算結果よりトゥーンシェーダー用のテクスチャから色をフェッチする
float4 Col = toonMap.Sample(Sampler,float2(p,0.0f));
//求まった色を乗算する
return albedoColor *= Col.xyz;
}
Reference
이 문제에 관하여(DirectX11의 툰 셰이더), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/akurobit/items/a016ef4a022eed15c268텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)