Hi all,
I have the following code:
class BaseLight
{
public:
__device__ virtual float3 Illuminate(
const float3 &aReceivingPosition,
const float2 &aRndTuple,
float3 &oDirectionToLight,
float &oDistance,
float &oDirectPdfW,
float *oEmissionPdfW,
float *oCosAtLight) const { return make_float3(0, 0, 0); };
__device__ virtual float3 Emit(
const SceneSphere &aSceneSphere,
const float2 &aDirRndTuple,
const float2 &aPosRndTuple,
float3 &oPosition,
float3 &oDirection,
float &oEmissionPdfW,
float *oDirectPdfA,
float *oCosThetaLight) const { return make_float3(0, 0, 0); };
__device__ virtual float3 GetRadiance(
const float3 &aRayDirection,
const float3 &aHitPoint,
float *oDirectPdfA,
float *oEmissionPdfW) const { return make_float3(0, 0, 0); };
// Whether the light has a finite extent (area, point) or not (directional, env. map)
__device__ virtual bool IsFinite() const { return false; };
// Whether the light has delta function (point, directional) or not (area)
__device__ virtual bool IsDelta() const { return false; };
};
class BackgroundLight : public BaseLight
{
public:
__device__ BackgroundLight() : BaseLight()
{
}
__device__ void Setup(
const SceneSphere &sp,
const float3 &backEmission)
{
...
}
__device__ float3 Illuminate(
const float3 &aReceivingPosition,
const float2 &aRndTuple,
float3 &oDirectionToLight,
float &oDistance,
float &oDirectPdfW,
float *oEmissionPdfW,
float *oCosAtLight) const
{
...
}
__device__ float3 Emit(
const SceneSphere &aSceneSphere,
const float2 &aDirRndTuple,
const float2 &aPosRndTuple,
float3 &oPosition,
float3 &oDirection,
float &oEmissionPdfW,
float *oDirectPdfA,
float *oCosThetaLight) const
{
...
}
__device__ float3 GetRadiance(
const float3 &aRayDirection,
const float3 &aHitPoint,
float *oDirectPdfA,
float *oEmissionPdfW) const
{
...
}
// Whether the light has a finite extent (area, point) or not (directional, env. map)
__device__ bool IsFinite() const { return false; }
// Whether the light has delta function (point, directional) or not (area)
__device__ bool IsDelta() const { return false; }
public:
float3 mBackgroundColor;
float mInvSceneRadiusSqr;
};
class AreaLight : public BaseLight
{
public:
__device__ AreaLight() : BaseLight()
{
}
__device__ void Setup(
const float3 &aP0,
const float3 &aP1,
const float3 &aP2,
const float3 &it)
{
...
}
__device__ float3 Illuminate(
const float3 &aReceivingPosition,
const float2 &aRndTuple,
float3 &oDirectionToLight,
float &oDistance,
float &oDirectPdfW,
float *oEmissionPdfW,
float *oCosAtLight) const
{
...
}
__device__ float3 Emit(
const SceneSphere &aSceneSphere,
const float2 &aDirRndTuple,
const float2 &aPosRndTuple,
float3 &oPosition,
float3 &oDirection,
float &oEmissionPdfW,
float *oDirectPdfA,
float *oCosThetaLight) const
{
...
}
__device__ float3 GetRadiance(
const float3 &aRayDirection,
const float3 &aHitPoint,
float *oDirectPdfA,
float *oEmissionPdfW) const
{
...
}
// Whether the light has a finite extent (area, point) or not (directional, env. map)
__device__ bool IsFinite() const { return true; }
// Whether the light has delta function (point, directional) or not (area)
__device__ bool IsDelta() const { return false; }
public:
float3 p0, e1, e2;
float3 mIntensity;
float mInvArea;
};
Basically I have an array of lights passed from host (called ‘lightBuffer’). Every element of that array can be a background light or an area light. They have different data, but same interface (Emit, GetRadiance and Illuminate).
I use the previous code as follow:
BackgroundLight bl;
TriLight tl;
BaseLight *light;
if (lightBuffer[lightIx].isBackground)
{
bl.Setup(mSceneSphere, lightBuffer[lightIx].emission);
light = &bl;
}
else
{
tl.Setup(lightBuffer[lightIx].v[0], lightBuffer[lightIx].v[1], lightBuffer[lightIx].v[2], lightBuffer[lightIx].emission);
light = &tl;
}
float emissionPdfW, directPdfW, cosLight;
oLightState.mThroughput = light->Emit(mSceneSphere, rndDirSamples, rndPosSamples,
oLightState.mOrigin, oLightState.mDirection,
emissionPdfW, &directPdfW, &cosLight);
I obtain the following error at runtime (no error at compile time):
OptiX Error: Parse error (Details: Function "_rtProgramCreateFromPTXFile" caught
exception: ./debug/pinhole_camera.cu.ptx: error: Cannot find function "%r403" in PTX [4850039])
If I remove all the virtual keywords from BaseLight, it works (but the methods return always zero).
What I wrong?
Thanks in advance,
- AGPX
(Cuda 5.0.35.3, Optix 3.0.1).