Graphics/DeferredRenderTechnique: Optimize Deferred Shading

No longer copies depth twice


Former-commit-id: fa946456f8196d2955efa278f2c47cdc9f6c0dac [formerly df5a55b487b02ebe7df1c31dc640ca60042ed49b] [formerly 5ebfb7cd0df4c998292a7f0b661438f4f2fc3b6d [formerly bd64449e3ecaa7443a4db86d6ef787fd42fbc314]]
Former-commit-id: 7bd35cd3c2bd845f9ee8b3d2d2a48793f63047e7 [formerly 267393d8cb349d6f77bf9e707c6ce2d5344ed7d7]
Former-commit-id: b9e45d39c4ec5a0ea4dd0cc37f478af0cf3e0caa
This commit is contained in:
Lynix 2016-08-15 01:27:33 +02:00
parent e501a93ae2
commit 705faa8d95
12 changed files with 24 additions and 38 deletions

View File

@ -47,9 +47,9 @@ namespace Nz
Vector2ui m_dimensions; Vector2ui m_dimensions;
DeferredRenderTechnique* m_deferredTechnique; DeferredRenderTechnique* m_deferredTechnique;
DeferredRenderQueue* m_renderQueue; DeferredRenderQueue* m_renderQueue;
RenderBuffer* m_depthStencilBuffer;
RenderTexture* m_GBufferRTT; RenderTexture* m_GBufferRTT;
RenderTexture* m_workRTT; RenderTexture* m_workRTT;
Texture* m_depthStencilTexture;
Texture* m_GBuffer[4]; Texture* m_GBuffer[4];
Texture* m_workTextures[2]; Texture* m_workTextures[2];

View File

@ -37,7 +37,7 @@ namespace Nz
void EnablePass(RenderPassType renderPass, int position, bool enable); void EnablePass(RenderPassType renderPass, int position, bool enable);
RenderBuffer* GetDepthStencilBuffer() const; Texture* GetDepthStencilTexture() const;
Texture* GetGBuffer(unsigned int i) const; Texture* GetGBuffer(unsigned int i) const;
RenderTexture* GetGBufferRTT() const; RenderTexture* GetGBufferRTT() const;
const ForwardRenderTechnique* GetForwardTechnique() const; const ForwardRenderTechnique* GetForwardTechnique() const;
@ -69,14 +69,14 @@ namespace Nz
std::map<RenderPassType, std::map<int, std::unique_ptr<DeferredRenderPass>>, RenderPassComparator> m_passes; std::map<RenderPassType, std::map<int, std::unique_ptr<DeferredRenderPass>>, RenderPassComparator> m_passes;
ForwardRenderTechnique m_forwardTechnique; // Must be initialized before the RenderQueue ForwardRenderTechnique m_forwardTechnique; // Must be initialized before the RenderQueue
DeferredRenderQueue m_renderQueue; DeferredRenderQueue m_renderQueue;
mutable RenderBufferRef m_depthStencilBuffer; mutable TextureRef m_depthStencilTexture;
mutable RenderTexture m_GBufferRTT; mutable RenderTexture m_GBufferRTT;
mutable RenderTexture m_workRTT; mutable RenderTexture m_workRTT;
mutable TextureRef m_GBuffer[4]; mutable TextureRef m_GBuffer[4];
mutable TextureRef m_workTextures[2]; mutable TextureRef m_workTextures[2];
mutable Vector2ui m_GBufferSize; mutable Vector2ui m_GBufferSize;
const RenderTarget* m_viewerTarget; const RenderTarget* m_viewerTarget;
}; };
} }
#endif // NAZARA_FORWARDRENDERTECHNIQUE_HPP #endif // NAZARA_FORWARDRENDERTECHNIQUE_HPP

View File

@ -232,7 +232,7 @@ namespace Nz
unsigned int width = dimensions.x; unsigned int width = dimensions.x;
unsigned int height = dimensions.y; unsigned int height = dimensions.y;
m_depthStencilBuffer->Create(PixelFormatType_Depth24Stencil8, width, height); m_depthStencilTexture->Create(ImageType_2D, PixelFormatType_Depth24Stencil8, width, height);
m_GBuffer[0]->Create(ImageType_2D, PixelFormatType_RGBA8, width, height); // Texture 0 : Diffuse Color + Specular m_GBuffer[0]->Create(ImageType_2D, PixelFormatType_RGBA8, width, height); // Texture 0 : Diffuse Color + Specular
m_GBuffer[1]->Create(ImageType_2D, PixelFormatType_RG16F, width, height); // Texture 1 : Encoded normal m_GBuffer[1]->Create(ImageType_2D, PixelFormatType_RG16F, width, height); // Texture 1 : Encoded normal
@ -246,7 +246,7 @@ namespace Nz
// Texture 3 : Emission map ? // Texture 3 : Emission map ?
m_GBufferRTT->AttachBuffer(AttachmentPoint_DepthStencil, 0, m_depthStencilBuffer); m_GBufferRTT->AttachTexture(AttachmentPoint_DepthStencil, 0, m_depthStencilTexture);
m_GBufferRTT->Unlock(); m_GBufferRTT->Unlock();
@ -258,7 +258,7 @@ namespace Nz
m_workRTT->AttachTexture(AttachmentPoint_Color, i, m_workTextures[i]); m_workRTT->AttachTexture(AttachmentPoint_Color, i, m_workTextures[i]);
} }
m_workRTT->AttachBuffer(AttachmentPoint_DepthStencil, 0, m_depthStencilBuffer); m_workRTT->AttachTexture(AttachmentPoint_DepthStencil, 0, m_depthStencilTexture);
m_workRTT->Unlock(); m_workRTT->Unlock();

View File

@ -114,6 +114,9 @@ namespace Nz
Renderer::SetTexture(2, m_GBuffer[2]); Renderer::SetTexture(2, m_GBuffer[2]);
Renderer::SetTextureSampler(2, m_pointSampler); Renderer::SetTextureSampler(2, m_pointSampler);
Renderer::SetTexture(3, m_depthStencilTexture);
Renderer::SetTextureSampler(3, m_pointSampler);
Renderer::SetClearColor(Color::Black); Renderer::SetClearColor(Color::Black);
Renderer::Clear(RendererBuffer_Color); Renderer::Clear(RendererBuffer_Color);

View File

@ -48,7 +48,7 @@ namespace Nz
m_deferredTechnique = technique; m_deferredTechnique = technique;
m_renderQueue = static_cast<DeferredRenderQueue*>(technique->GetRenderQueue()); m_renderQueue = static_cast<DeferredRenderQueue*>(technique->GetRenderQueue());
m_depthStencilBuffer = technique->GetDepthStencilBuffer(); m_depthStencilTexture = technique->GetDepthStencilTexture();
m_GBufferRTT = technique->GetGBufferRTT(); m_GBufferRTT = technique->GetGBufferRTT();
for (unsigned int i = 0; i < 3; ++i) for (unsigned int i = 0; i < 3; ++i)

View File

@ -136,7 +136,7 @@ namespace Nz
m_renderQueue(static_cast<ForwardRenderQueue*>(m_forwardTechnique.GetRenderQueue())), m_renderQueue(static_cast<ForwardRenderQueue*>(m_forwardTechnique.GetRenderQueue())),
m_GBufferSize(0U) m_GBufferSize(0U)
{ {
m_depthStencilBuffer = RenderBuffer::New(); m_depthStencilTexture = Texture::New();
for (unsigned int i = 0; i < 2; ++i) for (unsigned int i = 0; i < 2; ++i)
m_workTextures[i] = Texture::New(); m_workTextures[i] = Texture::New();
@ -305,9 +305,9 @@ namespace Nz
* \return Pointer to the rendering buffer * \return Pointer to the rendering buffer
*/ */
RenderBuffer* DeferredRenderTechnique::GetDepthStencilBuffer() const Texture* DeferredRenderTechnique::GetDepthStencilTexture() const
{ {
return m_depthStencilBuffer; return m_depthStencilTexture;
} }
/*! /*!
@ -652,6 +652,7 @@ namespace Nz
shader->SendInteger(shader->GetUniformLocation("GBuffer0"), 0); shader->SendInteger(shader->GetUniformLocation("GBuffer0"), 0);
shader->SendInteger(shader->GetUniformLocation("GBuffer1"), 1); shader->SendInteger(shader->GetUniformLocation("GBuffer1"), 1);
shader->SendInteger(shader->GetUniformLocation("GBuffer2"), 2); shader->SendInteger(shader->GetUniformLocation("GBuffer2"), 2);
shader->SendInteger(shader->GetUniformLocation("DepthBuffer"), 3);
shader = RegisterDeferredShader("DeferredPointSpotLight", r_fragmentSource_PointSpotLight, sizeof(r_fragmentSource_PointSpotLight), basicVertexStage, &error); shader = RegisterDeferredShader("DeferredPointSpotLight", r_fragmentSource_PointSpotLight, sizeof(r_fragmentSource_PointSpotLight), basicVertexStage, &error);
@ -664,6 +665,7 @@ namespace Nz
shader->SendInteger(shader->GetUniformLocation("GBuffer0"), 0); shader->SendInteger(shader->GetUniformLocation("GBuffer0"), 0);
shader->SendInteger(shader->GetUniformLocation("GBuffer1"), 1); shader->SendInteger(shader->GetUniformLocation("GBuffer1"), 1);
shader->SendInteger(shader->GetUniformLocation("GBuffer2"), 2); shader->SendInteger(shader->GetUniformLocation("GBuffer2"), 2);
shader->SendInteger(shader->GetUniformLocation("DepthBuffer"), 3);
// Shaders optionnels (S'ils ne sont pas présents, le rendu minimal sera quand même assuré) // Shaders optionnels (S'ils ne sont pas présents, le rendu minimal sera quand même assuré)

View File

@ -11,17 +11,12 @@ uniform vec4 LightDirection;
uniform sampler2D GBuffer0; uniform sampler2D GBuffer0;
uniform sampler2D GBuffer1; uniform sampler2D GBuffer1;
uniform sampler2D GBuffer2; uniform sampler2D GBuffer2;
uniform sampler2D DepthBuffer;
uniform mat4 InvViewProjMatrix; uniform mat4 InvViewProjMatrix;
uniform vec2 InvTargetSize; uniform vec2 InvTargetSize;
uniform vec4 SceneAmbient; uniform vec4 SceneAmbient;
float ColorToFloat(vec3 color)
{
const vec3 byte_to_float = vec3(1.0, 1.0/256, 1.0/(256*256));
return dot(color, byte_to_float);
}
#define kPI 3.1415926536 #define kPI 3.1415926536
vec3 DecodeNormal(in vec4 encodedNormal) vec3 DecodeNormal(in vec4 encodedNormal)
@ -44,7 +39,7 @@ void main()
vec3 diffuseColor = gVec0.xyz; vec3 diffuseColor = gVec0.xyz;
vec3 normal = DecodeNormal(gVec1); vec3 normal = DecodeNormal(gVec1);
float specularMultiplier = gVec0.w; float specularMultiplier = gVec0.w;
float depth = ColorToFloat(gVec2.xyz); float depth = textureLod(DepthBuffer, texCoord, 0.0).r;
float shininess = (gVec2.w == 0.0) ? 0.0 : exp2(gVec2.w*10.5); float shininess = (gVec2.w == 0.0) ? 0.0 : exp2(gVec2.w*10.5);
vec3 lightDir = -LightDirection.xyz; vec3 lightDir = -LightDirection.xyz;

File diff suppressed because one or more lines are too long

View File

@ -19,6 +19,7 @@ uniform vec2 LightParameters3;
uniform sampler2D GBuffer0; uniform sampler2D GBuffer0;
uniform sampler2D GBuffer1; uniform sampler2D GBuffer1;
uniform sampler2D GBuffer2; uniform sampler2D GBuffer2;
uniform sampler2D DepthBuffer;
uniform mat4 InvViewProjMatrix; uniform mat4 InvViewProjMatrix;
uniform vec2 InvTargetSize; uniform vec2 InvTargetSize;
@ -57,7 +58,7 @@ void main()
vec3 diffuseColor = gVec0.xyz; vec3 diffuseColor = gVec0.xyz;
vec3 normal = DecodeNormal(gVec1); vec3 normal = DecodeNormal(gVec1);
float specularMultiplier = gVec0.w; float specularMultiplier = gVec0.w;
float depth = ColorToFloat(gVec2.xyz); float depth = textureLod(DepthBuffer, texCoord, 0.0).r;
float shininess = (gVec2.w == 0.0) ? 0.0 : exp2(gVec2.w*10.5); float shininess = (gVec2.w == 0.0) ? 0.0 : exp2(gVec2.w*10.5);
vec3 viewSpace = vec3(texCoord*2.0 - 1.0, depth*2.0 - 1.0); vec3 viewSpace = vec3(texCoord*2.0 - 1.0, depth*2.0 - 1.0);

File diff suppressed because one or more lines are too long

View File

@ -68,21 +68,6 @@ uniform vec4 SceneAmbient;
uniform sampler2D TextureOverlay; uniform sampler2D TextureOverlay;
/********************Fonctions********************/ /********************Fonctions********************/
vec3 FloatToColor(float f)
{
vec3 color;
f *= 256.0;
color.x = floor(f);
f = (f - color.x) * 256.0;
color.y = floor(f);
color.z = f - color.y;
color.xy *= 0.00390625; // *= 1.0/256
return color;
}
#define kPI 3.1415926536 #define kPI 3.1415926536
@ -184,7 +169,7 @@ void main()
*/ */
RenderTarget0 = vec4(diffuseColor.rgb, dot(specularColor, vec3(0.3, 0.59, 0.11))); RenderTarget0 = vec4(diffuseColor.rgb, dot(specularColor, vec3(0.3, 0.59, 0.11)));
RenderTarget1 = vec4(EncodeNormal(normal)); RenderTarget1 = vec4(EncodeNormal(normal));
RenderTarget2 = vec4(FloatToColor(gl_FragCoord.z), (MaterialShininess == 0.0) ? 0.0 : max(log2(MaterialShininess), 0.1)/10.5); // http://www.guerrilla-games.com/publications/dr_kz2_rsx_dev07.pdf RenderTarget2 = vec4(0.0, 0.0, 0.0, (MaterialShininess == 0.0) ? 0.0 : max(log2(MaterialShininess), 0.1)/10.5); // http://www.guerrilla-games.com/publications/dr_kz2_rsx_dev07.pdf
#else // FLAG_DEFERRED #else // FLAG_DEFERRED
#if ALPHA_MAPPING #if ALPHA_MAPPING
diffuseColor.a *= texture(MaterialAlphaMap, texCoord).r; diffuseColor.a *= texture(MaterialAlphaMap, texCoord).r;

File diff suppressed because one or more lines are too long