From 440d9cdbeecc189c1a2d1277fb70facc18cbe8d9 Mon Sep 17 00:00:00 2001 From: ssloy Date: Sun, 25 Jan 2015 21:17:26 +0100 Subject: [PATCH] vertex shader stub --- geometry.cpp | 4 ---- geometry.h | 1 + main.cpp | 23 ++++++++++------------- model.cpp | 20 ++++++++++---------- model.h | 8 +++++--- our_gl.cpp | 42 +++++++++++++++--------------------------- our_gl.h | 15 ++++----------- 7 files changed, 45 insertions(+), 68 deletions(-) diff --git a/geometry.cpp b/geometry.cpp index 750652f7..a1ca2b0f 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -1,7 +1,4 @@ -#include #include -#include -#include #include "geometry.h" template <> Vec3::Vec3(Matrix m) : x(m[0][0]/m[3][0]), y(m[1][0]/m[3][0]), z(m[2][0]/m[3][0]) {} @@ -14,7 +11,6 @@ Matrix::Matrix(Vec3f v) : m(std::vector >(4, std::vector >(r, std::vector(c, 0.f))), rows(r), cols(c) { } int Matrix::nrows() { diff --git a/geometry.h b/geometry.h index ec2b85b3..dbff2008 100644 --- a/geometry.h +++ b/geometry.h @@ -3,6 +3,7 @@ #include #include +#include class Matrix; diff --git a/main.cpp b/main.cpp index 388cbbff..a9cc4444 100644 --- a/main.cpp +++ b/main.cpp @@ -1,8 +1,5 @@ #include -#include #include -#include -#include #include "tgaimage.h" #include "model.h" #include "geometry.h" @@ -16,24 +13,30 @@ Vec3f light_dir = Vec3f(1,1,1).normalize(); Vec3f eye(1,1,3); Vec3f center(0,0,0); - struct Shader : public IShader { virtual ~Shader() {} Vec2i varying_uv[3]; float varying_inty[3]; + virtual Vec3i vertex(int iface, int nthvert) { + varying_inty[nthvert] = model->normal(iface, nthvert)*light_dir; + varying_uv[nthvert] = model->uv(iface, nthvert); + Vec3f v = model->vert(iface, nthvert); + Vec3f gl_Position = Viewport*Projection*ModelView*Matrix(v); + return gl_Position; + } + virtual bool fragment(Vec3f bar, TGAColor &color) { Vec2i uv = varying_uv[0]*bar.x + varying_uv[1]*bar.y + varying_uv[2]*bar.z; // float inty = varying_inty[0]*bar.x + varying_inty[1]*bar.y + varying_inty[2]*bar.z; // inty = std::max(0.f, std::min(1.f, inty)); // color = model->diffuse(uv)*inty; - float inty = model->norm(uv)*light_dir; + float inty = model->normal(uv)*light_dir; color = model->diffuse(uv)*inty; return false; } }; - int main(int argc, char** argv) { if (2==argc) { model = new Model(argv[1]); @@ -48,15 +51,9 @@ int main(int argc, char** argv) { TGAImage image(width, height, TGAImage::RGB); Shader shader; for (int i=0; infaces(); i++) { - std::vector face = model->face(i); Vec3i screen_coords[3]; - Vec3f world_coords[3]; for (int j=0; j<3; j++) { - Vec3f v = model->vert(face[j]); - screen_coords[j] = Vec3f(Viewport*Projection*ModelView*Matrix(v)); - world_coords[j] = v; - shader.varying_inty[j] = model->norm(i, j)*light_dir; - shader.varying_uv[j] = model->uv(i, j); + screen_coords[j] = shader.vertex(i, j); } triangle(screen_coords, shader, image, zbuffer); } diff --git a/model.cpp b/model.cpp index 80896004..b5b2147e 100644 --- a/model.cpp +++ b/model.cpp @@ -1,8 +1,6 @@ #include -#include #include #include -#include #include "model.h" Model::Model(const char *filename) : verts_(), faces_(), norms_(), uv_(), diffusemap_(), normalmap_() { @@ -45,8 +43,7 @@ Model::Model(const char *filename) : verts_(), faces_(), norms_(), uv_(), diffus load_texture(filename, "_nm.tga", normalmap_); } -Model::~Model() { -} +Model::~Model() {} int Model::nverts() { return (int)verts_.size(); @@ -66,6 +63,10 @@ Vec3f Model::vert(int i) { return verts_[i]; } +Vec3f Model::vert(int iface, int nthvert) { + return verts_[faces_[iface][nthvert][0]]; +} + void Model::load_texture(std::string filename, const char *suffix, TGAImage &img) { std::string texfile(filename); size_t dot = texfile.find_last_of("."); @@ -80,7 +81,7 @@ TGAColor Model::diffuse(Vec2i uv) { return diffusemap_.get(uv.x, uv.y); } -Vec3f Model::norm(Vec2i uv) { +Vec3f Model::normal(Vec2i uv) { TGAColor c = normalmap_.get(uv.x, uv.y); Vec3f res; for (int i=0; i<3; i++) @@ -88,14 +89,13 @@ Vec3f Model::norm(Vec2i uv) { return res; } -Vec2i Model::uv(int iface, int nvert) { - int idx = faces_[iface][nvert][1]; +Vec2i Model::uv(int iface, int nthvert) { + int idx = faces_[iface][nthvert][1]; return Vec2i(uv_[idx].x*diffusemap_.get_width(), uv_[idx].y*diffusemap_.get_height()); } -Vec3f Model::norm(int iface, int nvert) { - int idx = faces_[iface][nvert][2]; +Vec3f Model::normal(int iface, int nthvert) { + int idx = faces_[iface][nthvert][2]; return norms_[idx].normalize(); } - diff --git a/model.h b/model.h index 0a702e66..e89647ea 100644 --- a/model.h +++ b/model.h @@ -2,6 +2,7 @@ #define __MODEL_H__ #include +#include #include "geometry.h" #include "tgaimage.h" @@ -19,10 +20,11 @@ class Model { ~Model(); int nverts(); int nfaces(); - Vec3f norm(int iface, int nvert); - Vec3f norm(Vec2i uv); + Vec3f normal(int iface, int nthvert); + Vec3f normal(Vec2i uv); Vec3f vert(int i); - Vec2i uv(int iface, int nvert); + Vec3f vert(int iface, int nthvert); + Vec2i uv(int iface, int nthvert); TGAColor diffuse(Vec2i uv); std::vector face(int idx); }; diff --git a/our_gl.cpp b/our_gl.cpp index dd8eb8ff..666d9fbc 100644 --- a/our_gl.cpp +++ b/our_gl.cpp @@ -1,49 +1,37 @@ -#include -#include -#include #include #include -#include "tgaimage.h" -#include "model.h" -#include "geometry.h" #include "our_gl.h" Matrix ModelView; Matrix Viewport; Matrix Projection; -Matrix viewport(int x, int y, int w, int h) { - Matrix m = Matrix::identity(4); - m[0][3] = x+w/2.f; - m[1][3] = y+h/2.f; - m[2][3] = 255.f/2.f; - - m[0][0] = w/2.f; - m[1][1] = h/2.f; - m[2][2] = 255.f/2.f; - Viewport = m; - return m; +void viewport(int x, int y, int w, int h) { + Viewport = Matrix::identity(4); + Viewport[0][3] = x+w/2.f; + Viewport[1][3] = y+h/2.f; + Viewport[2][3] = 255.f/2.f; + Viewport[0][0] = w/2.f; + Viewport[1][1] = h/2.f; + Viewport[2][2] = 255.f/2.f; } -Matrix projection(float coeff) { +void projection(float coeff) { Projection = Matrix::identity(4); Projection[3][2] = coeff; - return Projection; } -Matrix lookat(Vec3f eye, Vec3f center, Vec3f up) { +void lookat(Vec3f eye, Vec3f center, Vec3f up) { Vec3f z = (eye-center).normalize(); Vec3f x = (up^z).normalize(); Vec3f y = (z^x).normalize(); - Matrix res = Matrix::identity(4); + ModelView = Matrix::identity(4); for (int i=0; i<3; i++) { - res[0][i] = x[i]; - res[1][i] = y[i]; - res[2][i] = z[i]; - res[i][3] = -center[i]; + ModelView[0][i] = x[i]; + ModelView[1][i] = y[i]; + ModelView[2][i] = z[i]; + ModelView[i][3] = -center[i]; } - ModelView = res; - return res; } Vec3f barycentric(Vec3i A, Vec3i B, Vec3i C, Vec3i P) { diff --git a/our_gl.h b/our_gl.h index bf61d87f..3db8c1f1 100644 --- a/our_gl.h +++ b/our_gl.h @@ -1,30 +1,23 @@ #ifndef __OUR_GL_H__ #define __OUR_GL_H__ -#include -#include -#include -#include -#include #include "tgaimage.h" -#include "model.h" #include "geometry.h" -#include "our_gl.h" extern Matrix ModelView; extern Matrix Viewport; extern Matrix Projection; -Matrix viewport(int x, int y, int w, int h); -Matrix projection(float coeff=0.f); -Matrix lookat(Vec3f eye, Vec3f center, Vec3f up); +void viewport(int x, int y, int w, int h); +void projection(float coeff=0.f); // coeff = -1/c +void lookat(Vec3f eye, Vec3f center, Vec3f up); struct IShader { virtual ~IShader() {} + virtual Vec3i vertex(int iface, int nthvert) = 0; virtual bool fragment(Vec3f bar, TGAColor &color) = 0; }; void triangle(Vec3i *pts, IShader &shader, TGAImage &image, TGAImage &zbuffer); #endif //__OUR_GL_H__ -