Graphics/DeferredRenderTechnique: Optimize Deferred Shading
No longer copies depth twice Former-commit-id: aa2096ade409861b773bc7302ced27ae84fab858 [formerly 80fd00bd4a75506b128b70a545eb43ff6a3a7071] [formerly d8576a8858caca9314ea67661af0ce7d9077ba9d [formerly e626f2fd62d19ca5f952485478bfe46f4a803227]] Former-commit-id: 363c93e397887e66b25446927bc5ef89e761c488 [formerly a8bee284456d7f46d182ae7df2d565fa29e55b61] Former-commit-id: 168792d853247ada5add8f97057c213af7c801b3
This commit is contained in:
parent
c196037cb7
commit
f3c57a5417
|
|
@ -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];
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,7 +69,7 @@ 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];
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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é)
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
@ -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
|
|
@ -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
Loading…
Reference in New Issue