mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-09-20 02:55:47 +00:00
Merge topic 'task/rendering_fixes'
09ed5871b adding switch for ray tracer shadning bc4d034f8 fixing compositing error Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !1420
This commit is contained in:
commit
49ebd5f505
@ -45,10 +45,12 @@ struct MapperRayTracer::InternalsType
|
|||||||
vtkm::rendering::raytracing::Camera RayCamera;
|
vtkm::rendering::raytracing::Camera RayCamera;
|
||||||
vtkm::rendering::raytracing::Ray<vtkm::Float32> Rays;
|
vtkm::rendering::raytracing::Ray<vtkm::Float32> Rays;
|
||||||
bool CompositeBackground;
|
bool CompositeBackground;
|
||||||
|
bool Shade;
|
||||||
VTKM_CONT
|
VTKM_CONT
|
||||||
InternalsType()
|
InternalsType()
|
||||||
: Canvas(nullptr)
|
: Canvas(nullptr)
|
||||||
, CompositeBackground(true)
|
, CompositeBackground(true)
|
||||||
|
, Shade(true)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -128,6 +130,7 @@ void MapperRayTracer::RenderCells(const vtkm::cont::DynamicCellSet& cellset,
|
|||||||
this->Internals->Tracer.SetField(scalarField, scalarRange);
|
this->Internals->Tracer.SetField(scalarField, scalarRange);
|
||||||
|
|
||||||
this->Internals->Tracer.SetColorMap(this->ColorMap);
|
this->Internals->Tracer.SetColorMap(this->ColorMap);
|
||||||
|
this->Internals->Tracer.SetShadingOn(this->Internals->Shade);
|
||||||
this->Internals->Tracer.Render(this->Internals->Rays);
|
this->Internals->Tracer.Render(this->Internals->Rays);
|
||||||
|
|
||||||
timer.Reset();
|
timer.Reset();
|
||||||
@ -150,6 +153,11 @@ void MapperRayTracer::SetCompositeBackground(bool on)
|
|||||||
this->Internals->CompositeBackground = on;
|
this->Internals->CompositeBackground = on;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MapperRayTracer::SetShadingOn(bool on)
|
||||||
|
{
|
||||||
|
this->Internals->Shade = on;
|
||||||
|
}
|
||||||
|
|
||||||
void MapperRayTracer::StartScene()
|
void MapperRayTracer::StartScene()
|
||||||
{
|
{
|
||||||
// Nothing needs to be done.
|
// Nothing needs to be done.
|
||||||
|
@ -52,6 +52,7 @@ public:
|
|||||||
virtual void EndScene() override;
|
virtual void EndScene() override;
|
||||||
void SetCompositeBackground(bool on);
|
void SetCompositeBackground(bool on);
|
||||||
vtkm::rendering::Mapper* NewCopy() const override;
|
vtkm::rendering::Mapper* NewCopy() const override;
|
||||||
|
void SetShadingOn(bool on);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct InternalsType;
|
struct InternalsType;
|
||||||
|
@ -775,11 +775,11 @@ public:
|
|||||||
while (enterDistance <= currentDistance && currentDistance <= exitDistance)
|
while (enterDistance <= currentDistance && currentDistance <= exitDistance)
|
||||||
{
|
{
|
||||||
//composite
|
//composite
|
||||||
sampleColor[3] *= (1.f - color[3]);
|
vtkm::Float32 alpha = sampleColor[3] * (1.f - color[3]);
|
||||||
color[0] = color[0] + sampleColor[0] * sampleColor[3];
|
color[0] = color[0] + sampleColor[0] * alpha;
|
||||||
color[1] = color[1] + sampleColor[1] * sampleColor[3];
|
color[1] = color[1] + sampleColor[1] * alpha;
|
||||||
color[2] = color[2] + sampleColor[2] * sampleColor[3];
|
color[2] = color[2] + sampleColor[2] * alpha;
|
||||||
color[3] = sampleColor[3] + color[3];
|
color[3] = alpha + color[3];
|
||||||
|
|
||||||
if (color[3] > 1.)
|
if (color[3] > 1.)
|
||||||
{
|
{
|
||||||
|
@ -44,7 +44,7 @@ namespace detail
|
|||||||
class SurfaceColor
|
class SurfaceColor
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
class MapScalarToColor : public vtkm::worklet::WorkletMapField
|
class Shade : public vtkm::worklet::WorkletMapField
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
vtkm::Vec<vtkm::Float32, 3> LightPosition;
|
vtkm::Vec<vtkm::Float32, 3> LightPosition;
|
||||||
@ -57,9 +57,9 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
VTKM_CONT
|
VTKM_CONT
|
||||||
MapScalarToColor(const vtkm::Vec<vtkm::Float32, 3>& lightPosition,
|
Shade(const vtkm::Vec<vtkm::Float32, 3>& lightPosition,
|
||||||
const vtkm::Vec<vtkm::Float32, 3>& cameraPosition,
|
const vtkm::Vec<vtkm::Float32, 3>& cameraPosition,
|
||||||
const vtkm::Vec<vtkm::Float32, 3>& lookAt)
|
const vtkm::Vec<vtkm::Float32, 3>& lookAt)
|
||||||
: LightPosition(lightPosition)
|
: LightPosition(lightPosition)
|
||||||
, CameraPosition(cameraPosition)
|
, CameraPosition(cameraPosition)
|
||||||
, LookAt(lookAt)
|
, LookAt(lookAt)
|
||||||
@ -139,24 +139,74 @@ public:
|
|||||||
colors.Set(offset + 3, color[3]);
|
colors.Set(offset + 3, color[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}; //class Shade
|
||||||
|
|
||||||
|
class MapScalarToColor : public vtkm::worklet::WorkletMapField
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
VTKM_CONT
|
||||||
|
MapScalarToColor() {}
|
||||||
|
|
||||||
|
using ControlSignature = void(FieldIn<>, FieldIn<>, WholeArrayInOut<>, WholeArrayIn<>);
|
||||||
|
using ExecutionSignature = void(_1, _2, _3, _4, WorkIndex);
|
||||||
|
|
||||||
|
template <typename ColorPortalType, typename Precision, typename ColorMapPortalType>
|
||||||
|
VTKM_EXEC void operator()(const vtkm::Id& hitIdx,
|
||||||
|
const Precision& scalar,
|
||||||
|
ColorPortalType& colors,
|
||||||
|
ColorMapPortalType colorMap,
|
||||||
|
const vtkm::Id& idx) const
|
||||||
|
{
|
||||||
|
|
||||||
|
if (hitIdx < 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vtkm::Vec<Precision, 4> color;
|
||||||
|
vtkm::Id offset = idx * 4;
|
||||||
|
|
||||||
|
vtkm::Int32 colorMapSize = static_cast<vtkm::Int32>(colorMap.GetNumberOfValues());
|
||||||
|
vtkm::Int32 colorIdx = vtkm::Int32(scalar * Precision(colorMapSize - 1));
|
||||||
|
|
||||||
|
// clamp color index
|
||||||
|
colorIdx = vtkm::Max(0, colorIdx);
|
||||||
|
colorIdx = vtkm::Min(colorMapSize - 1, colorIdx);
|
||||||
|
color = colorMap.Get(colorIdx);
|
||||||
|
|
||||||
|
colors.Set(offset + 0, color[0]);
|
||||||
|
colors.Set(offset + 1, color[1]);
|
||||||
|
colors.Set(offset + 2, color[2]);
|
||||||
|
colors.Set(offset + 3, color[3]);
|
||||||
|
}
|
||||||
|
|
||||||
}; //class MapScalarToColor
|
}; //class MapScalarToColor
|
||||||
|
|
||||||
template <typename Precision>
|
template <typename Precision>
|
||||||
VTKM_CONT void run(Ray<Precision>& rays,
|
VTKM_CONT void run(Ray<Precision>& rays,
|
||||||
vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::Float32, 4>>& colorMap,
|
vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::Float32, 4>>& colorMap,
|
||||||
const vtkm::rendering::raytracing::Camera& camera)
|
const vtkm::rendering::raytracing::Camera& camera,
|
||||||
|
bool shade)
|
||||||
{
|
{
|
||||||
// TODO: support light positions
|
if (shade)
|
||||||
vtkm::Vec<vtkm::Float32, 3> scale(2, 2, 2);
|
{
|
||||||
vtkm::Vec<vtkm::Float32, 3> lightPosition = camera.GetPosition() + scale * camera.GetUp();
|
// TODO: support light positions
|
||||||
vtkm::worklet::DispatcherMapField<MapScalarToColor>(
|
vtkm::Vec<vtkm::Float32, 3> scale(2, 2, 2);
|
||||||
MapScalarToColor(lightPosition, camera.GetPosition(), camera.GetLookAt()))
|
vtkm::Vec<vtkm::Float32, 3> lightPosition = camera.GetPosition() + scale * camera.GetUp();
|
||||||
.Invoke(rays.HitIdx,
|
vtkm::worklet::DispatcherMapField<Shade>(
|
||||||
rays.Scalar,
|
Shade(lightPosition, camera.GetPosition(), camera.GetLookAt()))
|
||||||
rays.Normal,
|
.Invoke(rays.HitIdx,
|
||||||
rays.Intersection,
|
rays.Scalar,
|
||||||
rays.Buffers.at(0).Buffer,
|
rays.Normal,
|
||||||
colorMap);
|
rays.Intersection,
|
||||||
|
rays.Buffers.at(0).Buffer,
|
||||||
|
colorMap);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vtkm::worklet::DispatcherMapField<MapScalarToColor>(MapScalarToColor())
|
||||||
|
.Invoke(rays.HitIdx, rays.Scalar, rays.Buffers.at(0).Buffer, colorMap);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}; // class SurfaceColor
|
}; // class SurfaceColor
|
||||||
|
|
||||||
@ -164,6 +214,7 @@ public:
|
|||||||
|
|
||||||
RayTracer::RayTracer()
|
RayTracer::RayTracer()
|
||||||
: NumberOfShapes(0)
|
: NumberOfShapes(0)
|
||||||
|
, Shade(true)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,6 +256,11 @@ void RayTracer::Render(Ray<vtkm::Float64>& rays)
|
|||||||
RenderOnDevice(rays);
|
RenderOnDevice(rays);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RayTracer::SetShadingOn(bool on)
|
||||||
|
{
|
||||||
|
Shade = on;
|
||||||
|
}
|
||||||
|
|
||||||
vtkm::Id RayTracer::GetNumberOfShapes() const
|
vtkm::Id RayTracer::GetNumberOfShapes() const
|
||||||
{
|
{
|
||||||
return NumberOfShapes;
|
return NumberOfShapes;
|
||||||
@ -253,7 +309,7 @@ void RayTracer::RenderOnDevice(Ray<Precision>& rays)
|
|||||||
|
|
||||||
// Calculate the color at the intersection point
|
// Calculate the color at the intersection point
|
||||||
detail::SurfaceColor surfaceColor;
|
detail::SurfaceColor surfaceColor;
|
||||||
surfaceColor.run(rays, ColorMap, camera);
|
surfaceColor.run(rays, ColorMap, camera, this->Shade);
|
||||||
|
|
||||||
time = timer.GetElapsedTime();
|
time = timer.GetElapsedTime();
|
||||||
logger->AddLogData("shade", time);
|
logger->AddLogData("shade", time);
|
||||||
|
@ -43,6 +43,7 @@ protected:
|
|||||||
vtkm::Id NumberOfShapes;
|
vtkm::Id NumberOfShapes;
|
||||||
vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::Float32, 4>> ColorMap;
|
vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::Float32, 4>> ColorMap;
|
||||||
vtkm::Range ScalarRange;
|
vtkm::Range ScalarRange;
|
||||||
|
bool Shade;
|
||||||
|
|
||||||
template <typename Precision>
|
template <typename Precision>
|
||||||
void RenderOnDevice(Ray<Precision>& rays);
|
void RenderOnDevice(Ray<Precision>& rays);
|
||||||
@ -65,6 +66,9 @@ public:
|
|||||||
VTKM_CONT
|
VTKM_CONT
|
||||||
void SetColorMap(const vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::Float32, 4>>& colorMap);
|
void SetColorMap(const vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::Float32, 4>>& colorMap);
|
||||||
|
|
||||||
|
VTKM_CONT
|
||||||
|
void SetShadingOn(bool on);
|
||||||
|
|
||||||
VTKM_CONT
|
VTKM_CONT
|
||||||
void Render(vtkm::rendering::raytracing::Ray<vtkm::Float32>& rays);
|
void Render(vtkm::rendering::raytracing::Ray<vtkm::Float32>& rays);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user