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::Ray<vtkm::Float32> Rays;
|
||||
bool CompositeBackground;
|
||||
bool Shade;
|
||||
VTKM_CONT
|
||||
InternalsType()
|
||||
: Canvas(nullptr)
|
||||
, 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.SetColorMap(this->ColorMap);
|
||||
this->Internals->Tracer.SetShadingOn(this->Internals->Shade);
|
||||
this->Internals->Tracer.Render(this->Internals->Rays);
|
||||
|
||||
timer.Reset();
|
||||
@ -150,6 +153,11 @@ void MapperRayTracer::SetCompositeBackground(bool on)
|
||||
this->Internals->CompositeBackground = on;
|
||||
}
|
||||
|
||||
void MapperRayTracer::SetShadingOn(bool on)
|
||||
{
|
||||
this->Internals->Shade = on;
|
||||
}
|
||||
|
||||
void MapperRayTracer::StartScene()
|
||||
{
|
||||
// Nothing needs to be done.
|
||||
|
@ -52,6 +52,7 @@ public:
|
||||
virtual void EndScene() override;
|
||||
void SetCompositeBackground(bool on);
|
||||
vtkm::rendering::Mapper* NewCopy() const override;
|
||||
void SetShadingOn(bool on);
|
||||
|
||||
private:
|
||||
struct InternalsType;
|
||||
|
@ -775,11 +775,11 @@ public:
|
||||
while (enterDistance <= currentDistance && currentDistance <= exitDistance)
|
||||
{
|
||||
//composite
|
||||
sampleColor[3] *= (1.f - color[3]);
|
||||
color[0] = color[0] + sampleColor[0] * sampleColor[3];
|
||||
color[1] = color[1] + sampleColor[1] * sampleColor[3];
|
||||
color[2] = color[2] + sampleColor[2] * sampleColor[3];
|
||||
color[3] = sampleColor[3] + color[3];
|
||||
vtkm::Float32 alpha = sampleColor[3] * (1.f - color[3]);
|
||||
color[0] = color[0] + sampleColor[0] * alpha;
|
||||
color[1] = color[1] + sampleColor[1] * alpha;
|
||||
color[2] = color[2] + sampleColor[2] * alpha;
|
||||
color[3] = alpha + color[3];
|
||||
|
||||
if (color[3] > 1.)
|
||||
{
|
||||
|
@ -44,7 +44,7 @@ namespace detail
|
||||
class SurfaceColor
|
||||
{
|
||||
public:
|
||||
class MapScalarToColor : public vtkm::worklet::WorkletMapField
|
||||
class Shade : public vtkm::worklet::WorkletMapField
|
||||
{
|
||||
private:
|
||||
vtkm::Vec<vtkm::Float32, 3> LightPosition;
|
||||
@ -57,9 +57,9 @@ public:
|
||||
|
||||
public:
|
||||
VTKM_CONT
|
||||
MapScalarToColor(const vtkm::Vec<vtkm::Float32, 3>& lightPosition,
|
||||
const vtkm::Vec<vtkm::Float32, 3>& cameraPosition,
|
||||
const vtkm::Vec<vtkm::Float32, 3>& lookAt)
|
||||
Shade(const vtkm::Vec<vtkm::Float32, 3>& lightPosition,
|
||||
const vtkm::Vec<vtkm::Float32, 3>& cameraPosition,
|
||||
const vtkm::Vec<vtkm::Float32, 3>& lookAt)
|
||||
: LightPosition(lightPosition)
|
||||
, CameraPosition(cameraPosition)
|
||||
, LookAt(lookAt)
|
||||
@ -139,24 +139,74 @@ public:
|
||||
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
|
||||
|
||||
template <typename Precision>
|
||||
VTKM_CONT void run(Ray<Precision>& rays,
|
||||
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
|
||||
vtkm::Vec<vtkm::Float32, 3> scale(2, 2, 2);
|
||||
vtkm::Vec<vtkm::Float32, 3> lightPosition = camera.GetPosition() + scale * camera.GetUp();
|
||||
vtkm::worklet::DispatcherMapField<MapScalarToColor>(
|
||||
MapScalarToColor(lightPosition, camera.GetPosition(), camera.GetLookAt()))
|
||||
.Invoke(rays.HitIdx,
|
||||
rays.Scalar,
|
||||
rays.Normal,
|
||||
rays.Intersection,
|
||||
rays.Buffers.at(0).Buffer,
|
||||
colorMap);
|
||||
if (shade)
|
||||
{
|
||||
// TODO: support light positions
|
||||
vtkm::Vec<vtkm::Float32, 3> scale(2, 2, 2);
|
||||
vtkm::Vec<vtkm::Float32, 3> lightPosition = camera.GetPosition() + scale * camera.GetUp();
|
||||
vtkm::worklet::DispatcherMapField<Shade>(
|
||||
Shade(lightPosition, camera.GetPosition(), camera.GetLookAt()))
|
||||
.Invoke(rays.HitIdx,
|
||||
rays.Scalar,
|
||||
rays.Normal,
|
||||
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
|
||||
|
||||
@ -164,6 +214,7 @@ public:
|
||||
|
||||
RayTracer::RayTracer()
|
||||
: NumberOfShapes(0)
|
||||
, Shade(true)
|
||||
{
|
||||
}
|
||||
|
||||
@ -205,6 +256,11 @@ void RayTracer::Render(Ray<vtkm::Float64>& rays)
|
||||
RenderOnDevice(rays);
|
||||
}
|
||||
|
||||
void RayTracer::SetShadingOn(bool on)
|
||||
{
|
||||
Shade = on;
|
||||
}
|
||||
|
||||
vtkm::Id RayTracer::GetNumberOfShapes() const
|
||||
{
|
||||
return NumberOfShapes;
|
||||
@ -253,7 +309,7 @@ void RayTracer::RenderOnDevice(Ray<Precision>& rays)
|
||||
|
||||
// Calculate the color at the intersection point
|
||||
detail::SurfaceColor surfaceColor;
|
||||
surfaceColor.run(rays, ColorMap, camera);
|
||||
surfaceColor.run(rays, ColorMap, camera, this->Shade);
|
||||
|
||||
time = timer.GetElapsedTime();
|
||||
logger->AddLogData("shade", time);
|
||||
|
@ -43,6 +43,7 @@ protected:
|
||||
vtkm::Id NumberOfShapes;
|
||||
vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::Float32, 4>> ColorMap;
|
||||
vtkm::Range ScalarRange;
|
||||
bool Shade;
|
||||
|
||||
template <typename Precision>
|
||||
void RenderOnDevice(Ray<Precision>& rays);
|
||||
@ -65,6 +66,9 @@ public:
|
||||
VTKM_CONT
|
||||
void SetColorMap(const vtkm::cont::ArrayHandle<vtkm::Vec<vtkm::Float32, 4>>& colorMap);
|
||||
|
||||
VTKM_CONT
|
||||
void SetShadingOn(bool on);
|
||||
|
||||
VTKM_CONT
|
||||
void Render(vtkm::rendering::raytracing::Ray<vtkm::Float32>& rays);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user