Merge topic 'shading_scalarRenderer'

35f15f49d Merge branch 'shading_scalarRenderer' of https://gitlab.kitware.com/nicolemarsaglia/vtk-m into shading_scalarRenderer
add81512d 64->32 float type
d77ba3b20 refactor
d399e5d38 change comment
5e361acea abmient -> ambient
0f0704a0b update to vtkm1.8

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: Nicole Marsaglia <marsaglia1@llnl.gov>
Merge-request: !2804
This commit is contained in:
Abhishek Yenpure 2022-09-14 00:34:22 +00:00 committed by Kitware Robot
commit 3ae5302c3d
3 changed files with 167 additions and 10 deletions

@ -138,7 +138,7 @@ ScalarRenderer::Result ScalarRenderer::Render(const vtkm::rendering::Camera& cam
}
}
this->Internals->Tracer.Render(rays, Internals->DefaultValue);
this->Internals->Tracer.Render(rays, Internals->DefaultValue, cam);
using ArrayF32 = vtkm::cont::ArrayHandle<vtkm::Float32>;
std::vector<ArrayF32> res;

@ -30,6 +30,141 @@ namespace raytracing
namespace detail
{
template <typename Precision>
class SurfaceShade
{
public:
class Shade : public vtkm::worklet::WorkletMapField
{
private:
vtkm::Vec3f_32 LightPosition;
vtkm::Vec3f_32 LightAmbient;
vtkm::Vec3f_32 LightDiffuse;
vtkm::Vec3f_32 LightSpecular;
vtkm::Float32 SpecularExponent;
vtkm::Vec3f_32 CameraPosition;
vtkm::Vec3f_32 LookAt;
Precision MissScalar;
public:
VTKM_CONT
Shade(const vtkm::Vec3f_32& lightPosition,
const vtkm::Vec3f_32& cameraPosition,
const vtkm::Vec3f_32& lookAt,
const Precision missScalar)
: LightPosition(lightPosition)
, CameraPosition(cameraPosition)
, LookAt(lookAt)
, MissScalar(missScalar)
{
//Set up some default lighting parameters for now
LightAmbient[0] = .5f;
LightAmbient[1] = .5f;
LightAmbient[2] = .5f;
LightDiffuse[0] = .7f;
LightDiffuse[1] = .7f;
LightDiffuse[2] = .7f;
LightSpecular[0] = .7f;
LightSpecular[1] = .7f;
LightSpecular[2] = .7f;
SpecularExponent = 20.f;
}
using ControlSignature = void(FieldIn, FieldIn, FieldIn, FieldOut);
using ExecutionSignature = void(_1, _2, _3, _4);
//using ExecutionSignature = void(_1, _2, _3, _4, WorkIndex);
//template <typename ShadePortalType, typename Precision>
VTKM_EXEC void operator()(const vtkm::Id& hitIdx,
const vtkm::Vec<Precision, 3>& normal,
const vtkm::Vec<Precision, 3>& intersection,
Precision& output) const //,
// const vtkm::Id& idx) const
{
if (hitIdx < 0)
{
output = MissScalar;
}
vtkm::Vec<Precision, 3> lightDir = LightPosition - intersection;
vtkm::Vec<Precision, 3> viewDir = CameraPosition - LookAt;
vtkm::Normalize(lightDir);
vtkm::Normalize(viewDir);
//Diffuse lighting
Precision cosTheta = vtkm::dot(normal, lightDir);
//clamp tp [0,1]
const Precision zero = 0.f;
const Precision one = 1.f;
cosTheta = vtkm::Min(vtkm::Max(cosTheta, zero), one);
//Specular lighting
vtkm::Vec<Precision, 3> reflect = 2.f * vtkm::dot(lightDir, normal) * normal - lightDir;
vtkm::Normalize(reflect);
Precision cosPhi = vtkm::dot(reflect, viewDir);
Precision specularConstant =
vtkm::Pow(vtkm::Max(cosPhi, zero), static_cast<Precision>(SpecularExponent));
Precision shade = vtkm::Min(
LightAmbient[0] + LightDiffuse[0] * cosTheta + LightSpecular[0] * specularConstant, one);
output = shade;
}
vtkm::Vec3f_32 GetDiffuse() { return LightDiffuse; }
vtkm::Vec3f_32 GetAmbient() { return LightAmbient; }
vtkm::Vec3f_32 GetSpecular() { return LightSpecular; }
vtkm::Float32 GetSpecularExponent() { return SpecularExponent; }
void SetDiffuse(vtkm::Vec3f_32 newDiffuse)
{
LightDiffuse[0] = newDiffuse[0];
LightDiffuse[1] = newDiffuse[1];
LightDiffuse[2] = newDiffuse[2];
}
void SetAmbient(vtkm::Vec3f_32 newAmbient)
{
LightAmbient[0] = newAmbient[0];
LightAmbient[1] = newAmbient[1];
LightAmbient[2] = newAmbient[2];
}
void SetSpecular(vtkm::Vec3f_32 newSpecular)
{
LightSpecular[0] = newSpecular[0];
LightSpecular[1] = newSpecular[1];
LightSpecular[2] = newSpecular[2];
}
void SetSpecularExponent(vtkm::Float32 newExponent) { SpecularExponent = newExponent; }
}; //class Shade
//template <typename Precision>
VTKM_CONT void run(Ray<Precision>& rays,
const vtkm::rendering::raytracing::Camera& camera,
const Precision missScalar,
vtkm::cont::ArrayHandle<Precision> shadings,
bool shade)
{
if (shade)
{
// TODO: support light positions
vtkm::Vec3f_32 scale(2, 2, 2);
vtkm::Vec3f_32 lightPosition = camera.GetPosition() + scale * camera.GetUp();
vtkm::worklet::DispatcherMapField<Shade>(
Shade(lightPosition, camera.GetPosition(), camera.GetLookAt(), missScalar))
.Invoke(rays.HitIdx, rays.Normal, rays.Intersection, shadings);
}
}
}; // class SurfaceShade
template <typename Precision>
class FilterDepth : public vtkm::worklet::WorkletMapField
{
@ -56,7 +191,7 @@ public:
scalar = value;
}
}; //class WriteBuffer
}; //class FilterDepth
template <typename Precision>
class WriteBuffer : public vtkm::worklet::WorkletMapField
@ -125,18 +260,24 @@ void ScalarRenderer::AddField(const vtkm::cont::Field& scalarField)
Fields.push_back(scalarField);
}
void ScalarRenderer::Render(Ray<vtkm::Float32>& rays, vtkm::Float32 missScalar)
void ScalarRenderer::Render(Ray<vtkm::Float32>& rays,
vtkm::Float32 missScalar,
vtkm::rendering::raytracing::Camera& cam)
{
RenderOnDevice(rays, missScalar);
RenderOnDevice(rays, missScalar, cam);
}
void ScalarRenderer::Render(Ray<vtkm::Float64>& rays, vtkm::Float64 missScalar)
void ScalarRenderer::Render(Ray<vtkm::Float64>& rays,
vtkm::Float64 missScalar,
vtkm::rendering::raytracing::Camera& cam)
{
RenderOnDevice(rays, missScalar);
RenderOnDevice(rays, missScalar, cam);
}
template <typename Precision>
void ScalarRenderer::RenderOnDevice(Ray<Precision>& rays, Precision missScalar)
void ScalarRenderer::RenderOnDevice(Ray<Precision>& rays,
Precision missScalar,
vtkm::rendering::raytracing::Camera& cam)
{
using Timer = vtkm::cont::Timer;
@ -175,6 +316,16 @@ void ScalarRenderer::RenderOnDevice(Ray<Precision>& rays, Precision missScalar)
AddBuffer(rays, missScalar, Fields[f].GetName());
}
const vtkm::Int32 numChannels = 1;
ChannelBuffer<Precision> buffer(numChannels, rays.NumRays);
detail::SurfaceShade<Precision> surfaceShade;
surfaceShade.run(rays, cam, missScalar, buffer.Buffer, true);
buffer.SetName("shading");
rays.Buffers.push_back(buffer);
vtkm::worklet::DispatcherMapField<detail::FilterDepth<Precision>>(
detail::FilterDepth<Precision>(missScalar))
.Invoke(rays.HitIdx, rays.Distance);

@ -32,7 +32,9 @@ protected:
bool IntersectorValid;
template <typename Precision>
void RenderOnDevice(Ray<Precision>& rays, Precision missScalar);
void RenderOnDevice(Ray<Precision>& rays,
Precision missScalar,
vtkm::rendering::raytracing::Camera& cam);
template <typename Precision>
void AddBuffer(Ray<Precision>& rays, Precision missScalar, const std::string name);
@ -53,10 +55,14 @@ public:
void AddField(const vtkm::cont::Field& scalarField);
VTKM_CONT
void Render(vtkm::rendering::raytracing::Ray<vtkm::Float32>& rays, vtkm::Float32 missScalar);
void Render(vtkm::rendering::raytracing::Ray<vtkm::Float32>& rays,
vtkm::Float32 missScalar,
vtkm::rendering::raytracing::Camera& cam);
VTKM_CONT
void Render(vtkm::rendering::raytracing::Ray<vtkm::Float64>& rays, vtkm::Float64 missScalar);
void Render(vtkm::rendering::raytracing::Ray<vtkm::Float64>& rays,
vtkm::Float64 missScalar,
vtkm::rendering::raytracing::Camera& cam);
}; //class RayTracer
}