Commit 031838cb authored by hybrid's avatar hybrid

Fix blend state propagation for MRTs to OpenGL.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3445 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 8aa814a7
...@@ -3943,7 +3943,7 @@ bool COpenGLDriver::setRenderTarget(const core::array<video::IRenderTarget>& tar ...@@ -3943,7 +3943,7 @@ bool COpenGLDriver::setRenderTarget(const core::array<video::IRenderTarget>& tar
} }
if (FeatureAvailable[IRR_AMD_draw_buffers_blend] || FeatureAvailable[IRR_ARB_draw_buffers_blend]) if (FeatureAvailable[IRR_AMD_draw_buffers_blend] || FeatureAvailable[IRR_ARB_draw_buffers_blend])
{ {
extGlBlendFuncIndexed(i, targets[i].BlendFuncSrc, targets[i].BlendFuncDst); extGlBlendFuncIndexed(i, getGLBlend(targets[i].BlendFuncSrc), getGLBlend(targets[i].BlendFuncDst));
} }
if (targets[i].TargetType==ERT_RENDER_TEXTURE) if (targets[i].TargetType==ERT_RENDER_TEXTURE)
{ {
...@@ -4148,6 +4148,7 @@ core::dimension2du COpenGLDriver::getMaxTextureSize() const ...@@ -4148,6 +4148,7 @@ core::dimension2du COpenGLDriver::getMaxTextureSize() const
return core::dimension2du(MaxTextureSize, MaxTextureSize); return core::dimension2du(MaxTextureSize, MaxTextureSize);
} }
//! Convert E_PRIMITIVE_TYPE to OpenGL equivalent //! Convert E_PRIMITIVE_TYPE to OpenGL equivalent
GLenum COpenGLDriver::primitiveTypeToGL(scene::E_PRIMITIVE_TYPE type) const GLenum COpenGLDriver::primitiveTypeToGL(scene::E_PRIMITIVE_TYPE type) const
{ {
...@@ -4183,6 +4184,28 @@ GLenum COpenGLDriver::primitiveTypeToGL(scene::E_PRIMITIVE_TYPE type) const ...@@ -4183,6 +4184,28 @@ GLenum COpenGLDriver::primitiveTypeToGL(scene::E_PRIMITIVE_TYPE type) const
return GL_TRIANGLES; return GL_TRIANGLES;
} }
GLenum getGLBlend (E_BLEND_FACTOR factor) const
{
u32 r = 0;
switch (factor)
{
case EBF_ZERO: r = GL_ZERO; break;
case EBF_ONE: r = GL_ONE; break;
case EBF_DST_COLOR: r = GL_DST_COLOR; break;
case EBF_ONE_MINUS_DST_COLOR: r = GL_ONE_MINUS_DST_COLOR; break;
case EBF_SRC_COLOR: r = GL_SRC_COLOR; break;
case EBF_ONE_MINUS_SRC_COLOR: r = GL_ONE_MINUS_SRC_COLOR; break;
case EBF_SRC_ALPHA: r = GL_SRC_ALPHA; break;
case EBF_ONE_MINUS_SRC_ALPHA: r = GL_ONE_MINUS_SRC_ALPHA; break;
case EBF_DST_ALPHA: r = GL_DST_ALPHA; break;
case EBF_ONE_MINUS_DST_ALPHA: r = GL_ONE_MINUS_DST_ALPHA; break;
case EBF_SRC_ALPHA_SATURATE: r = GL_SRC_ALPHA_SATURATE; break;
}
return r;
}
} // end namespace } // end namespace
} // end namespace } // end namespace
......
...@@ -378,6 +378,9 @@ namespace video ...@@ -378,6 +378,9 @@ namespace video
//! Convert E_PRIMITIVE_TYPE to OpenGL equivalent //! Convert E_PRIMITIVE_TYPE to OpenGL equivalent
GLenum primitiveTypeToGL(scene::E_PRIMITIVE_TYPE type) const; GLenum primitiveTypeToGL(scene::E_PRIMITIVE_TYPE type) const;
//! Convert E_BLEND_FACTOR to OpenGL equivalent
GLenum getGLBlend((E_BLEND_FACTOR factor) const;
private: private:
//! clears the zbuffer and color buffer //! clears the zbuffer and color buffer
......
...@@ -93,7 +93,7 @@ public: ...@@ -93,7 +93,7 @@ public:
glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, (f32) modulate ); glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, (f32) modulate );
#endif #endif
glBlendFunc( getGLBlend(srcFact), getGLBlend(dstFact) ); glBlendFunc( Driver->getGLBlend(srcFact), Driver->getGLBlend(dstFact) );
glEnable(GL_ALPHA_TEST); glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.f); glAlphaFunc(GL_GREATER, 0.f);
glEnable(GL_BLEND); glEnable(GL_BLEND);
...@@ -165,29 +165,6 @@ public: ...@@ -165,29 +165,6 @@ public:
{ {
return true; return true;
} }
private:
u32 getGLBlend ( E_BLEND_FACTOR factor ) const
{
u32 r = 0;
switch ( factor )
{
case EBF_ZERO: r = GL_ZERO; break;
case EBF_ONE: r = GL_ONE; break;
case EBF_DST_COLOR: r = GL_DST_COLOR; break;
case EBF_ONE_MINUS_DST_COLOR: r = GL_ONE_MINUS_DST_COLOR; break;
case EBF_SRC_COLOR: r = GL_SRC_COLOR; break;
case EBF_ONE_MINUS_SRC_COLOR: r = GL_ONE_MINUS_SRC_COLOR; break;
case EBF_SRC_ALPHA: r = GL_SRC_ALPHA; break;
case EBF_ONE_MINUS_SRC_ALPHA: r = GL_ONE_MINUS_SRC_ALPHA; break;
case EBF_DST_ALPHA: r = GL_DST_ALPHA; break;
case EBF_ONE_MINUS_DST_ALPHA: r = GL_ONE_MINUS_DST_ALPHA; break;
case EBF_SRC_ALPHA_SATURATE: r = GL_SRC_ALPHA_SATURATE; break;
}
return r;
}
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment