Skip to content

Commit d5621bc

Browse files
committed
Implement render regions
1 parent acc14eb commit d5621bc

File tree

4 files changed

+43
-32
lines changed

4 files changed

+43
-32
lines changed

src/main/java/dev/thatredox/chunkynative/opencl/renderer/OpenClPathTracingRenderer.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,17 +71,19 @@ public void render(DefaultRenderManager manager) throws InterruptedException {
7171
clCreateBuffer(context.context.context, CL_MEM_READ_ONLY, Sizeof.cl_int, null, null));
7272
ClMemory bufferSpp = new ClMemory(
7373
clCreateBuffer(context.context.context, CL_MEM_READ_ONLY, Sizeof.cl_int, null, null));
74-
ClIntBuffer clWidth = new ClIntBuffer(scene.canvasConfig.getWidth(), context.context);
75-
ClIntBuffer clHeight = new ClIntBuffer(scene.canvasConfig.getHeight(), context.context);
74+
ClIntBuffer clCanvasConfig = new ClIntBuffer(new int[] {
75+
scene.canvasConfig.getWidth(), scene.canvasConfig.getHeight(),
76+
scene.canvasConfig.getCropWidth(), scene.canvasConfig.getCropHeight(),
77+
scene.canvasConfig.getCropX(), scene.canvasConfig.getCropY()
78+
}, context.context);
7679
ClIntBuffer clRayDepth = new ClIntBuffer(scene.getRayDepth(), context.context);
7780

7881
try (ClCamera ignored1 = camera;
7982
ClMemory ignored2 = buffer;
8083
ClMemory ignored3 = randomSeed;
8184
ClMemory ignored4 = bufferSpp;
82-
ClIntBuffer ignored5 = clWidth;
83-
ClIntBuffer ignored6 = clHeight;
84-
ClIntBuffer ignored7 = clRayDepth) {
85+
ClIntBuffer ignored5 = clCanvasConfig;
86+
ClIntBuffer ignored6 = clRayDepth) {
8587

8688
// Generate initial camera rays
8789
camera.generate(renderLock, true);
@@ -131,8 +133,7 @@ public void render(DefaultRenderManager manager) throws InterruptedException {
131133

132134
clSetKernelArg(kernel, argIndex++, Sizeof.cl_mem, Pointer.to(randomSeed.get()));
133135
clSetKernelArg(kernel, argIndex++, Sizeof.cl_mem, Pointer.to(bufferSpp.get()));
134-
clSetKernelArg(kernel, argIndex++, Sizeof.cl_mem, Pointer.to(clWidth.get()));
135-
clSetKernelArg(kernel, argIndex++, Sizeof.cl_mem, Pointer.to(clHeight.get()));
136+
clSetKernelArg(kernel, argIndex++, Sizeof.cl_mem, Pointer.to(clCanvasConfig.get()));
136137
clSetKernelArg(kernel, argIndex++, Sizeof.cl_mem, Pointer.to(clRayDepth.get()));
137138
clSetKernelArg(kernel, argIndex++, Sizeof.cl_mem, Pointer.to(buffer.get()));
138139
clEnqueueNDRangeKernel(context.context.queue, kernel, 1, null,

src/main/java/dev/thatredox/chunkynative/opencl/renderer/OpenClPreviewRenderer.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,15 @@ public void render(DefaultRenderManager manager) throws InterruptedException {
5757
ClCamera camera = new ClCamera(scene, context.context);
5858
ClMemory buffer = new ClMemory(clCreateBuffer(context.context.context, CL_MEM_WRITE_ONLY,
5959
(long) Sizeof.cl_int * imageData.length, null, null));
60-
ClIntBuffer clWidth = new ClIntBuffer(scene.canvasConfig.getWidth(), context.context);
61-
ClIntBuffer clHeight = new ClIntBuffer(scene.canvasConfig.getHeight(), context.context);
60+
ClIntBuffer clCanvasConfig = new ClIntBuffer(new int[] {
61+
scene.canvasConfig.getWidth(), scene.canvasConfig.getHeight(),
62+
scene.canvasConfig.getCropWidth(), scene.canvasConfig.getCropHeight(),
63+
scene.canvasConfig.getCropX(), scene.canvasConfig.getCropY()
64+
}, context.context);
6265

6366
try (ClCamera ignored1 = camera;
6467
ClMemory ignored2 = buffer;
65-
ClIntBuffer ignored3 = clWidth;
66-
ClIntBuffer ignored4 = clHeight) {
68+
ClIntBuffer ignored3 = clCanvasConfig) {
6769

6870
// Generate the camera rays
6971
camera.generate(null, false);
@@ -92,8 +94,7 @@ public void render(DefaultRenderManager manager) throws InterruptedException {
9294
clSetKernelArg(kernel, argIndex++, Sizeof.cl_mem, Pointer.to(sceneLoader.getSky().skyIntensity.get()));
9395
clSetKernelArg(kernel, argIndex++, Sizeof.cl_mem, Pointer.to(sceneLoader.getSun().get()));
9496

95-
clSetKernelArg(kernel, argIndex++, Sizeof.cl_mem, Pointer.to(clWidth.get()));
96-
clSetKernelArg(kernel, argIndex++, Sizeof.cl_mem, Pointer.to(clHeight.get()));
97+
clSetKernelArg(kernel, argIndex++, Sizeof.cl_mem, Pointer.to(clCanvasConfig.get()));
9798
clSetKernelArg(kernel, argIndex++, Sizeof.cl_mem, Pointer.to(buffer.get()));
9899
clEnqueueNDRangeKernel(context.context.queue, kernel, 1, null,
99100
new long[]{imageData.length}, null, 0, null,

src/main/java/dev/thatredox/chunkynative/opencl/renderer/scene/ClCamera.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,15 @@ public void generate(Lock renderLock, boolean jitter) {
7575

7676
int width = scene.canvasConfig.getWidth();
7777
int height = scene.canvasConfig.getHeight();
78+
int fullWidth = scene.canvasConfig.getCropWidth();
79+
int fullHeight = scene.canvasConfig.getCropHeight();
80+
int cropX = scene.canvasConfig.getCropX();
81+
int cropY = scene.canvasConfig.getCropY();
7882

7983
float[] rays = new float[width * height * 3 * 2];
8084

81-
double halfWidth = width / (2.0 * height);
82-
double invHeight = 1.0 / height;
85+
double halfWidth = fullWidth / (2.0 * fullHeight);
86+
double invHeight = 1.0 / fullHeight;
8387

8488
Camera cam = scene.camera();
8589

@@ -92,7 +96,7 @@ public void generate(Lock renderLock, boolean jitter) {
9296
float ox = jitter ? random.nextFloat(): 0.5f;
9397
float oy = jitter ? random.nextFloat(): 0.5f;
9498

95-
cam.calcViewRay(ray, -halfWidth + (i + ox) * invHeight, -0.5 + (j + oy) * invHeight);
99+
cam.calcViewRay(ray, -halfWidth + (i + ox + cropX) * invHeight, -0.5 + (j + oy + cropY) * invHeight);
96100
ray.o.sub(scene.getOrigin());
97101

98102
System.arraycopy(Util.vector3ToFloat(ray.o), 0, rays, offset, 3);

src/main/opencl/kernel/include/rayTracer.c

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
Ray ray_to_camera(
1212
const __global int* projectorType,
1313
const __global float* cameraSettings,
14-
const __global int* width,
15-
const __global int* height,
14+
const __global int* canvasConfig,
1615
int gid,
1716
Random random
1817
) {
@@ -23,10 +22,17 @@ Ray ray_to_camera(
2322
float3 m2s = vload3(2, cameraSettings);
2423
float3 m3s = vload3(3, cameraSettings);
2524

26-
float halfWidth = (*width) / (2.0 * (*height));
27-
float invHeight = 1.0 / (*height);
28-
float x = -halfWidth + ((gid % (*width)) + Random_nextFloat(random)) * invHeight;
29-
float y = -0.5 + ((gid / (*width)) + Random_nextFloat(random)) * invHeight;
25+
int width = canvasConfig[0];
26+
int height = canvasConfig[1];
27+
int fullWidth = canvasConfig[2];
28+
int fullHeight = canvasConfig[3];
29+
int cropX = canvasConfig[4];
30+
int cropY = canvasConfig[5];
31+
32+
float halfWidth = fullWidth / (2.0 * fullHeight);
33+
float invHeight = 1.0 / fullHeight;
34+
float x = -halfWidth + ((gid % width) + Random_nextFloat(random) + cropX) * invHeight;
35+
float y = -0.5 + ((gid / width) + Random_nextFloat(random) + cropY) * invHeight;
3036

3137
switch (*projectorType) {
3238
case 0:
@@ -76,8 +82,7 @@ __kernel void render(
7682

7783
__global const int* randomSeed,
7884
__global const int* bufferSpp,
79-
__global const int* width,
80-
__global const int* height,
85+
__global const int* canvasConfig,
8186
__global const int* rayDepth,
8287
__global float* res
8388

@@ -97,7 +102,7 @@ __kernel void render(
97102
unsigned int randomState = *randomSeed + gid;
98103
Random random = &randomState;
99104
Random_nextState(random);
100-
Ray ray = ray_to_camera(projectorType, cameraSettings, width, height, gid, random);
105+
Ray ray = ray_to_camera(projectorType, cameraSettings, canvasConfig, gid, random);
101106

102107
ray.material = 0;
103108
ray.flags = 0;
@@ -158,17 +163,17 @@ __kernel void preview(
158163
__global const float* skyIntensity,
159164
__global const int* sunData,
160165

161-
__global const int* width,
162-
__global const int* height,
166+
__global const int* canvasConfig,
163167
__global int* res
164168
) {
165169
int gid = get_global_id(0);
166-
int px = gid % *width;
167-
int py = gid / *width;
170+
171+
int px = gid % canvasConfig[0] + canvasConfig[4];
172+
int py = gid / canvasConfig[0] + canvasConfig[5];
168173

169174
// Crosshairs?
170-
if ((px == *width / 2 && (py >= *height / 2 - 5 && py <= *height / 2 + 5)) ||
171-
(py == *height / 2 && (px >= *width / 2 - 5 && px <= *width / 2 + 5))) {
175+
if ((px == canvasConfig[2] / 2 && (py >= canvasConfig[3] / 2 - 5 && py <= canvasConfig[3] / 2 + 5)) ||
176+
(py == canvasConfig[3] / 2 && (px >= canvasConfig[2] / 2 - 5 && px <= canvasConfig[2] / 2 + 5))) {
172177
res[gid] = 0xFFFFFFFF;
173178
return;
174179
}
@@ -187,7 +192,7 @@ __kernel void preview(
187192
Random random = &randomState;
188193
Random_nextState(random);
189194

190-
Ray ray = ray_to_camera(projectorType, cameraSettings, width, height, gid, random);
195+
Ray ray = ray_to_camera(projectorType, cameraSettings, canvasConfig, gid, random);
191196

192197
IntersectionRecord record = IntersectionRecord_new();
193198
MaterialSample sample;

0 commit comments

Comments
 (0)