[vtk-developers] Bug in scalar color mapping?

Ken Martin ken.martin at kitware.com
Thu Sep 25 11:27:43 EDT 2014


Depending on various settings, phase of the moon etc, scalar colors
sometimes end up setting the ambient color and sometimes they set the
diffuse color of a vertex and sometimes they set both IIRC.  Sometimes
lighting is applied to the result and sometimes it isn’t.

The following snippet of code is what I am using for the OpenGL backend,
which is very close to that VTK currently does. Textured scalars coloring
is another beast. Hope that helps

  if ( we have scalar colors)
    {
    if (this->ScalarMaterialMode == VTK_MATERIALMODE_AMBIENT ||
          (this->ScalarMaterialMode == VTK_MATERIALMODE_DEFAULT &&
actor->GetProperty()->GetAmbient() > actor->GetProperty()->GetDiffuse()))
      {
      FSSource = replace(FSSource,"//VTK::Color::Impl",
                                  "vec3 ambientColor = vertexColor.rgb;\n"
                                  "vec3 diffuseColor =
diffuseColorUniform.rgb;\n"
                                  "float opacity = vertexColor.a;");
      }
    else if (this->ScalarMaterialMode == VTK_MATERIALMODE_DIFFUSE ||
          (this->ScalarMaterialMode == VTK_MATERIALMODE_DEFAULT &&
actor->GetProperty()->GetAmbient() <= actor->GetProperty()->GetDiffuse()))
      {
      FSSource = replace(FSSource,"//VTK::Color::Impl",
                                  "vec3 diffuseColor = vertexColor.rgb;\n"
                                  "vec3 ambientColor =
ambientColorUniform;\n"
                                  "float opacity = vertexColor.a;");
      }
    Else // I believe this case is something like
VTK_MATERIALMODE_AMBIENT_AND_DIFFUSE
      {
      FSSource = replace(FSSource,"//VTK::Color::Impl",
                                  "vec3 diffuseColor = vertexColor.rgb;\n"
                                  "vec3 ambientColor = vertexColor.rgb;\n"
                                  "float opacity = vertexColor.a;");
      }
    }
  Else // no scalars, just use material property colors
    {
    FSSource = replace(FSSource,"//VTK::Color::Impl",
                                "vec3 ambientColor =
ambientColorUniform;\n"
                                "vec3 diffuseColor =
diffuseColorUniform;\n"
                                "float opacity = opacityUniform;");
    }

Ken Martin PhD
Chairman & CFO
Kitware Inc.
28 Corporate Drive
Clifton Park NY 12065
ken.martin at kitware.com
518 881-4901 (w)
518 371-4573 (f)

This communication, including all attachments, contains confidential and
legally privileged information, and it is intended only for the use of the
addressee.  Access to this email by anyone else is unauthorized. If you
are not the intended recipient, any disclosure, copying, distribution or
any action taken in reliance on it is prohibited and may be unlawful. If
you received this communication in error please notify us immediately and
destroy the original message.  Thank you.


-----Original Message-----
From: vtk-developers [mailto:vtk-developers-bounces at vtk.org] On Behalf Of
David Gobbi
Sent: Thursday, September 4, 2014 7:33 PM
To: VTK Developers
Subject: [vtk-developers] Bug in scalar color mapping?

I've run into very odd behavior when I use Ambient and Diffuse
coefficients in combination with vtkDataSetMapper.  This is with VTK
master.

My property is set up like this, with AmbientColor="red" and
DiffuseColor="green".

  property->SetAmbient(0.51);
  property->SetDiffuse(0.49);
  property->SetAmbientColor(1.0, 0.0, 0.0);
  property->SetDiffuseColor(0.0, 1.0, 0.0);

My mapper, however, is set to MapScalars, so it should ignore the
AmbientColor and the DiffuseColor, and use the scalars instead:

  mapper->SetColorModeToMapScalars();
  mapper->SetLookupTable(table);
  mapper->UseLookupTableScalarRangeOn();

The lookup table is a simple greyscale lookup table, and my polydata has
scalars.  So I would expect my data to be rendered in greyscale.
But it's not, it's rendered mint green!  See the left side of the attached
image.

I tried a different scalar mapping pathway:

  mapper->InterpolateScalarsBeforeMappingOn();

The result was totally different, now it's greyscale with ambient
lighting, instead of the mix of ambient and diffuse lighting that I
requested (see right of attached image).


If I slightly modify the ambient and diffuse coefficients, the result is,
once again, completely unexpected:

  property->SetAmbient(0.49);  // was 0.51
  property->SetDiffuse(0.51);  // was 0.49

Now everything is red.  In the second attached image, the left shows
InterpolateScalarsBeforeMappingOff() and the right shows On().


Anyone know what is going on here?  Everything behaves just find if I set
either the Ambient or the Diffuse coefficient to zero.  But when I use
them together, VTK goes crazy.

 - David



More information about the vtk-developers mailing list