Skip to content

Commit c163673

Browse files
committed
gpu render demo, minor cleanup
1 parent ea46d92 commit c163673

File tree

2 files changed

+27
-23
lines changed

2 files changed

+27
-23
lines changed

examples/raymarch/run.cpp

+24-19
Original file line numberDiff line numberDiff line change
@@ -42,22 +42,28 @@ fn main(@builtin(global_invocation_id) GlobalInvocationID: vec3<u32>) {
4242
let p: vec3<f32> = vec3<f32>((x / f32(params.screenWidth)) - 0.5,
4343
(y / f32(params.screenHeight)) - 0.5,
4444
params.focalLength);
45-
let offset: f32 = sin(f32(params.time) / 1000) * 0.2;
45+
let offsetX: f32 = sin(f32(params.time) / 1000) * 0.2;
46+
let offsetY: f32 = cos(f32(params.time) / 1000) * 0.2;
4647
let offsetZ: f32 = cos(f32(params.time) / 1000) * 0.1;
47-
let c: vec3<f32> = vec3<f32>(params.sphereCenterX + offset, params.sphereCenterY, params.sphereCenterZ + offsetZ);
48+
let c: vec3<f32> = vec3<f32>(params.sphereCenterX + offsetX,
49+
params.sphereCenterY + offsetY,
50+
params.sphereCenterZ + offsetZ);
4851
let len: f32 = length(p);
4952
5053
let dir: vec3<f32> = vec3<f32>(p.x / len, p.y / len, p.z / len);
5154
52-
let maxIter: u32 = 20;
5355
let dist: f32 = 0.0;
5456
out[GlobalInvocationID.y * params.screenWidth + GlobalInvocationID.x] = 0.0;
57+
58+
let maxIter: u32 = 40;
59+
5560
for (var i: u32 = 0; i < maxIter; i++) {
56-
let step: f32 = sdf(p, c, params.sphereRadius);
57-
if (step < .001) {
61+
let dist: f32 = sdf(p, c, params.sphereRadius);
62+
if (abs(dist) < .001) {
5863
return;
5964
}
60-
out[GlobalInvocationID.y * params.screenWidth + GlobalInvocationID.x] += step;
65+
out[GlobalInvocationID.y * params.screenWidth + GlobalInvocationID.x] += dist;
66+
// TODO(avh) : march the ray - comment for now until we get the scaling right
6167
// p = p + dir * step;
6268
}
6369
@@ -74,7 +80,7 @@ std::uint32_t getCurrentTimeInMilliseconds() {
7480
int main(int argc, char **argv) {
7581

7682
constexpr size_t NROWS = 16;
77-
constexpr size_t NCOLS = 64;
83+
constexpr size_t NCOLS = 96;
7884

7985
std::array<float, NROWS * NCOLS> screen;
8086

@@ -96,7 +102,6 @@ int main(int argc, char **argv) {
96102
/* z */ 5.0,
97103
0};
98104

99-
100105
std::fill(begin(screen), end(screen), 0.0f);
101106

102107
GPUContext ctx = CreateContext();
@@ -107,36 +112,36 @@ int main(int argc, char **argv) {
107112
params.time = getCurrentTimeInMilliseconds() - zeroTime;
108113
Kernel render =
109114
CreateKernel(ctx, CreateShader(kSDF), {}, 0, devScreen, params);
110-
// ToGPU(ctx, &params, render.buffers[render.numBuffers - 1], sizeof(params));
115+
// ToGPU(ctx, &params, render.buffers[render.numBuffers - 1],
116+
// sizeof(params));
111117
DispatchKernel(ctx, render);
112118
Wait(ctx, render.future);
113119
ToCPU(ctx, devScreen, screen.data(), sizeof(screen));
114120

115-
// https://stackoverflow.com/questions/30097953/ascii-art-sorting-an-array-of-ascii-characters-by-brightness-levels-c-c
116-
117-
static const char intensity[] = " .:-=+*#%@";
118-
static const char intensityReversed[] = "@%#*+=-:. ";
121+
static const char intensity[] = "@%#*+=-:. ";
119122
// clear the screen
120123
printf("\033[2J");
121124

122-
fprintf(stdout, "%s", show<float, NROWS, NCOLS>(screen, "Raw values").c_str());
125+
fprintf(stdout, "%s",
126+
show<float, NROWS, NCOLS>(screen, "Raw values").c_str());
123127

124128
// normalize values
125129
float min = *std::min_element(screen.begin(), screen.end());
126130
float max = *std::max_element(screen.begin(), screen.end());
127-
// float min = 20.0;
128-
// float max = 100.0;
131+
// float min = 0.0;
132+
// float max = 5.0;
129133

130134
for (size_t i = 0; i < screen.size(); ++i) {
131135
screen[i] = (screen[i] - min) / (max - min);
132136
}
133-
fprintf(stdout, "%s", show<float, NROWS, NCOLS>(screen, "Normalized").c_str());
137+
fprintf(stdout, "%s",
138+
show<float, NROWS, NCOLS>(screen, "Normalized").c_str());
134139

135140
// index into intensity array
136141
std::array<char, NROWS *(NCOLS + 1)> raster;
137142
for (size_t i = 0; i < screen.size(); ++i) {
138-
raster[i] = intensityReversed[static_cast<size_t>(
139-
screen[i] * (sizeof(intensity) - 1))];
143+
raster[i] =
144+
intensity[static_cast<size_t>(screen[i] * (sizeof(intensity) - 1))];
140145
}
141146

142147
for (size_t row = 0; row < NROWS; ++row) {

gpu.h

+3-4
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ namespace gpu {
1919

2020
static Logger kGpuLog = {stdout, "", kInfo};
2121

22-
2322
#ifdef NDEBUG
2423
static constexpr bool kDebug = false;
2524
#else
@@ -503,8 +502,7 @@ void ToCPU(GPUContext &ctx, GPUTensor &tensor, std::array<float, N> data) {
503502
}
504503

505504
void ToGPU(GPUContext &ctx, const void *data, WGPUBuffer buffer, size_t size) {
506-
wgpuQueueWriteBuffer(ctx.queue, buffer, 0, data,
507-
size);
505+
wgpuQueueWriteBuffer(ctx.queue, buffer, 0, data, size);
508506
}
509507

510508
void ToGPU(GPUContext &ctx, const float *data, GPUTensor &tensor) {
@@ -695,7 +693,8 @@ Kernel CreateKernel(GPUContext &ctx, const ShaderCode &shader,
695693
nullptr);
696694
// log(kGpuLog, kInfo, "Dispatching workgroups for # threads %d", outN);
697695
// log(kGpuLog, kInfo, "Dispatching workgroup size %d", shader.wgSize);
698-
// log(kGpuLog, kInfo, "Dispatching # workgroups %d", (outN + shader.wgSize - 1) / shader.wgSize);
696+
// log(kGpuLog, kInfo, "Dispatching # workgroups %d", (outN + shader.wgSize
697+
// - 1) / shader.wgSize);
699698
wgpuComputePassEncoderDispatchWorkgroups(
700699
computePassEncoder, (outN + (shader.wgSize - 1)) / shader.wgSize, 1, 1);
701700
wgpuComputePassEncoderEnd(computePassEncoder);

0 commit comments

Comments
 (0)