diff options
author | Mai Lavelle <mai.lavelle@gmail.com> | 2016-04-11 23:49:09 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2016-04-12 00:12:11 +0300 |
commit | ebfdd7da83200f2890b28dd5ef9a0fc8c6ab9137 (patch) | |
tree | 8ccb1ad1af787ccf3d186b687324e4056f9665df /intern/cycles/render/camera.cpp | |
parent | 7d033717ad52bf92235e65224b6b3940de7ec473 (diff) |
Cycles microdisplacement: perform subdivision dicing in raster space
NOTE: this is only the first of many patches towards completing the subdivison
and displacement system in Cycles. These patches will be reviewed and committed
one by one over the coming weeks.
Reviewed By: brecht, sergey
Differential Revision: https://developer.blender.org/D1909
Diffstat (limited to 'intern/cycles/render/camera.cpp')
-rw-r--r-- | intern/cycles/render/camera.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp index 0e343822223..028916c1b8f 100644 --- a/intern/cycles/render/camera.cpp +++ b/intern/cycles/render/camera.cpp @@ -158,12 +158,15 @@ void Camera::update() /* ndc to raster */ Transform ndctoraster = transform_scale(width, height, 1.0f) * bordertofull; + Transform full_ndctoraster = transform_scale(full_width, full_height, 1.0f) * bordertofull; /* raster to screen */ Transform screentondc = fulltoborder * transform_from_viewplane(viewplane); Transform screentoraster = ndctoraster * screentondc; Transform rastertoscreen = transform_inverse(screentoraster); + Transform full_screentoraster = full_ndctoraster * screentondc; + Transform full_rastertoscreen = transform_inverse(full_screentoraster); /* screen to camera */ Transform cameratoscreen; @@ -177,6 +180,7 @@ void Camera::update() Transform screentocamera = transform_inverse(cameratoscreen); rastertocamera = screentocamera * rastertoscreen; + Transform full_rastertocamera = screentocamera * full_rastertoscreen; cameratoraster = screentoraster * cameratoscreen; cameratoworld = matrix; @@ -196,12 +200,18 @@ void Camera::update() if(type == CAMERA_ORTHOGRAPHIC) { dx = transform_direction(&rastertocamera, make_float3(1, 0, 0)); dy = transform_direction(&rastertocamera, make_float3(0, 1, 0)); + full_dx = transform_direction(&full_rastertocamera, make_float3(1, 0, 0)); + full_dy = transform_direction(&full_rastertocamera, make_float3(0, 1, 0)); } else if(type == CAMERA_PERSPECTIVE) { dx = transform_perspective(&rastertocamera, make_float3(1, 0, 0)) - transform_perspective(&rastertocamera, make_float3(0, 0, 0)); dy = transform_perspective(&rastertocamera, make_float3(0, 1, 0)) - transform_perspective(&rastertocamera, make_float3(0, 0, 0)); + full_dx = transform_perspective(&full_rastertocamera, make_float3(1, 0, 0)) - + transform_perspective(&full_rastertocamera, make_float3(0, 0, 0)); + full_dy = transform_perspective(&full_rastertocamera, make_float3(0, 1, 0)) - + transform_perspective(&full_rastertocamera, make_float3(0, 0, 0)); } else { dx = make_float3(0.0f, 0.0f, 0.0f); @@ -210,6 +220,8 @@ void Camera::update() dx = transform_direction(&cameratoworld, dx); dy = transform_direction(&cameratoworld, dy); + full_dx = transform_direction(&cameratoworld, full_dx); + full_dy = transform_direction(&cameratoworld, full_dy); /* TODO(sergey): Support other types of camera. */ if(type == CAMERA_PERSPECTIVE) { @@ -539,4 +551,32 @@ BoundBox Camera::viewplane_bounds_get() return bounds; } +float Camera::world_to_raster_size(float3 P) +{ + if(type == CAMERA_ORTHOGRAPHIC) { + return min(len(full_dx), len(full_dy)); + } + else if(type == CAMERA_PERSPECTIVE) { + /* Calculate as if point is directly ahead of the camera. */ + float3 raster = make_float3(0.5f*width, 0.5f*height, 0.0f); + float3 Pcamera = transform_perspective(&rastertocamera, raster); + + /* dDdx */ + float3 Ddiff = transform_direction(&cameratoworld, Pcamera); + float3 dx = len_squared(full_dx) < len_squared(full_dy) ? full_dx : full_dy; + float3 dDdx = normalize(Ddiff + dx) - normalize(Ddiff); + + /* dPdx */ + float dist = len(transform_point(&worldtocamera, P)); + float3 D = normalize(Ddiff); + return len(dist*dDdx - dot(dist*dDdx, D)*D); + } + else { + // TODO(mai): implement for CAMERA_PANORAMA + assert(!"pixel width calculation for panoramic projection not implemented yet"); + } + + return 1.0f; +} + CCL_NAMESPACE_END |