From e5a6f543a047d0ca489f58f040d10ab10d95a7c7 Mon Sep 17 00:00:00 2001 From: Michael Tao Date: Sat, 5 Oct 2019 16:52:42 -0400 Subject: [PATCH] Shaders: ambient also changes color with VertexColor in Phong. Also adapt the test to explicitly check for this. --- src/Magnum/Shaders/Phong.frag | 3 +++ src/Magnum/Shaders/Test/PhongGLTest.cpp | 9 ++++++--- .../Test/PhongTestFiles/vertexColor.tga | Bin 19218 -> 10876 bytes 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Magnum/Shaders/Phong.frag b/src/Magnum/Shaders/Phong.frag index 39ff82d47..034fbee25 100644 --- a/src/Magnum/Shaders/Phong.frag +++ b/src/Magnum/Shaders/Phong.frag @@ -176,6 +176,9 @@ void main() { #ifdef AMBIENT_TEXTURE texture(ambientTexture, interpolatedTextureCoordinates)* #endif + #ifdef VERTEX_COLOR + interpolatedVertexColor* + #endif ambientColor; #if LIGHT_COUNT lowp const vec4 finalDiffuseColor = diff --git a/src/Magnum/Shaders/Test/PhongGLTest.cpp b/src/Magnum/Shaders/Test/PhongGLTest.cpp index bf67b8287..8927e9199 100644 --- a/src/Magnum/Shaders/Test/PhongGLTest.cpp +++ b/src/Magnum/Shaders/Test/PhongGLTest.cpp @@ -973,8 +973,10 @@ template void PhongGLTest::renderVertexColor() { Trade::MeshData sphereData = Primitives::uvSphereSolid(16, 32, Primitives::UVSphereFlag::TextureCoordinates); - /* Highlight the middle rings */ + /* Highlight the pole vertices and the middle rings */ Containers::Array colorData{Containers::DirectInit, sphereData.vertexCount(), 0x999999_rgbf}; + for(std::size_t i = 0; i != 3*33 + 1; ++i) + colorData[sphereData.vertexCount() - i - 1] = 0xff0000_rgbf*5.0f; for(std::size_t i = 6*33; i != 9*33; ++i) colorData[i + 1] = 0xffff99_rgbf*1.5f; @@ -1006,6 +1008,7 @@ template void PhongGLTest::renderVertexColor() { .setNormalMatrix((Matrix4::rotationY(-15.0_degf)* Matrix4::rotationX(15.0_degf)).rotationScaling()) .setProjectionMatrix(Matrix4::perspectiveProjection(60.0_degf, 1.0f, 0.1f, 10.0f)) + .setAmbientColor(0x111111_rgbf) .setDiffuseColor(0x9999ff_rgbf) .bindDiffuseTexture(diffuse) .draw(sphere); @@ -1015,10 +1018,10 @@ template void PhongGLTest::renderVertexColor() { #if !(defined(MAGNUM_TARGET_GLES2) && defined(MAGNUM_TARGET_WEBGL)) /* SwiftShader has some minor differences on the edges, Apple A8 a bit more */ - const Float maxThreshold = 105.4f, meanThreshold = 0.167f; + const Float maxThreshold = 115.4f, meanThreshold = 0.167f; #else /* WebGL 1 doesn't have 8bit renderbuffer storage, so it's worse */ - const Float maxThreshold = 105.4f, meanThreshold = 3.254f; + const Float maxThreshold = 115.4f, meanThreshold = 3.254f; #endif CORRADE_COMPARE_WITH( /* Dropping the alpha channel, as it's always 1.0 */ diff --git a/src/Magnum/Shaders/Test/PhongTestFiles/vertexColor.tga b/src/Magnum/Shaders/Test/PhongTestFiles/vertexColor.tga index 1f044cab8688a0cf4329b2d1c588db822ef15694..b674db5bad24cdd47ce2fe550b4b1ba6dab427ee 100644 GIT binary patch literal 10876 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