- For built-in fragment shader outputs, a new field
use_default_depth
is added (defaultFalse
) instead of relying on checking ifgl_FragDepth
isNaN
. - Change
ZBuffer
value meaning to OpenGL convention: all values are non-negative, and the smaller the value, the closer the point is to the camera. - Change default
Shader.mixer
behaviour: now it picks the fragment with minimum depth valuegl_FragDepth
. - Change
shadow.py::Shadow.render_shadow_map
according to the z-value definition change, to add into the shadow map instead of subtracting so to move shadow maps further away from the "camera" (light). - Change
shaders/phong_reflection_shadow
according to the z-value definition change. - Transform shadow coordinates in VS (world => NDC) and FS (NDC => screen) instead of transforming in FS (model's screen => world => screen) to avoid precision loss in inverse matrix computation.
- Fix issue of perspective-correction barycentric interpolation in
pipeline
. - Fix
shaders/phong*
so normals are correctly transformed into pre-projection eye coordinates, rather than being projected. - Rename
ModelView
=>View
,model_view
=>view
,model_view_matrix
=>view_matrix
as the matrix is actually view matrix that transforms from world to eye space, not model view matrix (model to eye space).
- Change the default behaviour of
renderer/utils.py::transpose_for_display
which will flip vertically as well by default, so the origin of the resultant matrix will be (height, width, channels) and with the origin located at the top-left corner. The previous behaviour can be achieved by settingflip_vertical=False
. Scene.add_cube
now accepts one number fortexture_scaling
to scale texture map equally in both x and y directions.- Fix some assert message issues (in
Scene.add_cube
). CameraParameters
now acceptsposition
,target
andup
in Python's tuples of floats as well, along withjnp.array
.Scene.set_object_orientation
andScene.set_object_local_scaling
supports tuple of floats as well as inputs, additional tojnp.array
.Model
now has a convenient methodcreate
to create a Model with same face indices shared byfaces
,faces_norm
andfaces_uv
, and a defaultspecular_map
. This is useful for creating a mesh where all vertices has its own normal and uv coordinate specified, under same order (thus same face indices).- Correctly support Python Sequence for
utils.build_texture_from_PyTinyrenderer
as texture. quaternion
function to create an orientation from axis and angle, andquaternion_mul
to composite quaternion.rotation_matrix
function to create a rotation matrix from axis and angle. Also allowsScene
to set object orientation directly using rotation matrix.- Move
Renderer.merge_objects
intogeometry.py
, and expose in__init__.py
. batch_models
andRenderer.create_buffers
convenient method to facilitate batch rendering of multiple models.
- Change the ordering of quaternions (in
geometry.py
) to(w, x, y, z)
instead of(x, y, z, w)
to be consistent with the convention used inpytinyrenderer
andBRAX
. Reference: brax/math.py. - Fix: remove unnecessary
@staticmethod
decorator inmerge_objects
. - Changed the way that
Camera
is created inRenderer.create_camera_from_parameters
to force convert parameters intofloat
weak type. - Force convert
LightParameters
to JAX arrays inRenderer.get_camera_image
to avoid downstream errors. - Downgrade minimum Python version to
3.9
,numpy
version to1.22.0
,jax
andjaxlib
version to0.4.4
.
- Correctly force convert
LightParameters
to JAX arrays inRenderer.get_camera_image
to avoid downstream errors. - Fix
geometry.py::transform_matrix_from_rotation
. Also, change the order of quaternion to(w, x, y, z)
instead of(x, y, z, w)
for consistency. - Force convert
ShadowParameters
to JAX arrays inRenderer.get_camera_image
to avoid downstream errors.
- Instead of clipping (planned to be implemented), now the rasteriser interpolates in homogeneous space directly.
Shader.interpolate
will not receive validbarycentric_screen
values for now. SettingInterpolation.SMOOTH
andInterpolation.NOPERSPECTIVE
will result in same results, perspective-correct interpolations. - Reorganise example files and rename them.
- Refactor
Scene.set_object_*
methods to be a simple wrapper ofself._replace
andModelObject.replace_with_*
, to expose APIs ofModelObject
s and allows manipulation and rendering withoutScene
. - Expose
create_capsule
andcreate_cube
APIs.
- Fix
gl_FrontFacing
computation in pipeline so it is consistent to comment:True
if not back-facing (i.e. front-facing & side facing). - Add an extra stage
Shader.primitive_chooser
to choose which primitive to be rendered for each fragment. The default implementation is provided, which assumes that the depth is just the interpolatedz
value in the eye space. It just picks the values of the single primitive that is closest to the camera and is not discarded in the previous pipeline. - Expose
loop_unroll
static option to allow unrolling several operations (row rendering) within a single iteration of the out-most loop (iterating along first axis of the canvas). This may be useful in some cases for performance improvement, but careful benchmarking is needed to determine the optimal value. The default value is1
(no unrolling) as it is the most general case in larger canvases (benchmarked on960x540
using GPU T4 in Colab). - Bump the minimum Python version to Python 3.10
- Lower the minimum jax & jaxlib version to 0.3.25.
- Lower minimum Python version to 3.8
- Introducing
type_extensions
package and improved typing annotations.
- Bump minimum
jax
andjaxlib
version to 0.4.0 asjaxtyping
does not supportjax
0.3.25. - Bug fix: add
static_argnames
for utility functiontranspose_for_display
. - Change to isort + black code style.
- Migrate full codebase to be type-checked with pyright.
- Add smoke tests, and use GitHub Action as CI to run them.