DirectX에서 디퍼드 렌더링
1패스째로 칼라나 법선등의 정보를 출력해, 2패스째로 그러한 정보를 사용해 렌더링해 갑니다.
색상이나 법선과 같은 정보를 G-Buffer라고 합니다.
이번에는 디퍼드 렌더링에서 법선을 사용한 디렉션 라이트의 라이팅을 구현하고 싶습니다.
G-버퍼
칼라
법선
⇩
G-Buffer 만들기
1패스째에서는 컬러나 법선이라고 말한 라이팅에 필요한 정보를 출력해 갑니다.
main.cpp//以下構築済みとする
ID3D11DeviceContext* m_pd3dDeviceContext; //D3D11デバイスコンテキスト
ID3D11RenderTargetView* m_colorMap; //カラーマップ
ID3D11RenderTargetView* m_normalMap; //法線マップ
ID3D11ShaderResourceView* m_ColorSRV; //カラーマップのシェーダーリソースビュー
ID3D11ShaderResourceView* m_NormalSRV; //法線マップのシェーダーリソースビュー
ID3D11DepthStencilView* m_depthStencilView; //デプスステンシルビュー
//カラーマップと法線マップをレンダリングターゲットに設定する
ID3D11RenderTargetView* rts[] = {
m_colorMap,
m_normalMap
};
m_pd3dDeviceContext->OMSetRenderTargets(2,rts,m_depthStencilView);
//この後にモデルをドローしていく
픽셀 쉐이더로 컬러나 법선의 정보를 출력하고 있습니다.
model.fxTexture2D<float4> albedoTexture : register(t0); //アルベドテクスチャ
sampler Sampler : register(s0); //サンプラー
ピクセルシェーダーの入力
struct PSInput{
float4 Position : SV_POSITION;
float3 Normal : NORMAL;
float2 TexCoord : TEXCOORD0;
};
//ピクセルシェーダーの出力構造体
struct PSOutPut {
float4 Color : SV_Target0;
float4 Normal : SV_Target1;
};
//モデル用のピクセルシェーダー
PSOutPut PSMain( PSInput In ) : SV_Target0
{
PSOutPut output;
float4 albedoColor = albedoTexture.Sample(Sampler, In.TexCoord);
output.Color = albedoColor;
output.Normal = float4(In.Normal.x, In.Normal.y, In.Normal.z, 1.0f);
return output;
}
조명
2패스째에서는 1패스째에 작성한 G-Buffer를 사용해 쉐이딩해 갑니다.
main.cpp//以下構築済みとする
ID3D11DeviceContext* m_pd3dDeviceContext; //D3D11デバイスコンテキスト
ID3D11ShaderResourceView* m_ColorSRV; //カラーマップのシェーダーリソースビュー
ID3D11ShaderResourceView* m_NormalSRV; //法線マップのシェーダーリソースビュー
ID3D11DepthStencilView* m_depthStencilView; //デプスステンシルビュー
ID3D11RenderTargetView* m_frameBuffer; //フレームバッファ
std::unique_ptr<DirectX::SpriteBatch> m_spriteBatch; //スプライトバッチ
ID3D11PixelShader* m_pixelShader; //ピクセルシェーダー
ID3D11Buffer* m_lightCb //ライト用の定数バッファ
ID3D11RenderTargetView* rt[] = {
m_frameBuffer
};
//レンダリングターゲットの切り替え。
m_pd3dDeviceContext->OMSetRenderTargets(1, rtTbl, m_depthStensilView);
m_spriteBatch.get()->Begin(DirectX::SpriteSortMode_BackToFront, nullptr, nullptr, nullptr, nullptr, [=]
{
//定数バッファを設定
m_pd3dDeviceContext->PSSetConstantBuffers(0, 0, &m_lightCb);
//ピクセルシェーダーを設定
m_pd3dDeviceContext>PSSetShader(m_pixelShader, nullptr, 0);
//法線マップをシェーダーリソースビューに設定
ID3D11ShaderResourceView* srv[]{
m_NormalSRV
};
m_pd3dDeviceContext->PSSetShaderResources(1, 1, srv);
}
);
//ドロー
m_spriteBatch->Draw(m_ColorSRV, DirectX::XMFLOAT2(0.0f, 0.0f));
m_spriteBatch.get()->End();
이어서 셰이더입니다.
defefferd.fxcbuffer lightCb : register(b0){
float3 dligDirection; //ライトの方向
float3 dligColor //ライトの色
};
Texture2D<float4> ColorMap : register(t0); //カラーマップ
Texture2D<float4> NormalMap : register(t1); //法線マップ
sampler TextureSampler : register(s0); //サンプラー
float4 PSMain(
float4 color : COLOR0,
float2 texCoord : TEXCOORD0) : SV_Target0
{
float4 color = ColorMap.(TextureSampler, texCoord);
float4 normal = NormalMap.(TextureSampler,texCoord);
float3 lig = 0.0f;
lig += max(0.0f, dot(normal.xyz * -1.0f, dligDirection)) * dligColor;
lig += 1.0f; //全体的に明るくする
float4 finalColor = color;
finalColor.xyz *= lig;
return finalColor;
}
Reference
이 문제에 관하여(DirectX에서 디퍼드 렌더링), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/akurobit/items/24db203b0d5271a00ba8
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
//以下構築済みとする
ID3D11DeviceContext* m_pd3dDeviceContext; //D3D11デバイスコンテキスト
ID3D11RenderTargetView* m_colorMap; //カラーマップ
ID3D11RenderTargetView* m_normalMap; //法線マップ
ID3D11ShaderResourceView* m_ColorSRV; //カラーマップのシェーダーリソースビュー
ID3D11ShaderResourceView* m_NormalSRV; //法線マップのシェーダーリソースビュー
ID3D11DepthStencilView* m_depthStencilView; //デプスステンシルビュー
//カラーマップと法線マップをレンダリングターゲットに設定する
ID3D11RenderTargetView* rts[] = {
m_colorMap,
m_normalMap
};
m_pd3dDeviceContext->OMSetRenderTargets(2,rts,m_depthStencilView);
//この後にモデルをドローしていく
Texture2D<float4> albedoTexture : register(t0); //アルベドテクスチャ
sampler Sampler : register(s0); //サンプラー
ピクセルシェーダーの入力
struct PSInput{
float4 Position : SV_POSITION;
float3 Normal : NORMAL;
float2 TexCoord : TEXCOORD0;
};
//ピクセルシェーダーの出力構造体
struct PSOutPut {
float4 Color : SV_Target0;
float4 Normal : SV_Target1;
};
//モデル用のピクセルシェーダー
PSOutPut PSMain( PSInput In ) : SV_Target0
{
PSOutPut output;
float4 albedoColor = albedoTexture.Sample(Sampler, In.TexCoord);
output.Color = albedoColor;
output.Normal = float4(In.Normal.x, In.Normal.y, In.Normal.z, 1.0f);
return output;
}
2패스째에서는 1패스째에 작성한 G-Buffer를 사용해 쉐이딩해 갑니다.
main.cpp
//以下構築済みとする
ID3D11DeviceContext* m_pd3dDeviceContext; //D3D11デバイスコンテキスト
ID3D11ShaderResourceView* m_ColorSRV; //カラーマップのシェーダーリソースビュー
ID3D11ShaderResourceView* m_NormalSRV; //法線マップのシェーダーリソースビュー
ID3D11DepthStencilView* m_depthStencilView; //デプスステンシルビュー
ID3D11RenderTargetView* m_frameBuffer; //フレームバッファ
std::unique_ptr<DirectX::SpriteBatch> m_spriteBatch; //スプライトバッチ
ID3D11PixelShader* m_pixelShader; //ピクセルシェーダー
ID3D11Buffer* m_lightCb //ライト用の定数バッファ
ID3D11RenderTargetView* rt[] = {
m_frameBuffer
};
//レンダリングターゲットの切り替え。
m_pd3dDeviceContext->OMSetRenderTargets(1, rtTbl, m_depthStensilView);
m_spriteBatch.get()->Begin(DirectX::SpriteSortMode_BackToFront, nullptr, nullptr, nullptr, nullptr, [=]
{
//定数バッファを設定
m_pd3dDeviceContext->PSSetConstantBuffers(0, 0, &m_lightCb);
//ピクセルシェーダーを設定
m_pd3dDeviceContext>PSSetShader(m_pixelShader, nullptr, 0);
//法線マップをシェーダーリソースビューに設定
ID3D11ShaderResourceView* srv[]{
m_NormalSRV
};
m_pd3dDeviceContext->PSSetShaderResources(1, 1, srv);
}
);
//ドロー
m_spriteBatch->Draw(m_ColorSRV, DirectX::XMFLOAT2(0.0f, 0.0f));
m_spriteBatch.get()->End();
이어서 셰이더입니다.
defefferd.fx
cbuffer lightCb : register(b0){
float3 dligDirection; //ライトの方向
float3 dligColor //ライトの色
};
Texture2D<float4> ColorMap : register(t0); //カラーマップ
Texture2D<float4> NormalMap : register(t1); //法線マップ
sampler TextureSampler : register(s0); //サンプラー
float4 PSMain(
float4 color : COLOR0,
float2 texCoord : TEXCOORD0) : SV_Target0
{
float4 color = ColorMap.(TextureSampler, texCoord);
float4 normal = NormalMap.(TextureSampler,texCoord);
float3 lig = 0.0f;
lig += max(0.0f, dot(normal.xyz * -1.0f, dligDirection)) * dligColor;
lig += 1.0f; //全体的に明るくする
float4 finalColor = color;
finalColor.xyz *= lig;
return finalColor;
}
Reference
이 문제에 관하여(DirectX에서 디퍼드 렌더링), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/akurobit/items/24db203b0d5271a00ba8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)