|
|
@@ -1,9 +1,30 @@
|
|
|
#include "rasterizer.h"
|
|
|
#include "vector"
|
|
|
#include "array"
|
|
|
-
|
|
|
#include <algorithm>
|
|
|
|
|
|
+//Gamma correction lookup table
|
|
|
+const int Rasterizer::gammaTable[256] = {0, 21, 28, 34, 39, 43, 46,
|
|
|
+ 50, 53, 56, 59, 61, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84,
|
|
|
+ 85, 87, 89, 90, 92, 93, 95, 96, 98, 99, 101, 102, 103, 105, 106,
|
|
|
+ 107, 109, 110, 111, 112, 114, 115, 116, 117, 118, 119, 120, 122,
|
|
|
+ 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,
|
|
|
+ 136, 137, 138, 139, 140, 141, 142, 143, 144, 144, 145, 146, 147,
|
|
|
+ 148, 149, 150, 151, 151, 152, 153, 154, 155, 156, 156, 157, 158,
|
|
|
+ 159, 160, 160, 161, 162, 163, 164, 164, 165, 166, 167, 167, 168,
|
|
|
+ 169, 170, 170, 171, 172, 173, 173, 174, 175, 175, 176, 177, 178,
|
|
|
+ 178, 179, 180, 180, 181, 182, 182, 183, 184, 184, 185, 186, 186,
|
|
|
+ 187, 188, 188, 189, 190, 190, 191, 192, 192, 193, 194, 194, 195,
|
|
|
+ 195, 196, 197, 197, 198, 199, 199, 200, 200, 201, 202, 202, 203,
|
|
|
+ 203, 204, 205, 205, 206, 206, 207, 207, 208, 209, 209, 210, 210,
|
|
|
+ 211, 212, 212, 213, 213, 214, 214, 215, 215, 216, 217, 217, 218,
|
|
|
+ 218, 219, 219, 220, 220, 221, 221, 222, 223, 223, 224, 224, 225,
|
|
|
+ 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231,
|
|
|
+ 232, 232, 233, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238,
|
|
|
+ 238, 239, 239, 240, 240, 241, 241, 242, 242, 243, 243, 244, 244,
|
|
|
+ 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, 249, 250, 250,
|
|
|
+ 251, 251, 252, 252, 253, 253, 254, 254, 255, 255};
|
|
|
+
|
|
|
//Initializing all the basic colors
|
|
|
const SDL_PixelFormat* Rasterizer::mappingFormat( SDL_AllocFormat(PIXEL_FORMAT));
|
|
|
const Uint32 Rasterizer::white(SDL_MapRGBA(mappingFormat, 0xFF,0xFF,0xFF,0xFF));
|
|
|
@@ -140,9 +161,9 @@ void Rasterizer::drawTriangles(Vector3f *vertices, IShader &shader, Buffer<Uint3
|
|
|
rgbVals = shader.fragment(uPers , vPers);
|
|
|
//Update pixel buffer with clamped values
|
|
|
(*pixelBuffer)(x,y) = SDL_MapRGB(mappingFormat,
|
|
|
- clamp(gammaAdjust(rgbVals.data[0]), 0, 255.0f), //
|
|
|
- clamp(gammaAdjust(rgbVals.data[1]), 0, 255.0f),//
|
|
|
- clamp(gammaAdjust(rgbVals.data[2]), 0, 255.0f));//
|
|
|
+ gammaAdjust(rgbVals.data[0]), //
|
|
|
+ gammaAdjust(rgbVals.data[1]),//
|
|
|
+ gammaAdjust(rgbVals.data[2]));//
|
|
|
//(*pixelBuffer)(x,y) = SDL_MapRGB(mappingFormat,0xFF, 0xFF, 0xFF);
|
|
|
}
|
|
|
}
|
|
|
@@ -167,7 +188,6 @@ void Rasterizer::viewportTransform(Buffer<Uint32> *pixelBuffer, Vector3f *vertic
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
void Rasterizer::triBoundBox(int &xMax, int &xMin, int &yMax, int &yMin,Vector3f *vertices, Buffer<Uint32> *pixelBuffer){
|
|
|
// xMax = std::ceil(std::max({vertices[0].x, vertices[1].x, vertices[2].x}));
|
|
|
//xMin = std::ceil(std::min({vertices[0].x, vertices[1].x, vertices[2].x}));
|
|
|
@@ -187,7 +207,6 @@ void Rasterizer::triBoundBox(int &xMax, int &xMin, int &yMax, int &yMin,Vector3f
|
|
|
yMin = std::max(yMin, 0);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
float Rasterizer::edge(Vector3f &a, Vector3f &b, Vector3f &c){
|
|
|
return (b.x - a.x)*(c.y - a.y) - (b.y - a.y)*(c.x - a.x);
|
|
|
}
|
|
|
@@ -201,12 +220,11 @@ bool Rasterizer::inside(float e, float a, float b){
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
float Rasterizer::clamp(float n, float lower, float upper) {
|
|
|
return std::max(lower, std::min(n, upper));
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-float Rasterizer::gammaAdjust(float n) {
|
|
|
- return std::pow(n, 1.0/2.2)*255.0f;
|
|
|
+int Rasterizer::gammaAdjust(float n) {
|
|
|
+ int val = round(clamp(n*255, 0, 255));
|
|
|
+ return gammaTable[val];
|
|
|
}
|