Commit 90058b27 authored by Patrik Huber's avatar Patrik Huber

Updated documentation and function signature of render()

* texture is now correctly a boost::optional
parent c6a26593
...@@ -24,6 +24,12 @@ ...@@ -24,6 +24,12 @@
#include "opencv2/core/core.hpp" #include "opencv2/core/core.hpp"
#ifdef WIN32
#define BOOST_ALL_DYN_LINK // Link against the dynamic boost lib. Seems to be necessary because we use /MD, i.e. link to the dynamic CRT.
#define BOOST_ALL_NO_LIB // Don't use the automatic library linking by boost with VS2010 (#pragma ...). Instead, we specify everything in cmake.
#endif
#include "boost/optional.hpp"
/** /**
* Implementations of internal functions, not part of the * Implementations of internal functions, not part of the
* API we expose and not meant to be used by a user. * API we expose and not meant to be used by a user.
...@@ -461,8 +467,7 @@ void raster_triangle(TriangleToRasterize triangle, cv::Mat colourbuffer, cv::Mat ...@@ -461,8 +467,7 @@ void raster_triangle(TriangleToRasterize triangle, cv::Mat colourbuffer, cv::Mat
const int pixel_index_col = xi; const int pixel_index_col = xi;
const double z_affine = alpha*static_cast<double>(triangle.v0.position[2]) + beta*static_cast<double>(triangle.v1.position[2]) + gamma*static_cast<double>(triangle.v2.position[2]); const double z_affine = alpha*static_cast<double>(triangle.v0.position[2]) + beta*static_cast<double>(triangle.v1.position[2]) + gamma*static_cast<double>(triangle.v2.position[2]);
// The '<= 1.0' clips against the far-plane in NDC. We clip against the near-plane earlier.
// TODO: Use enable_far_clipping here.
bool draw = true; bool draw = true;
if (enable_far_clipping) if (enable_far_clipping)
{ {
...@@ -471,6 +476,7 @@ void raster_triangle(TriangleToRasterize triangle, cv::Mat colourbuffer, cv::Mat ...@@ -471,6 +476,7 @@ void raster_triangle(TriangleToRasterize triangle, cv::Mat colourbuffer, cv::Mat
draw = false; draw = false;
} }
} }
// The '<= 1.0' clips against the far-plane in NDC. We clip against the near-plane earlier.
//if (z_affine < depthbuffer.at<double>(pixelIndexRow, pixelIndexCol)/* && z_affine <= 1.0*/) // what to do in ortho case without n/f "squashing"? should we always squash? or a flag? //if (z_affine < depthbuffer.at<double>(pixelIndexRow, pixelIndexCol)/* && z_affine <= 1.0*/) // what to do in ortho case without n/f "squashing"? should we always squash? or a flag?
if (z_affine < depthbuffer.at<double>(pixel_index_row, pixel_index_col) && draw) if (z_affine < depthbuffer.at<double>(pixel_index_row, pixel_index_col) && draw)
{ {
...@@ -482,12 +488,12 @@ void raster_triangle(TriangleToRasterize triangle, cv::Mat colourbuffer, cv::Mat ...@@ -482,12 +488,12 @@ void raster_triangle(TriangleToRasterize triangle, cv::Mat colourbuffer, cv::Mat
gamma *= d*triangle.one_over_z2; gamma *= d*triangle.one_over_z2;
// attributes interpolation // attributes interpolation
Vec3f color_persp = alpha*triangle.v0.color + beta*triangle.v1.color + gamma*triangle.v2.color; Vec3f color_persp = alpha*triangle.v0.color + beta*triangle.v1.color + gamma*triangle.v2.color; // Note: color might be empty if we use texturing and the shape-only model - but it works nonetheless? I think I set the vertex-colour to 127 in the shape-only model.
Vec2f texcoords_persp = alpha*triangle.v0.texcoords + beta*triangle.v1.texcoords + gamma*triangle.v2.texcoords; Vec2f texcoords_persp = alpha*triangle.v0.texcoords + beta*triangle.v1.texcoords + gamma*triangle.v2.texcoords;
Vec3f pixel_color; Vec3f pixel_color;
// Pixel Shader: // Pixel Shader:
if (texture) { // We use texturing if (texture) { // We use texturing
// check if texture != NULL? // check if texture != NULL?
// partial derivatives (for mip-mapping) // partial derivatives (for mip-mapping)
const float u_over_z = -(triangle.alphaPlane.a*x + triangle.alphaPlane.b*y + triangle.alphaPlane.d) * triangle.one_over_alpha_c; const float u_over_z = -(triangle.alphaPlane.a*x + triangle.alphaPlane.b*y + triangle.alphaPlane.d) * triangle.one_over_alpha_c;
...@@ -512,7 +518,7 @@ void raster_triangle(TriangleToRasterize triangle, cv::Mat colourbuffer, cv::Mat ...@@ -512,7 +518,7 @@ void raster_triangle(TriangleToRasterize triangle, cv::Mat colourbuffer, cv::Mat
// other: color.mul(tex2D(texture, texCoord)); // other: color.mul(tex2D(texture, texCoord));
// Old note: for texturing, we load the texture as BGRA, so the colors get the wrong way in the next few lines... // Old note: for texturing, we load the texture as BGRA, so the colors get the wrong way in the next few lines...
} }
else { // We use vertex-coloring else { // We use vertex-coloring
// color_persp is in RGB // color_persp is in RGB
pixel_color = color_persp; pixel_color = color_persp;
} }
......
...@@ -120,13 +120,13 @@ namespace eos { ...@@ -120,13 +120,13 @@ namespace eos {
* @param[in] projection_matrix A 4x4 orthographic or perspective OpenGL projection matrix. * @param[in] projection_matrix A 4x4 orthographic or perspective OpenGL projection matrix.
* @param[in] viewport_width Screen width. * @param[in] viewport_width Screen width.
* @param[in] viewport_height Screen height. * @param[in] viewport_height Screen height.
* @param[in] texture An optional texture map (TODO: Not optional yet!). * @param[in] texture An optional texture map. If not given, vertex-colouring is used.
* @param[in] enable_backface_culling Whether the renderer should perform backface culling. If true, only draw triangles with vertices ordered CCW in screen-space. * @param[in] enable_backface_culling Whether the renderer should perform backface culling. If true, only draw triangles with vertices ordered CCW in screen-space.
* @param[in] enable_near_clipping Screen height. * @param[in] enable_near_clipping Whether vertices should be clipped against the near plane.
* @param[in] enable_far_clipping Screen height. * @param[in] enable_far_clipping Whether vertices should be clipped against the far plane.
* @return A pair with the colourbuffer as its first element and the depthbuffer as the second element. * @return A pair with the colourbuffer as its first element and the depthbuffer as the second element.
*/ */
std::pair<cv::Mat, cv::Mat> render(Mesh mesh, cv::Mat model_view_matrix, cv::Mat projection_matrix, int viewport_width, int viewport_height, const Texture& texture, bool enable_backface_culling = false, bool enable_near_clipping = true, bool enable_far_clipping = true) std::pair<cv::Mat, cv::Mat> render(Mesh mesh, cv::Mat model_view_matrix, cv::Mat projection_matrix, int viewport_width, int viewport_height, const boost::optional<Texture>& texture = boost::none, bool enable_backface_culling = false, bool enable_near_clipping = true, bool enable_far_clipping = true)
{ {
// Some internal documentation / old todos or notes: // Some internal documentation / old todos or notes:
// maybe change and pass depthBuffer as an optional arg (&?), because usually we never need it outside the renderer. Or maybe even a getDepthBuffer(). // maybe change and pass depthBuffer as an optional arg (&?), because usually we never need it outside the renderer. Or maybe even a getDepthBuffer().
...@@ -233,7 +233,6 @@ std::pair<cv::Mat, cv::Mat> render(Mesh mesh, cv::Mat model_view_matrix, cv::Mat ...@@ -233,7 +233,6 @@ std::pair<cv::Mat, cv::Mat> render(Mesh mesh, cv::Mat model_view_matrix, cv::Mat
} }
// Fragment/pixel shader: Colour the pixel values // Fragment/pixel shader: Colour the pixel values
// for every tri:
for (const auto& tri : triangles_to_raster) { for (const auto& tri : triangles_to_raster) {
detail::raster_triangle(tri, colourbuffer, depthbuffer, texture, enable_far_clipping); detail::raster_triangle(tri, colourbuffer, depthbuffer, texture, enable_far_clipping);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment