This is an article in a multipart series on the concepts of ray tracing. I am not sure where this will lead but I am open to suggestions. We will be creating code that will run inside Blender. Blender has ray tracing renderers of course but that is not the point: by reusing Python libraries and Blender's scene building capabilities we can concentrate on true ray tracing issues like shader models, lighting, etc.
I generally present stuff in a back-to-front manner: first an article with some (well commented) code and images of the results, then one or more articles discussing the concepts. The idea is that this encourages you to experiment and have a look at the code yourself before being introduced to theory. How well this works out we will see :-)
So far the series consists of the several articles labeled ray tracing concepts
I generally present stuff in a back-to-front manner: first an article with some (well commented) code and images of the results, then one or more articles discussing the concepts. The idea is that this encourages you to experiment and have a look at the code yourself before being introduced to theory. How well this works out we will see :-)
So far the series consists of the several articles labeled ray tracing concepts
Progress
The bits of code we show in this article have less to do with raytracing per se but do show off the options to indicate progress in Blender's RenderEngine class. Not only gives this some visual feedback when rendering takes long, it also gives the user the opportunity to cancel the process in mid-render.Code
First we change theray_trace()
function into a generator that returns the y-coordinate after every line. This is accomplished by the yield
statement. So now the function doesn't allocate a buffer itself but it takes a buf
argument.
def ray_trace(scene, width, height, depth, buf): ... identical code left out ... for y in range(height): yscreen = ((y-(height/2))/height) * aspectratio for x in range(width): xscreen = (x-(width/2))/width ... identical code left out ... yield yThe
render_scene()
is changed too: it allocates a suitable buffer and then iterates over every line in the render result as it gets rendered (line 9). It then calls the update_result()
function of RenderEngine
class to show on screen what is rendered so far (line 12). It also calculates the percentage that has been completed and signals that as well (line 14).
def render_scene(self, scene): height, width = self.size_y, self.size_x buf = np.ones(width*height*4) buf.shape = height,width,4 result = self.begin_result(0, 0, self.size_x, self.size_y) layer = result.layers[0].passes["Combined"] for y in ray_trace(scene, width, height, 1, buf): buf.shape = -1,4 layer.rect = buf.tolist() self.update_result(result) buf.shape = height,width,4 self.update_progress(y/height) self.end_result(result)
No comments:
Post a Comment