From a5407ceb53c0ec2848873824487260dc1cfa1c95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 7 Feb 2022 21:31:59 +0100 Subject: [PATCH] Shaders: test MeshVisualizer TBN + vertex and object ID visualization. Fails spectacularly -- the geometry shader is aware only of instanced object ID, and of vertex ID not at all. The former was a corner case TODO while I was adding non-instanced object ID visualization in 033e56ec23bd1a160a5af96dd8856ef92969daf1 and which I kinda forgot about, the latter was discovered while trying to fix the former. Fix in the next commit. --- src/Magnum/Shaders/Test/CMakeLists.txt | 2 ++ .../Shaders/Test/MeshVisualizerGLTest.cpp | 30 ++++++++++++++++-- .../MeshVisualizerTestFiles/objectid-tn.tga | Bin 0 -> 1007 bytes .../MeshVisualizerTestFiles/vertexid-tn.tga | Bin 0 -> 4569 bytes 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 src/Magnum/Shaders/Test/MeshVisualizerTestFiles/objectid-tn.tga create mode 100644 src/Magnum/Shaders/Test/MeshVisualizerTestFiles/vertexid-tn.tga diff --git a/src/Magnum/Shaders/Test/CMakeLists.txt b/src/Magnum/Shaders/Test/CMakeLists.txt index e48a4d39b..31e27b5b9 100644 --- a/src/Magnum/Shaders/Test/CMakeLists.txt +++ b/src/Magnum/Shaders/Test/CMakeLists.txt @@ -210,6 +210,7 @@ if(BUILD_GL_TESTS) MeshVisualizerTestFiles/defaults-wireframe3D.tga MeshVisualizerTestFiles/instancedobjectid2D.tga MeshVisualizerTestFiles/instancedobjectid3D.tga + MeshVisualizerTestFiles/objectid-tn.tga MeshVisualizerTestFiles/objectid2D.tga MeshVisualizerTestFiles/objectid3D.tga MeshVisualizerTestFiles/objectidtexture2D.tga @@ -219,6 +220,7 @@ if(BUILD_GL_TESTS) MeshVisualizerTestFiles/primitiveid3D.tga MeshVisualizerTestFiles/tbn-wide.tga MeshVisualizerTestFiles/tbn.tga + MeshVisualizerTestFiles/vertexid-tn.tga MeshVisualizerTestFiles/vertexid2D.tga MeshVisualizerTestFiles/vertexid3D.tga MeshVisualizerTestFiles/wireframe-nogeo2D.tga diff --git a/src/Magnum/Shaders/Test/MeshVisualizerGLTest.cpp b/src/Magnum/Shaders/Test/MeshVisualizerGLTest.cpp index 57f6cd8f7..f7f3e765e 100644 --- a/src/Magnum/Shaders/Test/MeshVisualizerGLTest.cpp +++ b/src/Magnum/Shaders/Test/MeshVisualizerGLTest.cpp @@ -736,11 +736,30 @@ constexpr struct { MeshVisualizerGL3D::Flag::NormalDirection, MeshVisualizerGL3D::Flag::Wireframe, false, 2.0f, 1.0f, 0.6f, 1.0f, "wireframe-tn-smooth.tga"}, + {"vertex ID + tangents + normals", + MeshVisualizerGL3D::Flag::VertexId| + MeshVisualizerGL3D::Flag::TangentDirection| + MeshVisualizerGL3D::Flag::NormalDirection, {}, + false, 2.0f, 1.0f, 0.6f, 1.0f, "vertexid-tn.tga"}, {"primitive ID + tangents + normals", MeshVisualizerGL3D::Flag::PrimitiveId| MeshVisualizerGL3D::Flag::TangentDirection| MeshVisualizerGL3D::Flag::NormalDirection, {}, - false, 2.0f, 1.0f, 0.6f, 1.0f, "primitiveid-tn.tga"} + false, 2.0f, 1.0f, 0.6f, 1.0f, "primitiveid-tn.tga"}, + {"object ID + tangents + normals", + /* Not instanced, so it's testing the case where the GS doesn't need to + propagate any attribute but still has to render the actual face */ + MeshVisualizerGL3D::Flag::ObjectId| + MeshVisualizerGL3D::Flag::TangentDirection| + MeshVisualizerGL3D::Flag::NormalDirection, {}, + false, 2.0f, 1.0f, 0.6f, 1.0f, "objectid-tn.tga"}, + {"instanced object ID + tangents + normals", + /* No instance data supplied, thus the output should be exactly the + same as the non-instanced case */ + MeshVisualizerGL3D::Flag::InstancedObjectId| + MeshVisualizerGL3D::Flag::TangentDirection| + MeshVisualizerGL3D::Flag::NormalDirection, {}, + false, 2.0f, 1.0f, 0.6f, 1.0f, "objectid-tn.tga"} }; #endif @@ -3991,7 +4010,7 @@ template void MeshVisualizerGLTest::renderTangent MeshVisualizerGL3D shader{data.flags|flag}; /** @todo make this unnecessary */ shader.setViewportSize({80, 80}); - if(data.flags & MeshVisualizerGL3D::Flag::PrimitiveId) + if(data.flags & (MeshVisualizerGL3D::Flag::PrimitiveId|MeshVisualizerGL3D::Flag::ObjectId|MeshVisualizerGL3D::Flag::VertexId)) shader.bindColorMapTexture(_colorMapTexture); if(flag == MeshVisualizerGL3D::Flag{}) { @@ -4007,6 +4026,10 @@ template void MeshVisualizerGLTest::renderTangent .setWireframeColor(0x9999ff_rgbf); if(data.flags & MeshVisualizerGL3D::Flag::PrimitiveId) shader.setColorMapTransformation(1.0f/512.0f, 0.5f); + else if(data.flags & MeshVisualizerGL3D::Flag::VertexId) + shader.setColorMapTransformation(1.0f/8.0f, 1.0f/4.0f); + else if(data.flags & MeshVisualizerGL3D::Flag::ObjectId) + shader.setObjectId(127); shader.draw(mesh); } else if(flag == MeshVisualizerGL3D::Flag::UniformBuffers) { GL::Buffer projectionUniform{GL::Buffer::TargetHint::Uniform, { @@ -4020,6 +4043,7 @@ template void MeshVisualizerGLTest::renderTangent GL::Buffer drawUniform{GL::Buffer::TargetHint::Uniform, { MeshVisualizerDrawUniform3D{} .setNormalMatrix(transformation.normalMatrix()*data.multiply) + .setObjectId(127) }}; MeshVisualizerMaterialUniform materialUniformData[1]; (*materialUniformData) @@ -4032,6 +4056,8 @@ template void MeshVisualizerGLTest::renderTangent .setWireframeColor(0x9999ff_rgbf); if(data.flags & MeshVisualizerGL3D::Flag::PrimitiveId) materialUniformData->setColorMapTransformation(1.0f/512.0f, 0.5f); + else if(data.flags & MeshVisualizerGL3D::Flag::VertexId) + materialUniformData->setColorMapTransformation(1.0f/8.0f, 1.0f/4.0f); GL::Buffer materialUniform{materialUniformData}; shader .bindProjectionBuffer(projectionUniform) diff --git a/src/Magnum/Shaders/Test/MeshVisualizerTestFiles/objectid-tn.tga b/src/Magnum/Shaders/Test/MeshVisualizerTestFiles/objectid-tn.tga new file mode 100644 index 0000000000000000000000000000000000000000..1a80f469c689c1786dd9aaa8c2c1f501ba775e8a GIT binary patch literal 1007 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 a=^t6XCjZ{A37`IM5`O!izy3G>9rJIlD