From 41836760fa59abc74098aed7450b4858dc288e56 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Wed, 11 Jun 2014 13:05:49 +0300 Subject: In modernopengl add alpha for textures. --- src/render/modernopenglgraphics.cpp | 22 ++++++++++------------ src/render/modernopenglgraphics.h | 1 + src/test/testlauncher.cpp | 2 ++ 3 files changed, 13 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/render/modernopenglgraphics.cpp b/src/render/modernopenglgraphics.cpp index 3241821ba..a1c2d2bb6 100644 --- a/src/render/modernopenglgraphics.cpp +++ b/src/render/modernopenglgraphics.cpp @@ -100,6 +100,7 @@ ModernOpenGLGraphics::ModernOpenGLGraphics() : mSimpleColorUniform(0U), mSimplePosAttrib(0), mTexturePosAttrib(0), + mTextureColorUniform(0U), mSimpleScreenUniform(0U), mTextureScreenUniform(0U), mVao(0U), @@ -168,6 +169,8 @@ void ModernOpenGLGraphics::postInit() mglVertexAttribFormat(mSimplePosAttrib, 2, GL_FLOAT, GL_FALSE, 0); mTexturePosAttrib = mglGetAttribLocation(mTextureProgramId, "position"); + mTextureColorUniform = mglGetUniformLocation(mTextureProgramId, "color"); + mglUniform1f(mTextureColorUniform, 1.0f); mTextureScreenUniform = mglGetUniformLocation(mTextureProgramId, "screen"); mglVertexAttribFormat(mTexturePosAttrib, 4, GL_FLOAT, GL_FALSE, 0); @@ -247,15 +250,11 @@ void ModernOpenGLGraphics::setColorAll(const Color &color, void ModernOpenGLGraphics::setColorAlpha(const float alpha) { - // here need set alpha uniform for textures only -/* - if (!mIsByteColor && mFloatColor == alpha) - return; - - glColor4f(1.0F, 1.0F, 1.0F, alpha); - mIsByteColor = false; - mFloatColor = alpha; -*/ + if (mAlphaCached != alpha) + { + mAlphaCached = alpha; + mglUniform1f(mTextureColorUniform, alpha); + } } void ModernOpenGLGraphics::drawQuad(const Image *const image, @@ -317,12 +316,12 @@ bool ModernOpenGLGraphics::drawImageInline(const Image *const image, if (!image) return false; - setColorAlpha(image->mAlpha); #ifdef DEBUG_BIND_TEXTURE debugBindTexture(image); #endif bindTexture(GL_TEXTURE_2D, image->mGLImage); setTexturingAndBlending(true); + setColorAlpha(image->mAlpha); const ClipRect &clipArea = mClipStack.top(); const SDL_Rect &imageRect = image->mBounds; @@ -385,14 +384,13 @@ void ModernOpenGLGraphics::drawPatternInline(const Image *const image, const int x2 = x + clipArea.xOffset; const int y2 = y + clipArea.yOffset; - setColorAlpha(image->mAlpha); - #ifdef DEBUG_BIND_TEXTURE debugBindTexture(image); #endif bindTexture(OpenGLImageHelper::mTextureType, image->mGLImage); setTexturingAndBlending(true); + setColorAlpha(image->mAlpha); unsigned int vp = 0; const unsigned int vLimit = mMaxVertices * 4; diff --git a/src/render/modernopenglgraphics.h b/src/render/modernopenglgraphics.h index 5519fd282..d9c043fc0 100644 --- a/src/render/modernopenglgraphics.h +++ b/src/render/modernopenglgraphics.h @@ -98,6 +98,7 @@ class ModernOpenGLGraphics final : public Graphics GLuint mSimpleColorUniform; GLint mSimplePosAttrib; GLint mTexturePosAttrib; + GLint mTextureColorUniform; GLuint mSimpleScreenUniform; GLuint mTextureScreenUniform; GLuint mVao; diff --git a/src/test/testlauncher.cpp b/src/test/testlauncher.cpp index da09813d8..623fae805 100644 --- a/src/test/testlauncher.cpp +++ b/src/test/testlauncher.cpp @@ -380,7 +380,9 @@ int TestLauncher::testDraw() mainGraphics->drawRectangle(Rect(0, 0, 400, 200)); mainGraphics->setColor(Color(0xFFU, 0x00U, 0x00U, 0xB0U)); + img[0]->setAlpha(0.5f); mainGraphics->drawImage(img[0], 190, 383); + img[0]->setAlpha(1.0f); mainGraphics->setColor(Color(0x80U, 0x00U, 0xA0U, 0x90U)); mainGraphics->fillRectangle(Rect(200, 100, 300, 300)); -- cgit v1.2.3-60-g2f50