Added sampling to volume sampling (for the sphere - but technically general)

This commit is contained in:
Martin Opat 2024-12-23 22:14:36 +01:00
parent dfeb8af49e
commit 3dc6c8e05f
1 changed files with 17 additions and 4 deletions

View File

@ -5,6 +5,7 @@
#include "linalg/linalg.h" #include "linalg/linalg.h"
// TODO: This is technically just for debugging, but if it is to be used outside of that, it should be a made into a proper class (I mean, just look at those functions below, it screams "add class attributes")
struct Sphere { struct Sphere {
Vec3 center; Vec3 center;
double radius; double radius;
@ -23,19 +24,18 @@ struct Sphere {
}; };
// A function to generate two concentric spherical shells // A function to generate two concentric spherical shells
__host__ void generateVolume(float* hostVolume, int volW, int volH, int volD) { __host__ void generateVolume(float* volumeData, int volW, int volH, int volD) {
int cx = volW / 2; int cx = volW / 2;
int cy = volH / 2; int cy = volH / 2;
int cz = volD / 2; int cz = volD / 2;
float maxRadius = static_cast<float>(volW) * 0.5f; float maxRadius = static_cast<float>(volW) * 0.5f;
// Let's define two shells: // Two shells
float shell1Inner = 0.2f * maxRadius; float shell1Inner = 0.2f * maxRadius;
float shell1Outer = 0.3f * maxRadius; float shell1Outer = 0.3f * maxRadius;
float shell2Inner = 0.4f * maxRadius; float shell2Inner = 0.4f * maxRadius;
float shell2Outer = 0.5f * maxRadius; float shell2Outer = 0.5f * maxRadius;
// Intensities
float shell1Intensity = 0.8f; float shell1Intensity = 0.8f;
float shell2Intensity = 0.6f; float shell2Intensity = 0.6f;
@ -74,8 +74,21 @@ __host__ void generateVolume(float* hostVolume, int volW, int volH, int volD) {
} }
if (intensity > 1.0f) intensity = 1.0f; if (intensity > 1.0f) intensity = 1.0f;
hostVolume[z * volW * volH + y * volW + x] = intensity; volumeData[z * volW * volH + y * volW + x] = intensity;
} }
} }
} }
} }
// Samples the voxel nearest to the given coordinates. TODO: Can be re-used in other places
__device__ float sampleVolumeNearest(float* volumeData, int volW, int volH, int volD, int vx, int vy, int vz) {
if (vx < 0) vx = 0;
if (vy < 0) vy = 0;
if (vz < 0) vz = 0;
if (vx >= volW) vx = volW - 1;
if (vy >= volH) vy = volH - 1;
if (vz >= volD) vz = volD - 1;
int idx = vz * volW * volH + vy * volD + vx;
return volumeData[idx];
}