From 86188729c3e6eccd940e6bad7e1e83cea0247303 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Wed, 19 Oct 2016 13:32:31 -0400 Subject: [PATCH 01/37] nothing much --- src/rasterize.cu | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 4e3504b..212839c 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -48,12 +48,12 @@ namespace { TextureData* dev_diffuseTex = NULL; // int texWidth, texHeight; // ... - }; + }; // HELP: what is this struct for? struct Primitive { PrimitiveType primitiveType = Triangle; // C++ 11 init VertexOut v[3]; - }; + }; // HELP: since eyePos, etc. are the same across Vertices, why are they in ever VertexOut struct? struct Fragment { glm::vec3 color; @@ -67,7 +67,7 @@ namespace { // VertexAttributeTexcoord texcoord0; // TextureData* dev_diffuseTex; // ... - }; + }; // HELP: what exactly is a fragment? struct PrimitiveDevBufPointers { int primitiveMode; //from tinygltfloader macro @@ -92,7 +92,7 @@ namespace { VertexOut* dev_verticesOut; // TODO: add more attributes when needed - }; + }; // HELP: what is this doing? } @@ -146,7 +146,7 @@ void render(int w, int h, Fragment *fragmentBuffer, glm::vec3 *framebuffer) { // TODO: add your fragment shader code here } -} +} // HELP: what is the framebuffer? How do we decide what fragment colors get written? /** * Called once at the beginning of the program to allocate memory. @@ -165,7 +165,7 @@ void rasterizeInit(int w, int h) { cudaMalloc(&dev_depth, width * height * sizeof(int)); checkCUDAError("rasterizeInit"); -} +} // HELP: fragment vs. frame? __global__ void initDepth(int w, int h, int * depth) @@ -230,7 +230,7 @@ void _nodeMatrixTransform( position[vid] = glm::vec3(MV * glm::vec4(position[vid], 1.0f)); normal[vid] = glm::normalize(MV_normal * normal[vid]); } -} +} // HELP: What is MV? glm::mat4 getMatrixFromNodeMatrixVector(const tinygltf::Node & n) { @@ -290,7 +290,7 @@ void traverseNode ( for (; it != itEnd; ++it) { traverseNode(n2m, scene, *it, M); } -} +} // HELP: What is a node? void rasterizeSetBuffers(const tinygltf::Scene & scene) { @@ -655,13 +655,12 @@ void _primitiveAssembly(int numIndices, int curPrimitiveBeginId, Primitive* dev_ // TODO: uncomment the following code for a start // This is primitive assembly for triangles - //int pid; // id for cur primitives vector - //if (primitive.primitiveMode == TINYGLTF_MODE_TRIANGLES) { - // pid = iid / (int)primitive.primitiveType; - // dev_primitives[pid + curPrimitiveBeginId].v[iid % (int)primitive.primitiveType] - // = primitive.dev_verticesOut[primitive.dev_indices[iid]]; - //} - + int pid; + if (primitive.primitiveMode == TINYGLTF_MODE_TRIANGLES) { + pid = iid / (int)primitive.primitiveType; + dev_primitives[pid + curPrimitiveBeginId].v[iid % (int)primitive.primitiveType] + = primitive.dev_verticesOut[primitive.dev_indices[iid]]; + } // TODO: other primitive types (point, line) } From 1986b055a7824bcd1eeae2e37013c535a969acb8 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Wed, 19 Oct 2016 14:56:15 -0400 Subject: [PATCH 02/37] questions --- src/rasterize.cu | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 212839c..8ce9d52 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -48,7 +48,7 @@ namespace { TextureData* dev_diffuseTex = NULL; // int texWidth, texHeight; // ... - }; // HELP: what is this struct for? + }; // HELP: what is the difference between VertexIn and VertexOut? struct Primitive { PrimitiveType primitiveType = Triangle; // C++ 11 init @@ -92,7 +92,7 @@ namespace { VertexOut* dev_verticesOut; // TODO: add more attributes when needed - }; // HELP: what is this doing? + }; // HELP: What is this for? Different from Primitive? } @@ -146,7 +146,7 @@ void render(int w, int h, Fragment *fragmentBuffer, glm::vec3 *framebuffer) { // TODO: add your fragment shader code here } -} // HELP: what is the framebuffer? How do we decide what fragment colors get written? +} /** * Called once at the beginning of the program to allocate memory. @@ -165,7 +165,7 @@ void rasterizeInit(int w, int h) { cudaMalloc(&dev_depth, width * height * sizeof(int)); checkCUDAError("rasterizeInit"); -} // HELP: fragment vs. frame? +} __global__ void initDepth(int w, int h, int * depth) @@ -230,7 +230,7 @@ void _nodeMatrixTransform( position[vid] = glm::vec3(MV * glm::vec4(position[vid], 1.0f)); normal[vid] = glm::normalize(MV_normal * normal[vid]); } -} // HELP: What is MV? +} glm::mat4 getMatrixFromNodeMatrixVector(const tinygltf::Node & n) { @@ -290,7 +290,7 @@ void traverseNode ( for (; it != itEnd; ++it) { traverseNode(n2m, scene, *it, M); } -} // HELP: What is a node? +} void rasterizeSetBuffers(const tinygltf::Scene & scene) { @@ -307,6 +307,7 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { for (; it != itEnd; it++) { const std::string key = it->first; + const tinygltf::BufferView &bufferView = it->second; if (bufferView.target == 0) { continue; // Unsupported bufferView. @@ -635,7 +636,7 @@ void _vertexTransformAndAssembly( // Finally transform x and y to viewport space // TODO: Apply vertex assembly here - // Assemble all attribute arraies into the primitive array + // Assemble all attribute arrays into the primitive array } } @@ -657,8 +658,9 @@ void _primitiveAssembly(int numIndices, int curPrimitiveBeginId, Primitive* dev_ int pid; if (primitive.primitiveMode == TINYGLTF_MODE_TRIANGLES) { - pid = iid / (int)primitive.primitiveType; - dev_primitives[pid + curPrimitiveBeginId].v[iid % (int)primitive.primitiveType] + int num_vertices = 3; // a triangle has 3 vertices + pid = iid / num_vertices; // (int)primitive.primitiveType; + dev_primitives[pid + curPrimitiveBeginId].v[iid % num_vertices] // (int)primitive.primitiveType] = primitive.dev_verticesOut[primitive.dev_indices[iid]]; } @@ -682,6 +684,8 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g // (See README for rasterization pipeline outline.) // Vertex Process & primitive assembly + _vertexTransformAndAssembly(); // what args? + { curPrimitiveBeginId = 0; dim3 numThreadsPerBlock(128); From 5d70df0bb25feb74ab21d949b73fd0d3196bbbf4 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Thu, 20 Oct 2016 13:57:17 -0400 Subject: [PATCH 03/37] started coding. not working yet' --- src/rasterize.cu | 194 +++++++++++++++++++++++++------------------ src/rasterizeTools.h | 2 +- 2 files changed, 116 insertions(+), 80 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 8ce9d52..8d747f1 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -18,6 +18,12 @@ #include #include +# define IDx (blockIdx.x * blockDim.x) + threadIdx.x +# define IDy (blockIdx.y * blockDim.y) + threadIdx.y +# define DEBUG 1 +# define debug0(...) if (DEBUG = 1 && id = 0) { printf (__VA_ARGS__); } +# define range(i, start, stop) for (i = start; i < stop; i++) + namespace { typedef unsigned short VertexIndex; @@ -34,7 +40,7 @@ namespace { Triangle = 3 }; - struct VertexOut { + struct Vertex { glm::vec4 pos; // TODO: add new attributes to your VertexOut @@ -48,12 +54,12 @@ namespace { TextureData* dev_diffuseTex = NULL; // int texWidth, texHeight; // ... - }; // HELP: what is the difference between VertexIn and VertexOut? + }; struct Primitive { PrimitiveType primitiveType = Triangle; // C++ 11 init - VertexOut v[3]; - }; // HELP: since eyePos, etc. are the same across Vertices, why are they in ever VertexOut struct? + Vertex v[3]; + }; struct Fragment { glm::vec3 color; @@ -62,21 +68,21 @@ namespace { // The attributes listed below might be useful, // but always feel free to modify on your own - // glm::vec3 eyePos; // eye space position used for shading - // glm::vec3 eyeNor; - // VertexAttributeTexcoord texcoord0; - // TextureData* dev_diffuseTex; + glm::vec3 eyePos; // eye space position used for shading + glm::vec3 eyeNor; + VertexAttributeTexcoord texcoord0; + TextureData* dev_diffuseTex; // ... - }; // HELP: what exactly is a fragment? + }; - struct PrimitiveDevBufPointers { + struct VertexParts { int primitiveMode; //from tinygltfloader macro PrimitiveType primitiveType; int numPrimitives; int numIndices; int numVertices; - // Vertex In, const after loaded + // Vertex, const after loaded VertexIndex* dev_indices; VertexAttributePosition* dev_position; VertexAttributeNormal* dev_normal; @@ -89,14 +95,14 @@ namespace { // ... // Vertex Out, vertex used for rasterization, this is changing every frame - VertexOut* dev_verticesOut; + Vertex* dev_verticesOut; // TODO: add more attributes when needed - }; // HELP: What is this for? Different from Primitive? + }; } -static std::map> mesh2PrimitivesMap; +static std::map> mesh2vertexParts; static int width = 0; @@ -114,11 +120,9 @@ static int * dev_depth = NULL; // you might need this buffer when doing depth te */ __global__ void sendImageToPBO(uchar4 *pbo, int w, int h, glm::vec3 *image) { - int x = (blockIdx.x * blockDim.x) + threadIdx.x; - int y = (blockIdx.y * blockDim.y) + threadIdx.y; - int index = x + (y * w); + int index = IDx + (IDy * w); - if (x < w && y < h) { + if (IDx < w && IDy < h) { glm::vec3 color; color.x = glm::clamp(image[index].x, 0.0f, 1.0f) * 255.0; color.y = glm::clamp(image[index].y, 0.0f, 1.0f) * 255.0; @@ -135,12 +139,10 @@ void sendImageToPBO(uchar4 *pbo, int w, int h, glm::vec3 *image) { * Writes fragment colors to the framebuffer */ __global__ -void render(int w, int h, Fragment *fragmentBuffer, glm::vec3 *framebuffer) { - int x = (blockIdx.x * blockDim.x) + threadIdx.x; - int y = (blockIdx.y * blockDim.y) + threadIdx.y; - int index = x + (y * w); +void render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffer) { + int index = IDx + (IDy * w); - if (x < w && y < h) { + if (IDx < w && IDy < h) { framebuffer[index] = fragmentBuffer[index].color; // TODO: add your fragment shader code here @@ -170,12 +172,9 @@ void rasterizeInit(int w, int h) { __global__ void initDepth(int w, int h, int * depth) { - int x = (blockIdx.x * blockDim.x) + threadIdx.x; - int y = (blockIdx.y * blockDim.y) + threadIdx.y; - - if (x < w && y < h) + if (IDx < w && IDy < h) { - int index = x + (y * w); + int index = IDx + (IDy * w); depth[index] = INT_MAX; } } @@ -193,11 +192,9 @@ void _deviceBufferCopy(int N, BufferByte* dev_dst, const BufferByte* dev_src, in // byte (4 * byte) // id of component - int i = (blockIdx.x * blockDim.x) + threadIdx.x; - - if (i < N) { - int count = i / n; - int offset = i - count * n; // which component of the attribute + if (IDx < N) { + int count = IDx / n; + int offset = IDx - count * n; // which component of the attribute for (int j = 0; j < componentTypeByteSize; j++) { @@ -225,10 +222,9 @@ void _nodeMatrixTransform( glm::mat4 MV, glm::mat3 MV_normal) { // vertex id - int vid = (blockIdx.x * blockDim.x) + threadIdx.x; - if (vid < numVertices) { - position[vid] = glm::vec3(MV * glm::vec4(position[vid], 1.0f)); - normal[vid] = glm::normalize(MV_normal * normal[vid]); + if (IDx < numVertices) { + position[IDx] = glm::vec3(MV * glm::vec4(position[IDx], 1.0f)); + normal[IDx] = glm::normalize(MV_normal * normal[IDx]); } } @@ -363,8 +359,8 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { const tinygltf::Mesh & mesh = scene.meshes.at(*itMeshName); - auto res = mesh2PrimitivesMap.insert(std::pair>(mesh.name, std::vector())); - std::vector & primitiveVector = (res.first)->second; + auto res = mesh2vertexParts.insert(std::pair>(mesh.name, std::vector())); + std::vector & vertexPartsVector = (res.first)->second; // for each primitive for (size_t i = 0; i < mesh.primitives.size(); i++) { @@ -399,7 +395,7 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { (BufferByte*)dev_indices, dev_bufferView, n, - indexAccessor.byteStride, + indexAccessor.byteStr ide, indexAccessor.byteOffset, componentTypeByteSize); @@ -510,9 +506,9 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { checkCUDAError(msg.c_str()); } - // malloc for VertexOut - VertexOut* dev_vertexOut; - cudaMalloc(&dev_vertexOut, numVertices * sizeof(VertexOut)); + // malloc for Vertex + Vertex* dev_vertex; + cudaMalloc(&dev_vertex, numVertices * sizeof(Vertex)); checkCUDAError("Malloc VertexOut Buffer"); // ----------Materials------------- @@ -565,7 +561,7 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { // at the end of the for loop of primitive // push dev pointers to map - primitiveVector.push_back(PrimitiveDevBufPointers{ + vertexPartsVector.push_back(VertexParts{ primitive.mode, primitiveType, numPrimitives, @@ -579,7 +575,7 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { dev_diffuseTex, - dev_vertexOut //VertexOut + dev_vertex //VertexOut }); totalNumPrimitives += numPrimitives; @@ -621,23 +617,30 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { __global__ void _vertexTransformAndAssembly( - int numVertices, - PrimitiveDevBufPointers primitive, - glm::mat4 MVP, glm::mat4 MV, glm::mat3 MV_normal, - int width, int height) { + const int numVertices, + VertexParts vertexParts, + const glm::mat4 MVP, const glm::mat4 MV, const glm::mat3 MV_normal, + const int width, const int height) { // vertex id - int vid = (blockIdx.x * blockDim.x) + threadIdx.x; + int x = 0; + int vid = IDx; if (vid < numVertices) { - // TODO: Apply vertex transformation here + Vertex &vertex = vertexParts.dev_verticesOut[vid]; + // Multiply the MVP matrix for each vertex position, this will transform everything into clipping space // Then divide the pos by its w element to transform into NDC space // Finally transform x and y to viewport space + vertex.eyePos = vertexParts.dev_position[vid]; + + glm::vec4 pos(vertex.eyePos, 1.0); + // TODO: Apply vertex transformation here - // TODO: Apply vertex assembly here // Assemble all attribute arrays into the primitive array - + vertex.eyeNor = vertexParts.dev_normal[vid]; + vertex.texcoord0 = vertexParts.dev_texcoord0[vid]; + vertex.dev_diffuseTex = vertexParts.dev_diffuseTex; } } @@ -646,22 +649,20 @@ void _vertexTransformAndAssembly( static int curPrimitiveBeginId = 0; __global__ -void _primitiveAssembly(int numIndices, int curPrimitiveBeginId, Primitive* dev_primitives, PrimitiveDevBufPointers primitive) { +void _primitiveAssembly(int numIndices, int curPrimitiveBeginId, Primitive* dev_primitives, VertexParts vertexParts) { // index id - int iid = (blockIdx.x * blockDim.x) + threadIdx.x; - - if (iid < numIndices) { + if (IDx < numIndices) { // TODO: uncomment the following code for a start // This is primitive assembly for triangles int pid; - if (primitive.primitiveMode == TINYGLTF_MODE_TRIANGLES) { - int num_vertices = 3; // a triangle has 3 vertices - pid = iid / num_vertices; // (int)primitive.primitiveType; - dev_primitives[pid + curPrimitiveBeginId].v[iid % num_vertices] // (int)primitive.primitiveType] - = primitive.dev_verticesOut[primitive.dev_indices[iid]]; + if (vertexParts.primitiveMode == TINYGLTF_MODE_TRIANGLES) { + int num_vertices = (int)vertexParts.primitiveType; // a triangle has 3 vertices + pid = IDx / num_vertices; + dev_primitives[pid + curPrimitiveBeginId].v[IDx % num_vertices] // (int)primitive.primitiveType] + = vertexParts.dev_verticesOut[vertexParts.dev_indices[IDx]]; } // TODO: other primitive types (point, line) @@ -669,7 +670,36 @@ void _primitiveAssembly(int numIndices, int curPrimitiveBeginId, Primitive* dev_ } +__global__ +void _rasterize(int n_primitives, int height, int width, +const Primitive *primitives, +Fragment *fragments) { + if (IDx >= n_primitives) return; + + Primitive &primitive = primitives[IDx]; + + int i, j; + glm::vec3 tri[3]; + range(i, 0, 3) { + tri[i] = primitive.v[i].eyePos; // get coordinates of tri points + } + range(i, 0, height) { + range(j, 0, width) { + glm::vec3 eyePos = ; + fragments[i].eyePos = eyePos; // TODO: aren't there more fragments then pixels?? + + // TODO: are these initialized? + glm::vec2 pos2d(eyePos); // x and y coord of eyePos + + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, pos2d); + if (isBarycentricCoordInBounds(barycentricCoord)) { + eyePos.z = atomicMax(&eyePos.z, ) + } + } + } + +} /** * Perform rasterization. @@ -684,43 +714,49 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g // (See README for rasterization pipeline outline.) // Vertex Process & primitive assembly - _vertexTransformAndAssembly(); // what args? + curPrimitiveBeginId = 0; { - curPrimitiveBeginId = 0; dim3 numThreadsPerBlock(128); - auto it = mesh2PrimitivesMap.begin(); - auto itEnd = mesh2PrimitivesMap.end(); + auto it = mesh2vertexParts.begin(); + auto itEnd = mesh2vertexParts.end(); for (; it != itEnd; ++it) { - auto p = (it->second).begin(); // each primitive - auto pEnd = (it->second).end(); - for (; p != pEnd; ++p) { - dim3 numBlocksForVertices((p->numVertices + numThreadsPerBlock.x - 1) / numThreadsPerBlock.x); - dim3 numBlocksForIndices((p->numIndices + numThreadsPerBlock.x - 1) / numThreadsPerBlock.x); - - _vertexTransformAndAssembly << < numBlocksForVertices, numThreadsPerBlock >> >(p->numVertices, *p, MVP, MV, MV_normal, width, height); + auto parts = (it->second).begin(); // each primitive + auto partsEnd = (it->second).end(); + for (; parts != partsEnd; ++parts) { + dim3 numBlocksForVertices((parts->numVertices + numThreadsPerBlock.x - 1) / numThreadsPerBlock.x); + dim3 numBlocksForIndices((parts->numIndices + numThreadsPerBlock.x - 1) / numThreadsPerBlock.x); + + _vertexTransformAndAssembly << < numBlocksForVertices, numThreadsPerBlock >> > + (parts->numVertices, + *parts, + MVP, MV, MV_normal, + width, height); checkCUDAError("Vertex Processing"); cudaDeviceSynchronize(); _primitiveAssembly << < numBlocksForIndices, numThreadsPerBlock >> > - (p->numIndices, + (parts->numIndices, curPrimitiveBeginId, dev_primitives, - *p); + *parts); checkCUDAError("Primitive Assembly"); - curPrimitiveBeginId += p->numPrimitives; + curPrimitiveBeginId += parts->numPrimitives; } } checkCUDAError("Vertex Processing and Primitive Assembly"); } - cudaMemset(dev_fragmentBuffer, 0, width * height * sizeof(Fragment)); + int numPixels = width * height; + cudaMemset(dev_fragmentBuffer, 0, numPixels * sizeof(Fragment)); initDepth << > >(width, height, dev_depth); // TODO: rasterize + _rasterize(totalNumPrimitives, height, width, + dev_primitives, dev_fragmentBuffer); @@ -739,8 +775,8 @@ void rasterizeFree() { // deconstruct primitives attribute/indices device buffer - auto it(mesh2PrimitivesMap.begin()); - auto itEnd(mesh2PrimitivesMap.end()); + auto it(mesh2vertexParts.begin()); + auto itEnd(mesh2vertexParts.end()); for (; it != itEnd; ++it) { for (auto p = it->second.begin(); p != it->second.end(); ++p) { cudaFree(p->dev_indices); diff --git a/src/rasterizeTools.h b/src/rasterizeTools.h index 46c701e..97e9fcd 100644 --- a/src/rasterizeTools.h +++ b/src/rasterizeTools.h @@ -70,7 +70,7 @@ float calculateBarycentricCoordinateValue(glm::vec2 a, glm::vec2 b, glm::vec2 c, * Calculate barycentric coordinates. */ __host__ __device__ static -glm::vec3 calculateBarycentricCoordinate(const glm::vec3 tri[3], glm::vec2 point) { +glm::vec3 calculateBarycentricCoordinate(const glm::vec3 tri[3], const glm::vec2 point) { float beta = calculateBarycentricCoordinateValue(glm::vec2(tri[0].x, tri[0].y), point, glm::vec2(tri[2].x, tri[2].y), tri); float gamma = calculateBarycentricCoordinateValue(glm::vec2(tri[0].x, tri[0].y), glm::vec2(tri[1].x, tri[1].y), point, tri); float alpha = 1.0 - beta - gamma; From c1fb3423483043694b3b29b02bc24cb5fc546bc3 Mon Sep 17 00:00:00 2001 From: Ethan Date: Thu, 20 Oct 2016 13:58:58 -0400 Subject: [PATCH 04/37] added interect and retabbed --- src/rasterize.cu | 1210 +++++++++++++++++++++++----------------------- 1 file changed, 608 insertions(+), 602 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 8d747f1..74671fe 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -26,79 +26,79 @@ namespace { - typedef unsigned short VertexIndex; - typedef glm::vec3 VertexAttributePosition; - typedef glm::vec3 VertexAttributeNormal; - typedef glm::vec2 VertexAttributeTexcoord; - typedef unsigned char TextureData; - - typedef unsigned char BufferByte; - - enum PrimitiveType{ - Point = 1, - Line = 2, - Triangle = 3 - }; - - struct Vertex { - glm::vec4 pos; - - // TODO: add new attributes to your VertexOut - // The attributes listed below might be useful, - // but always feel free to modify on your own - - glm::vec3 eyePos; // eye space position used for shading - glm::vec3 eyeNor; // eye space normal used for shading, cuz normal will go wrong after perspective transformation - // glm::vec3 col; - glm::vec2 texcoord0; - TextureData* dev_diffuseTex = NULL; - // int texWidth, texHeight; - // ... - }; - - struct Primitive { - PrimitiveType primitiveType = Triangle; // C++ 11 init - Vertex v[3]; - }; - - struct Fragment { - glm::vec3 color; - - // TODO: add new attributes to your Fragment - // The attributes listed below might be useful, - // but always feel free to modify on your own - - glm::vec3 eyePos; // eye space position used for shading - glm::vec3 eyeNor; - VertexAttributeTexcoord texcoord0; - TextureData* dev_diffuseTex; - // ... - }; - - struct VertexParts { - int primitiveMode; //from tinygltfloader macro - PrimitiveType primitiveType; - int numPrimitives; - int numIndices; - int numVertices; - - // Vertex, const after loaded - VertexIndex* dev_indices; - VertexAttributePosition* dev_position; - VertexAttributeNormal* dev_normal; - VertexAttributeTexcoord* dev_texcoord0; - - // Materials, add more attributes when needed - TextureData* dev_diffuseTex; - // TextureData* dev_specularTex; - // TextureData* dev_normalTex; - // ... - - // Vertex Out, vertex used for rasterization, this is changing every frame - Vertex* dev_verticesOut; - - // TODO: add more attributes when needed - }; + typedef unsigned short VertexIndex; + typedef glm::vec3 VertexAttributePosition; + typedef glm::vec3 VertexAttributeNormal; + typedef glm::vec2 VertexAttributeTexcoord; + typedef unsigned char TextureData; + + typedef unsigned char BufferByte; + + enum PrimitiveType{ + Point = 1, + Line = 2, + Triangle = 3 + }; + + struct Vertex { + glm::vec4 pos; + + // TODO: add new attributes to your VertexOut + // The attributes listed below might be useful, + // but always feel free to modify on your own + + glm::vec3 eyePos; // eye space position used for shading + glm::vec3 eyeNor; // eye space normal used for shading, cuz normal will go wrong after perspective transformation + // glm::vec3 col; + glm::vec2 texcoord0; + TextureData* dev_diffuseTex = NULL; + // int texWidth, texHeight; + // ... + }; + + struct Primitive { + PrimitiveType primitiveType = Triangle; // C++ 11 init + Vertex v[3]; + }; + + struct Fragment { + glm::vec3 color; + + // TODO: add new attributes to your Fragment + // The attributes listed below might be useful, + // but always feel free to modify on your own + + glm::vec3 eyePos; // eye space position used for shading + glm::vec3 eyeNor; + VertexAttributeTexcoord texcoord0; + TextureData* dev_diffuseTex; + // ... + }; + + struct VertexParts { + int primitiveMode; //from tinygltfloader macro + PrimitiveType primitiveType; + int numPrimitives; + int numIndices; + int numVertices; + + // Vertex, const after loaded + VertexIndex* dev_indices; + VertexAttributePosition* dev_position; + VertexAttributeNormal* dev_normal; + VertexAttributeTexcoord* dev_texcoord0; + + // Materials, add more attributes when needed + TextureData* dev_diffuseTex; + // TextureData* dev_specularTex; + // TextureData* dev_normalTex; + // ... + + // Vertex Out, vertex used for rasterization, this is changing every frame + Vertex* dev_verticesOut; + + // TODO: add more attributes when needed + }; } @@ -113,7 +113,7 @@ static Primitive *dev_primitives = NULL; static Fragment *dev_fragmentBuffer = NULL; static glm::vec3 *dev_framebuffer = NULL; -static int * dev_depth = NULL; // you might need this buffer when doing depth test +static int * dev_depth = NULL; // you might need this buffer when doing depth test /** * Kernel that writes the image to the OpenGL PBO directly. @@ -145,7 +145,7 @@ void render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffer if (IDx < w && IDy < h) { framebuffer[index] = fragmentBuffer[index].color; - // TODO: add your fragment shader code here + // TODO: add your fragment shader code here } } @@ -156,27 +156,27 @@ void render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffer void rasterizeInit(int w, int h) { width = w; height = h; - cudaFree(dev_fragmentBuffer); - cudaMalloc(&dev_fragmentBuffer, width * height * sizeof(Fragment)); - cudaMemset(dev_fragmentBuffer, 0, width * height * sizeof(Fragment)); + cudaFree(dev_fragmentBuffer); + cudaMalloc(&dev_fragmentBuffer, width * height * sizeof(Fragment)); + cudaMemset(dev_fragmentBuffer, 0, width * height * sizeof(Fragment)); cudaFree(dev_framebuffer); cudaMalloc(&dev_framebuffer, width * height * sizeof(glm::vec3)); cudaMemset(dev_framebuffer, 0, width * height * sizeof(glm::vec3)); - cudaFree(dev_depth); - cudaMalloc(&dev_depth, width * height * sizeof(int)); + cudaFree(dev_depth); + cudaMalloc(&dev_depth, width * height * sizeof(int)); - checkCUDAError("rasterizeInit"); + checkCUDAError("rasterizeInit"); } __global__ void initDepth(int w, int h, int * depth) { - if (IDx < w && IDy < h) - { - int index = IDx + (IDy * w); - depth[index] = INT_MAX; - } + if (IDx < w && IDy < h) + { + int index = IDx + (IDy * w); + depth[index] = INT_MAX; + } } @@ -186,429 +186,429 @@ void initDepth(int w, int h, int * depth) */ __global__ void _deviceBufferCopy(int N, BufferByte* dev_dst, const BufferByte* dev_src, int n, int byteStride, int byteOffset, int componentTypeByteSize) { - - // Attribute (vec3 position) - // component (3 * float) - // byte (4 * byte) - - // id of component - if (IDx < N) { - int count = IDx / n; - int offset = IDx - count * n; // which component of the attribute - - for (int j = 0; j < componentTypeByteSize; j++) { - - dev_dst[count * componentTypeByteSize * n - + offset * componentTypeByteSize - + j] - - = - - dev_src[byteOffset - + count * (byteStride == 0 ? componentTypeByteSize * n : byteStride) - + offset * componentTypeByteSize - + j]; - } - } - + + // Attribute (vec3 position) + // component (3 * float) + // byte (4 * byte) + + // id of component + if (IDx < N) { + int count = IDx / n; + int offset = IDx - count * n; // which component of the attribute + + for (int j = 0; j < componentTypeByteSize; j++) { + + dev_dst[count * componentTypeByteSize * n + + offset * componentTypeByteSize + + j] + + = + + dev_src[byteOffset + + count * (byteStride == 0 ? componentTypeByteSize * n : byteStride) + + offset * componentTypeByteSize + + j]; + } + } + } __global__ void _nodeMatrixTransform( - int numVertices, - VertexAttributePosition* position, - VertexAttributeNormal* normal, - glm::mat4 MV, glm::mat3 MV_normal) { - - // vertex id - if (IDx < numVertices) { - position[IDx] = glm::vec3(MV * glm::vec4(position[IDx], 1.0f)); - normal[IDx] = glm::normalize(MV_normal * normal[IDx]); - } + int numVertices, + VertexAttributePosition* position, + VertexAttributeNormal* normal, + glm::mat4 MV, glm::mat3 MV_normal) { + + // vertex id + if (IDx < numVertices) { + position[IDx] = glm::vec3(MV * glm::vec4(position[IDx], 1.0f)); + normal[IDx] = glm::normalize(MV_normal * normal[IDx]); + } } glm::mat4 getMatrixFromNodeMatrixVector(const tinygltf::Node & n) { - - glm::mat4 curMatrix(1.0); - - const std::vector &m = n.matrix; - if (m.size() > 0) { - // matrix, copy it - - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 4; j++) { - curMatrix[i][j] = (float)m.at(4 * i + j); - } - } - } else { - // no matrix, use rotation, scale, translation - - if (n.translation.size() > 0) { - curMatrix[3][0] = n.translation[0]; - curMatrix[3][1] = n.translation[1]; - curMatrix[3][2] = n.translation[2]; - } - - if (n.rotation.size() > 0) { - glm::mat4 R; - glm::quat q; - q[0] = n.rotation[0]; - q[1] = n.rotation[1]; - q[2] = n.rotation[2]; - - R = glm::mat4_cast(q); - curMatrix = curMatrix * R; - } - - if (n.scale.size() > 0) { - curMatrix = curMatrix * glm::scale(glm::vec3(n.scale[0], n.scale[1], n.scale[2])); - } - } - - return curMatrix; + + glm::mat4 curMatrix(1.0); + + const std::vector &m = n.matrix; + if (m.size() > 0) { + // matrix, copy it + + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + curMatrix[i][j] = (float)m.at(4 * i + j); + } + } + } else { + // no matrix, use rotation, scale, translation + + if (n.translation.size() > 0) { + curMatrix[3][0] = n.translation[0]; + curMatrix[3][1] = n.translation[1]; + curMatrix[3][2] = n.translation[2]; + } + + if (n.rotation.size() > 0) { + glm::mat4 R; + glm::quat q; + q[0] = n.rotation[0]; + q[1] = n.rotation[1]; + q[2] = n.rotation[2]; + + R = glm::mat4_cast(q); + curMatrix = curMatrix * R; + } + + if (n.scale.size() > 0) { + curMatrix = curMatrix * glm::scale(glm::vec3(n.scale[0], n.scale[1], n.scale[2])); + } + } + + return curMatrix; } void traverseNode ( - std::map & n2m, - const tinygltf::Scene & scene, - const std::string & nodeString, - const glm::mat4 & parentMatrix - ) + std::map & n2m, + const tinygltf::Scene & scene, + const std::string & nodeString, + const glm::mat4 & parentMatrix + ) { - const tinygltf::Node & n = scene.nodes.at(nodeString); - glm::mat4 M = parentMatrix * getMatrixFromNodeMatrixVector(n); - n2m.insert(std::pair(nodeString, M)); + const tinygltf::Node & n = scene.nodes.at(nodeString); + glm::mat4 M = parentMatrix * getMatrixFromNodeMatrixVector(n); + n2m.insert(std::pair(nodeString, M)); - auto it = n.children.begin(); - auto itEnd = n.children.end(); + auto it = n.children.begin(); + auto itEnd = n.children.end(); - for (; it != itEnd; ++it) { - traverseNode(n2m, scene, *it, M); - } + for (; it != itEnd; ++it) { + traverseNode(n2m, scene, *it, M); + } } void rasterizeSetBuffers(const tinygltf::Scene & scene) { - totalNumPrimitives = 0; - - std::map bufferViewDevPointers; + totalNumPrimitives = 0; - // 1. copy all `bufferViews` to device memory - { - std::map::const_iterator it( - scene.bufferViews.begin()); - std::map::const_iterator itEnd( - scene.bufferViews.end()); + std::map bufferViewDevPointers; - for (; it != itEnd; it++) { - const std::string key = it->first; + // 1. copy all `bufferViews` to device memory + { + std::map::const_iterator it( + scene.bufferViews.begin()); + std::map::const_iterator itEnd( + scene.bufferViews.end()); - const tinygltf::BufferView &bufferView = it->second; - if (bufferView.target == 0) { - continue; // Unsupported bufferView. - } + for (; it != itEnd; it++) { + const std::string key = it->first; - const tinygltf::Buffer &buffer = scene.buffers.at(bufferView.buffer); + const tinygltf::BufferView &bufferView = it->second; + if (bufferView.target == 0) { + continue; // Unsupported bufferView. + } - BufferByte* dev_bufferView; - cudaMalloc(&dev_bufferView, bufferView.byteLength); - cudaMemcpy(dev_bufferView, &buffer.data.front() + bufferView.byteOffset, bufferView.byteLength, cudaMemcpyHostToDevice); + const tinygltf::Buffer &buffer = scene.buffers.at(bufferView.buffer); - checkCUDAError("Set BufferView Device Mem"); + BufferByte* dev_bufferView; + cudaMalloc(&dev_bufferView, bufferView.byteLength); + cudaMemcpy(dev_bufferView, &buffer.data.front() + bufferView.byteOffset, bufferView.byteLength, cudaMemcpyHostToDevice); - bufferViewDevPointers.insert(std::make_pair(key, dev_bufferView)); + checkCUDAError("Set BufferView Device Mem"); - } - } + bufferViewDevPointers.insert(std::make_pair(key, dev_bufferView)); + } + } - // 2. for each mesh: - // for each primitive: - // build device buffer of indices, materail, and each attributes - // and store these pointers in a map - { - std::map nodeString2Matrix; - auto rootNodeNamesList = scene.scenes.at(scene.defaultScene); - - { - auto it = rootNodeNamesList.begin(); - auto itEnd = rootNodeNamesList.end(); - for (; it != itEnd; ++it) { - traverseNode(nodeString2Matrix, scene, *it, glm::mat4(1.0f)); - } - } + // 2. for each mesh: + // for each primitive: + // build device buffer of indices, materail, and each attributes + // and store these pointers in a map + { + std::map nodeString2Matrix; + auto rootNodeNamesList = scene.scenes.at(scene.defaultScene); - // parse through node to access mesh + { + auto it = rootNodeNamesList.begin(); + auto itEnd = rootNodeNamesList.end(); + for (; it != itEnd; ++it) { + traverseNode(nodeString2Matrix, scene, *it, glm::mat4(1.0f)); + } + } - auto itNode = nodeString2Matrix.begin(); - auto itEndNode = nodeString2Matrix.end(); - for (; itNode != itEndNode; ++itNode) { - const tinygltf::Node & N = scene.nodes.at(itNode->first); - const glm::mat4 & matrix = itNode->second; - const glm::mat3 & matrixNormal = glm::transpose(glm::inverse(glm::mat3(matrix))); + // parse through node to access mesh + + auto itNode = nodeString2Matrix.begin(); + auto itEndNode = nodeString2Matrix.end(); + for (; itNode != itEndNode; ++itNode) { + + const tinygltf::Node & N = scene.nodes.at(itNode->first); + const glm::mat4 & matrix = itNode->second; + const glm::mat3 & matrixNormal = glm::transpose(glm::inverse(glm::mat3(matrix))); + + auto itMeshName = N.meshes.begin(); + auto itEndMeshName = N.meshes.end(); + + for (; itMeshName != itEndMeshName; ++itMeshName) { + + const tinygltf::Mesh & mesh = scene.meshes.at(*itMeshName); + + auto res = mesh2vertexParts.insert(std::pair>(mesh.name, std::vector())); + std::vector & vertexPartsVector = (res.first)->second; + + // for each primitive + for (size_t i = 0; i < mesh.primitives.size(); i++) { + const tinygltf::Primitive &primitive = mesh.primitives[i]; + + if (primitive.indices.empty()) + return; + + // TODO: add new attributes for your PrimitiveDevBufPointers when you add new attributes + VertexIndex* dev_indices; + VertexAttributePosition* dev_position; + VertexAttributeNormal* dev_normal; + VertexAttributeTexcoord* dev_texcoord0; + + // ----------Indices------------- + + const tinygltf::Accessor &indexAccessor = scene.accessors.at(primitive.indices); + const tinygltf::BufferView &bufferView = scene.bufferViews.at(indexAccessor.bufferView); + BufferByte* dev_bufferView = bufferViewDevPointers.at(indexAccessor.bufferView); + + // assume type is SCALAR for indices + int n = 1; + int numIndices = indexAccessor.count; + int componentTypeByteSize = sizeof(VertexIndex); + int byteLength = numIndices * n * componentTypeByteSize; + + dim3 numThreadsPerBlock(128); + dim3 numBlocks((numIndices + numThreadsPerBlock.x - 1) / numThreadsPerBlock.x); + cudaMalloc(&dev_indices, byteLength); + _deviceBufferCopy << > > ( + numIndices, + (BufferByte*)dev_indices, + dev_bufferView, + n, + indexAccessor.byteStr ide, + indexAccessor.byteOffset, + componentTypeByteSize); + + + checkCUDAError("Set Index Buffer"); + + + // ---------Primitive Info------- + + // Warning: LINE_STRIP is not supported in tinygltfloader + int numPrimitives; + PrimitiveType primitiveType; + switch (primitive.mode) { + case TINYGLTF_MODE_TRIANGLES: + primitiveType = PrimitiveType::Triangle; + numPrimitives = numIndices / 3; + break; + case TINYGLTF_MODE_TRIANGLE_STRIP: + primitiveType = PrimitiveType::Triangle; + numPrimitives = numIndices - 2; + break; + case TINYGLTF_MODE_TRIANGLE_FAN: + primitiveType = PrimitiveType::Triangle; + numPrimitives = numIndices - 2; + break; + case TINYGLTF_MODE_LINE: + primitiveType = PrimitiveType::Line; + numPrimitives = numIndices / 2; + break; + case TINYGLTF_MODE_LINE_LOOP: + primitiveType = PrimitiveType::Line; + numPrimitives = numIndices + 1; + break; + case TINYGLTF_MODE_POINTS: + primitiveType = PrimitiveType::Point; + numPrimitives = numIndices; + break; + default: + // output error + break; + }; + + + // ----------Attributes------------- + + auto it(primitive.attributes.begin()); + auto itEnd(primitive.attributes.end()); + + int numVertices = 0; + // for each attribute + for (; it != itEnd; it++) { + const tinygltf::Accessor &accessor = scene.accessors.at(it->second); + const tinygltf::BufferView &bufferView = scene.bufferViews.at(accessor.bufferView); + + int n = 1; + if (accessor.type == TINYGLTF_TYPE_SCALAR) { + n = 1; + } + else if (accessor.type == TINYGLTF_TYPE_VEC2) { + n = 2; + } + else if (accessor.type == TINYGLTF_TYPE_VEC3) { + n = 3; + } + else if (accessor.type == TINYGLTF_TYPE_VEC4) { + n = 4; + } + + BufferByte * dev_bufferView = bufferViewDevPointers.at(accessor.bufferView); + BufferByte ** dev_attribute = NULL; + + numVertices = accessor.count; + int componentTypeByteSize; + + // Note: since the type of our attribute array (dev_position) is static (float32) + // We assume the glTF model attribute type are 5126(FLOAT) here + + if (it->first.compare("POSITION") == 0) { + componentTypeByteSize = sizeof(VertexAttributePosition) / n; + dev_attribute = (BufferByte**)&dev_position; + } + else if (it->first.compare("NORMAL") == 0) { + componentTypeByteSize = sizeof(VertexAttributeNormal) / n; + dev_attribute = (BufferByte**)&dev_normal; + } + else if (it->first.compare("TEXCOORD_0") == 0) { + componentTypeByteSize = sizeof(VertexAttributeTexcoord) / n; + dev_attribute = (BufferByte**)&dev_texcoord0; + } + + std::cout << accessor.bufferView << " - " << it->second << " - " << it->first << '\n'; + + dim3 numThreadsPerBlock(128); + dim3 numBlocks((n * numVertices + numThreadsPerBlock.x - 1) / numThreadsPerBlock.x); + int byteLength = numVertices * n * componentTypeByteSize; + cudaMalloc(dev_attribute, byteLength); + + _deviceBufferCopy << > > ( + n * numVertices, + *dev_attribute, + dev_bufferView, + n, + accessor.byteStride, + accessor.byteOffset, + componentTypeByteSize); + + std::string msg = "Set Attribute Buffer: " + it->first; + checkCUDAError(msg.c_str()); + } + + // malloc for Vertex + Vertex* dev_vertex; + cudaMalloc(&dev_vertex, numVertices * sizeof(Vertex)); + checkCUDAError("Malloc VertexOut Buffer"); + + // ----------Materials------------- + + // You can only worry about this part once you started to + // implement textures for your rasterizer + TextureData* dev_diffuseTex = NULL; + if (!primitive.material.empty()) { + const tinygltf::Material &mat = scene.materials.at(primitive.material); + printf("material.name = %s\n", mat.name.c_str()); + + if (mat.values.find("diffuse") != mat.values.end()) { + std::string diffuseTexName = mat.values.at("diffuse").string_value; + if (scene.textures.find(diffuseTexName) != scene.textures.end()) { + const tinygltf::Texture &tex = scene.textures.at(diffuseTexName); + if (scene.images.find(tex.source) != scene.images.end()) { + const tinygltf::Image &image = scene.images.at(tex.source); + + size_t s = image.image.size() * sizeof(TextureData); + cudaMalloc(&dev_diffuseTex, s); + cudaMemcpy(dev_diffuseTex, &image.image.at(0), s, cudaMemcpyHostToDevice); + + // TODO: store the image size to your PrimitiveDevBufPointers + // image.width; + // image.height; + + checkCUDAError("Set Texture Image data"); + } + } + } + + // TODO: write your code for other materails + // You may have to take a look at tinygltfloader + // You can also use the above code loading diffuse material as a start point + } + + + // ---------Node hierarchy transform-------- + cudaDeviceSynchronize(); + + dim3 numBlocksNodeTransform((numVertices + numThreadsPerBlock.x - 1) / numThreadsPerBlock.x); + _nodeMatrixTransform << > > ( + numVertices, + dev_position, + dev_normal, + matrix, + matrixNormal); + + checkCUDAError("Node hierarchy transformation"); + + // at the end of the for loop of primitive + // push dev pointers to map + vertexPartsVector.push_back(VertexParts{ + primitive.mode, + primitiveType, + numPrimitives, + numIndices, + numVertices, + + dev_indices, + dev_position, + dev_normal, + dev_texcoord0, + + dev_diffuseTex, + + dev_vertex //VertexOut + }); + + totalNumPrimitives += numPrimitives; + + } // for each primitive + + } // for each mesh + + } // for each node + + } + + + // 3. Malloc for dev_primitives + { + cudaMalloc(&dev_primitives, totalNumPrimitives * sizeof(Primitive)); + } + + + // Finally, cudaFree raw dev_bufferViews + { + + std::map::const_iterator it(bufferViewDevPointers.begin()); + std::map::const_iterator itEnd(bufferViewDevPointers.end()); + + //bufferViewDevPointers + + for (; it != itEnd; it++) { + cudaFree(it->second); + } - auto itMeshName = N.meshes.begin(); - auto itEndMeshName = N.meshes.end(); - - for (; itMeshName != itEndMeshName; ++itMeshName) { - - const tinygltf::Mesh & mesh = scene.meshes.at(*itMeshName); - - auto res = mesh2vertexParts.insert(std::pair>(mesh.name, std::vector())); - std::vector & vertexPartsVector = (res.first)->second; - - // for each primitive - for (size_t i = 0; i < mesh.primitives.size(); i++) { - const tinygltf::Primitive &primitive = mesh.primitives[i]; - - if (primitive.indices.empty()) - return; - - // TODO: add new attributes for your PrimitiveDevBufPointers when you add new attributes - VertexIndex* dev_indices; - VertexAttributePosition* dev_position; - VertexAttributeNormal* dev_normal; - VertexAttributeTexcoord* dev_texcoord0; - - // ----------Indices------------- - - const tinygltf::Accessor &indexAccessor = scene.accessors.at(primitive.indices); - const tinygltf::BufferView &bufferView = scene.bufferViews.at(indexAccessor.bufferView); - BufferByte* dev_bufferView = bufferViewDevPointers.at(indexAccessor.bufferView); - - // assume type is SCALAR for indices - int n = 1; - int numIndices = indexAccessor.count; - int componentTypeByteSize = sizeof(VertexIndex); - int byteLength = numIndices * n * componentTypeByteSize; - - dim3 numThreadsPerBlock(128); - dim3 numBlocks((numIndices + numThreadsPerBlock.x - 1) / numThreadsPerBlock.x); - cudaMalloc(&dev_indices, byteLength); - _deviceBufferCopy << > > ( - numIndices, - (BufferByte*)dev_indices, - dev_bufferView, - n, - indexAccessor.byteStr ide, - indexAccessor.byteOffset, - componentTypeByteSize); - - - checkCUDAError("Set Index Buffer"); - - - // ---------Primitive Info------- - - // Warning: LINE_STRIP is not supported in tinygltfloader - int numPrimitives; - PrimitiveType primitiveType; - switch (primitive.mode) { - case TINYGLTF_MODE_TRIANGLES: - primitiveType = PrimitiveType::Triangle; - numPrimitives = numIndices / 3; - break; - case TINYGLTF_MODE_TRIANGLE_STRIP: - primitiveType = PrimitiveType::Triangle; - numPrimitives = numIndices - 2; - break; - case TINYGLTF_MODE_TRIANGLE_FAN: - primitiveType = PrimitiveType::Triangle; - numPrimitives = numIndices - 2; - break; - case TINYGLTF_MODE_LINE: - primitiveType = PrimitiveType::Line; - numPrimitives = numIndices / 2; - break; - case TINYGLTF_MODE_LINE_LOOP: - primitiveType = PrimitiveType::Line; - numPrimitives = numIndices + 1; - break; - case TINYGLTF_MODE_POINTS: - primitiveType = PrimitiveType::Point; - numPrimitives = numIndices; - break; - default: - // output error - break; - }; - - - // ----------Attributes------------- - - auto it(primitive.attributes.begin()); - auto itEnd(primitive.attributes.end()); - - int numVertices = 0; - // for each attribute - for (; it != itEnd; it++) { - const tinygltf::Accessor &accessor = scene.accessors.at(it->second); - const tinygltf::BufferView &bufferView = scene.bufferViews.at(accessor.bufferView); - - int n = 1; - if (accessor.type == TINYGLTF_TYPE_SCALAR) { - n = 1; - } - else if (accessor.type == TINYGLTF_TYPE_VEC2) { - n = 2; - } - else if (accessor.type == TINYGLTF_TYPE_VEC3) { - n = 3; - } - else if (accessor.type == TINYGLTF_TYPE_VEC4) { - n = 4; - } - - BufferByte * dev_bufferView = bufferViewDevPointers.at(accessor.bufferView); - BufferByte ** dev_attribute = NULL; - - numVertices = accessor.count; - int componentTypeByteSize; - - // Note: since the type of our attribute array (dev_position) is static (float32) - // We assume the glTF model attribute type are 5126(FLOAT) here - - if (it->first.compare("POSITION") == 0) { - componentTypeByteSize = sizeof(VertexAttributePosition) / n; - dev_attribute = (BufferByte**)&dev_position; - } - else if (it->first.compare("NORMAL") == 0) { - componentTypeByteSize = sizeof(VertexAttributeNormal) / n; - dev_attribute = (BufferByte**)&dev_normal; - } - else if (it->first.compare("TEXCOORD_0") == 0) { - componentTypeByteSize = sizeof(VertexAttributeTexcoord) / n; - dev_attribute = (BufferByte**)&dev_texcoord0; - } - - std::cout << accessor.bufferView << " - " << it->second << " - " << it->first << '\n'; - - dim3 numThreadsPerBlock(128); - dim3 numBlocks((n * numVertices + numThreadsPerBlock.x - 1) / numThreadsPerBlock.x); - int byteLength = numVertices * n * componentTypeByteSize; - cudaMalloc(dev_attribute, byteLength); - - _deviceBufferCopy << > > ( - n * numVertices, - *dev_attribute, - dev_bufferView, - n, - accessor.byteStride, - accessor.byteOffset, - componentTypeByteSize); - - std::string msg = "Set Attribute Buffer: " + it->first; - checkCUDAError(msg.c_str()); - } - - // malloc for Vertex - Vertex* dev_vertex; - cudaMalloc(&dev_vertex, numVertices * sizeof(Vertex)); - checkCUDAError("Malloc VertexOut Buffer"); - - // ----------Materials------------- - - // You can only worry about this part once you started to - // implement textures for your rasterizer - TextureData* dev_diffuseTex = NULL; - if (!primitive.material.empty()) { - const tinygltf::Material &mat = scene.materials.at(primitive.material); - printf("material.name = %s\n", mat.name.c_str()); - - if (mat.values.find("diffuse") != mat.values.end()) { - std::string diffuseTexName = mat.values.at("diffuse").string_value; - if (scene.textures.find(diffuseTexName) != scene.textures.end()) { - const tinygltf::Texture &tex = scene.textures.at(diffuseTexName); - if (scene.images.find(tex.source) != scene.images.end()) { - const tinygltf::Image &image = scene.images.at(tex.source); - - size_t s = image.image.size() * sizeof(TextureData); - cudaMalloc(&dev_diffuseTex, s); - cudaMemcpy(dev_diffuseTex, &image.image.at(0), s, cudaMemcpyHostToDevice); - - // TODO: store the image size to your PrimitiveDevBufPointers - // image.width; - // image.height; - - checkCUDAError("Set Texture Image data"); - } - } - } - - // TODO: write your code for other materails - // You may have to take a look at tinygltfloader - // You can also use the above code loading diffuse material as a start point - } - - - // ---------Node hierarchy transform-------- - cudaDeviceSynchronize(); - - dim3 numBlocksNodeTransform((numVertices + numThreadsPerBlock.x - 1) / numThreadsPerBlock.x); - _nodeMatrixTransform << > > ( - numVertices, - dev_position, - dev_normal, - matrix, - matrixNormal); - - checkCUDAError("Node hierarchy transformation"); - - // at the end of the for loop of primitive - // push dev pointers to map - vertexPartsVector.push_back(VertexParts{ - primitive.mode, - primitiveType, - numPrimitives, - numIndices, - numVertices, - - dev_indices, - dev_position, - dev_normal, - dev_texcoord0, - - dev_diffuseTex, - - dev_vertex //VertexOut - }); - - totalNumPrimitives += numPrimitives; - - } // for each primitive - - } // for each mesh - - } // for each node - - } - - - // 3. Malloc for dev_primitives - { - cudaMalloc(&dev_primitives, totalNumPrimitives * sizeof(Primitive)); - } - - - // Finally, cudaFree raw dev_bufferViews - { - - std::map::const_iterator it(bufferViewDevPointers.begin()); - std::map::const_iterator itEnd(bufferViewDevPointers.end()); - - //bufferViewDevPointers - - for (; it != itEnd; it++) { - cudaFree(it->second); - } - - checkCUDAError("Free BufferView Device Mem"); - } + checkCUDAError("Free BufferView Device Mem"); + } } @@ -617,31 +617,31 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { __global__ void _vertexTransformAndAssembly( - const int numVertices, - VertexParts vertexParts, - const glm::mat4 MVP, const glm::mat4 MV, const glm::mat3 MV_normal, - const int width, const int height) { - - // vertex id - int x = 0; - int vid = IDx; - if (vid < numVertices) { - - Vertex &vertex = vertexParts.dev_verticesOut[vid]; - - // Multiply the MVP matrix for each vertex position, this will transform everything into clipping space - // Then divide the pos by its w element to transform into NDC space - // Finally transform x and y to viewport space - vertex.eyePos = vertexParts.dev_position[vid]; - - glm::vec4 pos(vertex.eyePos, 1.0); - // TODO: Apply vertex transformation here - - // Assemble all attribute arrays into the primitive array - vertex.eyeNor = vertexParts.dev_normal[vid]; - vertex.texcoord0 = vertexParts.dev_texcoord0[vid]; - vertex.dev_diffuseTex = vertexParts.dev_diffuseTex; - } + const int numVertices, + VertexParts vertexParts, + const glm::mat4 MVP, const glm::mat4 MV, const glm::mat3 MV_normal, + const int width, const int height) { + + // vertex id + int x = 0; + int vid = IDx; + if (vid < numVertices) { + + Vertex &vertex = vertexParts.dev_verticesOut[vid]; + + // Multiply the MVP matrix for each vertex position, this will transform everything into clipping space + // Then divide the pos by its w element to transform into NDC space + // Finally transform x and y to viewport space + vertex.eyePos = vertexParts.dev_position[vid]; + + glm::vec4 pos(vertex.eyePos, 1.0); + // TODO: Apply vertex transformation here + + // Assemble all attribute arrays into the primitive array + vertex.eyeNor = vertexParts.dev_normal[vid]; + vertex.texcoord0 = vertexParts.dev_texcoord0[vid]; + vertex.dev_diffuseTex = vertexParts.dev_diffuseTex; + } } @@ -651,54 +651,60 @@ static int curPrimitiveBeginId = 0; __global__ void _primitiveAssembly(int numIndices, int curPrimitiveBeginId, Primitive* dev_primitives, VertexParts vertexParts) { - // index id - if (IDx < numIndices) { + // index id + if (IDx < numIndices) { - // TODO: uncomment the following code for a start - // This is primitive assembly for triangles + // TODO: uncomment the following code for a start + // This is primitive assembly for triangles - int pid; - if (vertexParts.primitiveMode == TINYGLTF_MODE_TRIANGLES) { - int num_vertices = (int)vertexParts.primitiveType; // a triangle has 3 vertices - pid = IDx / num_vertices; - dev_primitives[pid + curPrimitiveBeginId].v[IDx % num_vertices] // (int)primitive.primitiveType] - = vertexParts.dev_verticesOut[vertexParts.dev_indices[IDx]]; - } + int pid; + if (vertexParts.primitiveMode == TINYGLTF_MODE_TRIANGLES) { + int num_vertices = (int)vertexParts.primitiveType; // a triangle has 3 vertices + pid = IDx / num_vertices; + dev_primitives[pid + curPrimitiveBeginId].v[IDx % num_vertices] // (int)primitive.primitiveType] + = vertexParts.dev_verticesOut[vertexParts.dev_indices[IDx]]; + } - // TODO: other primitive types (point, line) - } - + // TODO: other primitive types (point, line) + } + } __global__ void _rasterize(int n_primitives, int height, int width, const Primitive *primitives, Fragment *fragments) { - if (IDx >= n_primitives) return; + if (IDx >= n_primitives) return; - Primitive &primitive = primitives[IDx]; + Primitive &primitive = primitives[IDx]; - int i, j; - glm::vec3 tri[3]; - range(i, 0, 3) { - tri[i] = primitive.v[i].eyePos; // get coordinates of tri points - } + int i, j; + glm::vec3 tri[3]; + range(i, 0, 3) { + tri[i] = primitive.v[i].eyePos; // get coordinates of tri points + } - range(i, 0, height) { - range(j, 0, width) { - glm::vec3 eyePos = ; - fragments[i].eyePos = eyePos; // TODO: aren't there more fragments then pixels?? + range(i, 0, height) { + range(j, 0, width) { + glm::vec3 eyePos = ; + fragments[i].eyePos = eyePos; // TODO: aren't there more fragments then pixels?? - // TODO: are these initialized? - glm::vec2 pos2d(eyePos); // x and y coord of eyePos + // TODO: are these initialized? + glm::vec2 pos2d(eyePos); // x and y coord of eyePos - glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, pos2d); - if (isBarycentricCoordInBounds(barycentricCoord)) { - eyePos.z = atomicMax(&eyePos.z, ) - } - } - } + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, pos2d); + if (isBarycentricCoordInBounds(barycentricCoord)) { + eyePos.z = atomicMax(&eyePos.z, ) + } + } + } + +} +glm::vec3 intersect(glm::vec3 vector, glm::mat3 plane) { + glm::vec3 x = glm::inverse(plane) * vector; + float t = 1 / glm::dot(x, glm::vec3(1.0f)); + return t * vector; } /** @@ -708,61 +714,61 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g int sideLength2d = 8; dim3 blockSize2d(sideLength2d, sideLength2d); dim3 blockCount2d((width - 1) / blockSize2d.x + 1, - (height - 1) / blockSize2d.y + 1); - - // Execute your rasterization pipeline here - // (See README for rasterization pipeline outline.) - - // Vertex Process & primitive assembly - - curPrimitiveBeginId = 0; - { - dim3 numThreadsPerBlock(128); - - auto it = mesh2vertexParts.begin(); - auto itEnd = mesh2vertexParts.end(); - - for (; it != itEnd; ++it) { - auto parts = (it->second).begin(); // each primitive - auto partsEnd = (it->second).end(); - for (; parts != partsEnd; ++parts) { - dim3 numBlocksForVertices((parts->numVertices + numThreadsPerBlock.x - 1) / numThreadsPerBlock.x); - dim3 numBlocksForIndices((parts->numIndices + numThreadsPerBlock.x - 1) / numThreadsPerBlock.x); - - _vertexTransformAndAssembly << < numBlocksForVertices, numThreadsPerBlock >> > - (parts->numVertices, - *parts, - MVP, MV, MV_normal, - width, height); - checkCUDAError("Vertex Processing"); - cudaDeviceSynchronize(); - _primitiveAssembly << < numBlocksForIndices, numThreadsPerBlock >> > - (parts->numIndices, - curPrimitiveBeginId, - dev_primitives, - *parts); - checkCUDAError("Primitive Assembly"); - - curPrimitiveBeginId += parts->numPrimitives; - } - } - - checkCUDAError("Vertex Processing and Primitive Assembly"); - } - - int numPixels = width * height; - cudaMemset(dev_fragmentBuffer, 0, numPixels * sizeof(Fragment)); - initDepth << > >(width, height, dev_depth); - - // TODO: rasterize - _rasterize(totalNumPrimitives, height, width, - dev_primitives, dev_fragmentBuffer); + (height - 1) / blockSize2d.y + 1); + + // Execute your rasterization pipeline here + // (See README for rasterization pipeline outline.) + + // Vertex Process & primitive assembly + + curPrimitiveBeginId = 0; + { + dim3 numThreadsPerBlock(128); + + auto it = mesh2vertexParts.begin(); + auto itEnd = mesh2vertexParts.end(); + + for (; it != itEnd; ++it) { + auto parts = (it->second).begin(); // each primitive + auto partsEnd = (it->second).end(); + for (; parts != partsEnd; ++parts) { + dim3 numBlocksForVertices((parts->numVertices + numThreadsPerBlock.x - 1) / numThreadsPerBlock.x); + dim3 numBlocksForIndices((parts->numIndices + numThreadsPerBlock.x - 1) / numThreadsPerBlock.x); + + _vertexTransformAndAssembly << < numBlocksForVertices, numThreadsPerBlock >> > + (parts->numVertices, + *parts, + MVP, MV, MV_normal, + width, height); + checkCUDAError("Vertex Processing"); + cudaDeviceSynchronize(); + _primitiveAssembly << < numBlocksForIndices, numThreadsPerBlock >> > + (parts->numIndices, + curPrimitiveBeginId, + dev_primitives, + *parts); + checkCUDAError("Primitive Assembly"); + + curPrimitiveBeginId += parts->numPrimitives; + } + } + + checkCUDAError("Vertex Processing and Primitive Assembly"); + } + + int numPixels = width * height; + cudaMemset(dev_fragmentBuffer, 0, numPixels * sizeof(Fragment)); + initDepth << > >(width, height, dev_depth); + + // TODO: rasterize + _rasterize(totalNumPrimitives, height, width, + dev_primitives, dev_fragmentBuffer); // Copy depthbuffer colors into framebuffer - render << > >(width, height, dev_fragmentBuffer, dev_framebuffer); - checkCUDAError("fragment shader"); + render << > >(width, height, dev_fragmentBuffer, dev_framebuffer); + checkCUDAError("fragment shader"); // Copy framebuffer into OpenGL buffer for OpenGL previewing sendImageToPBO<<>>(pbo, width, height, dev_framebuffer); checkCUDAError("copy render result to pbo"); @@ -775,36 +781,36 @@ void rasterizeFree() { // deconstruct primitives attribute/indices device buffer - auto it(mesh2vertexParts.begin()); - auto itEnd(mesh2vertexParts.end()); - for (; it != itEnd; ++it) { - for (auto p = it->second.begin(); p != it->second.end(); ++p) { - cudaFree(p->dev_indices); - cudaFree(p->dev_position); - cudaFree(p->dev_normal); - cudaFree(p->dev_texcoord0); - cudaFree(p->dev_diffuseTex); + auto it(mesh2vertexParts.begin()); + auto itEnd(mesh2vertexParts.end()); + for (; it != itEnd; ++it) { + for (auto p = it->second.begin(); p != it->second.end(); ++p) { + cudaFree(p->dev_indices); + cudaFree(p->dev_position); + cudaFree(p->dev_normal); + cudaFree(p->dev_texcoord0); + cudaFree(p->dev_diffuseTex); - cudaFree(p->dev_verticesOut); + cudaFree(p->dev_verticesOut); - - //TODO: release other attributes and materials - } - } + + //TODO: release other attributes and materials + } + } - //////////// + //////////// cudaFree(dev_primitives); dev_primitives = NULL; - cudaFree(dev_fragmentBuffer); - dev_fragmentBuffer = NULL; + cudaFree(dev_fragmentBuffer); + dev_fragmentBuffer = NULL; cudaFree(dev_framebuffer); dev_framebuffer = NULL; - cudaFree(dev_depth); - dev_depth = NULL; + cudaFree(dev_depth); + dev_depth = NULL; checkCUDAError("rasterize Free"); } From 53e9433f71bb3b7774c394b9d5266730b4ea4a34 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Fri, 21 Oct 2016 19:20:32 -0400 Subject: [PATCH 05/37] found the macro bug and the depthInit bugs. Now I can't get it to color by primitve. but it will work eventually! --- src/rasterize.cu | 242 ++++++++++++++++++++++++++++++----------------- 1 file changed, 154 insertions(+), 88 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 74671fe..0ba3dfe 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -18,11 +18,15 @@ #include #include -# define IDx (blockIdx.x * blockDim.x) + threadIdx.x -# define IDy (blockIdx.y * blockDim.y) + threadIdx.y -# define DEBUG 1 -# define debug0(...) if (DEBUG = 1 && id = 0) { printf (__VA_ARGS__); } -# define range(i, start, stop) for (i = start; i < stop; i++) +#define IDx ((blockIdx.x * blockDim.x) + threadIdx.x) +#define IDy ((blockIdx.y * blockDim.y) + threadIdx.y) +#define MAX_DEPTH 10000.0f +#define DEPTH_QUANTUM (float)(INT_MAX / MAX_DEPTH) + +#define DEBUG 1 +#define debug(...) if (DEBUG == 1) { printf (__VA_ARGS__); } +#define debug0(...) if (DEBUG == 1 && id == 0) { printf (__VA_ARGS__); } +#define range(i, start, stop) for (i = start; i < stop; i++) namespace { @@ -95,7 +99,7 @@ namespace { // ... // Vertex Out, vertex used for rasterization, this is changing every frame - Vertex* dev_verticesOut; + Vertex* dev_vertices; // TODO: add more attributes when needed }; @@ -113,16 +117,18 @@ static Primitive *dev_primitives = NULL; static Fragment *dev_fragmentBuffer = NULL; static glm::vec3 *dev_framebuffer = NULL; -static int * dev_depth = NULL; // you might need this buffer when doing depth test +static int *dev_depth = NULL; // you might need this buffer when doing depth test /** * Kernel that writes the image to the OpenGL PBO directly. */ __global__ -void sendImageToPBO(uchar4 *pbo, int w, int h, glm::vec3 *image) { - int index = IDx + (IDy * w); +void _sendImageToPBO(uchar4 *pbo, int w, int h, glm::vec3 *image) { + int x = IDx; + int y = IDy; + int index = x + (y * w); - if (IDx < w && IDy < h) { + if (x < w && y < h) { glm::vec3 color; color.x = glm::clamp(image[index].x, 0.0f, 1.0f) * 255.0; color.y = glm::clamp(image[index].y, 0.0f, 1.0f) * 255.0; @@ -139,29 +145,29 @@ void sendImageToPBO(uchar4 *pbo, int w, int h, glm::vec3 *image) { * Writes fragment colors to the framebuffer */ __global__ -void render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffer) { - int index = IDx + (IDy * w); - - if (IDx < w && IDy < h) { - framebuffer[index] = fragmentBuffer[index].color; +void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffer) { + int x = IDx; + int y = IDy; + int index = x + (y * w); - // TODO: add your fragment shader code here - - } + if (x >= w || y >= h) return; + framebuffer[index] = fragmentBuffer[index].color; } /** * Called once at the beginning of the program to allocate memory. */ void rasterizeInit(int w, int h) { - width = w; - height = h; + width = w; + height = h; + cudaFree(dev_fragmentBuffer); cudaMalloc(&dev_fragmentBuffer, width * height * sizeof(Fragment)); cudaMemset(dev_fragmentBuffer, 0, width * height * sizeof(Fragment)); - cudaFree(dev_framebuffer); - cudaMalloc(&dev_framebuffer, width * height * sizeof(glm::vec3)); - cudaMemset(dev_framebuffer, 0, width * height * sizeof(glm::vec3)); + + cudaFree(dev_framebuffer); + cudaMalloc(&dev_framebuffer, width * height * sizeof(glm::vec3)); + cudaMemset(dev_framebuffer, 0, width * height * sizeof(glm::vec3)); cudaFree(dev_depth); cudaMalloc(&dev_depth, width * height * sizeof(int)); @@ -170,12 +176,12 @@ void rasterizeInit(int w, int h) { } __global__ -void initDepth(int w, int h, int * depth) +void _initDepth(int w, int h, int *depth) { if (IDx < w && IDy < h) { int index = IDx + (IDy * w); - depth[index] = INT_MAX; + depth[index] = FLT_MAX; } } @@ -185,7 +191,9 @@ void initDepth(int w, int h, int * depth) * One thread is responsible for copying one component */ __global__ -void _deviceBufferCopy(int N, BufferByte* dev_dst, const BufferByte* dev_src, int n, int byteStride, int byteOffset, int componentTypeByteSize) { +void _deviceBufferCopy( +int N, BufferByte* dev_dst, const BufferByte* dev_src, +int n, int byteStride, int byteOffset, int componentTypeByteSize) { // Attribute (vec3 position) // component (3 * float) @@ -395,7 +403,7 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { (BufferByte*)dev_indices, dev_bufferView, n, - indexAccessor.byteStr ide, + indexAccessor.byteStride, indexAccessor.byteOffset, componentTypeByteSize); @@ -623,88 +631,148 @@ void _vertexTransformAndAssembly( const int width, const int height) { // vertex id - int x = 0; int vid = IDx; - if (vid < numVertices) { + int id = vid; + if (vid >= numVertices) return; - Vertex &vertex = vertexParts.dev_verticesOut[vid]; + Vertex &vertex = vertexParts.dev_vertices[vid]; - // Multiply the MVP matrix for each vertex position, this will transform everything into clipping space - // Then divide the pos by its w element to transform into NDC space - // Finally transform x and y to viewport space - vertex.eyePos = vertexParts.dev_position[vid]; + // Multiply the MVP matrix for each vertex position, this will transform everything into clipping space + // Then divide the pos by its w element to transform into NDC space + // Finally transform x and y to viewport space + glm::vec4 modelPos = glm::vec4(vertexParts.dev_position[vid], 1.0); // this is in model space + vertex.pos = (float)width / 2.0f * (modelPos / modelPos.w + 1.0f); + // TODO go over this carefully - glm::vec4 pos(vertex.eyePos, 1.0); - // TODO: Apply vertex transformation here + // TODO: Apply vertex transformation here - // Assemble all attribute arrays into the primitive array - vertex.eyeNor = vertexParts.dev_normal[vid]; - vertex.texcoord0 = vertexParts.dev_texcoord0[vid]; - vertex.dev_diffuseTex = vertexParts.dev_diffuseTex; - } + // Assemble all attribute arrays into the primitive array + //vertex.eyePos = vertexParts.dev_normal[vid]; + //vertex.eyeNor = vertexParts.dev_normal[vid]; + //vertex.texcoord0 = vertexParts.dev_texcoord0[vid]; + //vertex.dev_diffuseTex = vertexParts.dev_diffuseTex; } static int curPrimitiveBeginId = 0; -__global__ +__global__ void _primitiveAssembly(int numIndices, int curPrimitiveBeginId, Primitive* dev_primitives, VertexParts vertexParts) { // index id - if (IDx < numIndices) { + int iid = IDx; + + if (iid < numIndices) { // TODO: uncomment the following code for a start - // This is primitive assembly for triangles + //This is primitive assembly for triangles - int pid; + int pid; // id for cur primitives vector if (vertexParts.primitiveMode == TINYGLTF_MODE_TRIANGLES) { - int num_vertices = (int)vertexParts.primitiveType; // a triangle has 3 vertices - pid = IDx / num_vertices; - dev_primitives[pid + curPrimitiveBeginId].v[IDx % num_vertices] // (int)primitive.primitiveType] - = vertexParts.dev_verticesOut[vertexParts.dev_indices[IDx]]; + pid = iid / (int)vertexParts.primitiveType; + dev_primitives[pid + curPrimitiveBeginId].v[iid % (int)vertexParts.primitiveType] + = vertexParts.dev_vertices[vertexParts.dev_indices[iid]]; } + int id = IDx; //START HERE // TODO: other primitive types (point, line) } - + +} + +__device__ +glm::vec3 intersect(glm::vec3 vector, glm::mat3 plane) { + glm::vec3 x = glm::inverse(plane) * vector; + float t = 1 / glm::dot(x, glm::vec3(1.0f)); + return t * vector; +} + + +__device__ +int getFragmentDepth(int x, int y, glm::vec3 tri[3]) { + + // test if fragment is in primitive + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(x, y)); + if (isBarycentricCoordInBounds(barycentricCoord)) { + // fragment is in primitive + + // get depth of fragment represented as an integer + int i; + float depth = 0; + range(i, 0, 3) { + glm::vec3 weighted = barycentricCoord[i] * tri[i]; + depth += weighted.z; + } + return depth > MAX_DEPTH ? INT_MAX : (int)(depth * DEPTH_QUANTUM); + } + else { + return INT_MAX; + } + +} + +__device__ +int getIndex(int i, int j, int width) { + return i * width + j; } +__global__ +void test() { + debug("test "); +} + + __global__ void _rasterize(int n_primitives, int height, int width, -const Primitive *primitives, -Fragment *fragments) { +const Primitive *primitives, int *depths, Fragment *fragments) { if (IDx >= n_primitives) return; - Primitive &primitive = primitives[IDx]; - int i, j; + Primitive primitive = primitives[IDx]; glm::vec3 tri[3]; - range(i, 0, 3) { - tri[i] = primitive.v[i].eyePos; // get coordinates of tri points + range(i, 0, 3) { + // get coordinates of tri points + tri[i] = glm::vec3(primitive.v[i].pos); } range(i, 0, height) { range(j, 0, width) { - glm::vec3 eyePos = ; - fragments[i].eyePos = eyePos; // TODO: aren't there more fragments then pixels?? + int index = getIndex(i, j, width); + Fragment &fragment = fragments[index]; + fragment.color = glm::vec3(0.0f); - // TODO: are these initialized? - glm::vec2 pos2d(eyePos); // x and y coord of eyePos + // int depth = getFragmentDepth(i, j, tri); - glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, pos2d); - if (isBarycentricCoordInBounds(barycentricCoord)) { - eyePos.z = atomicMax(&eyePos.z, ) - } + // // assign fragEyePos.z to dev_depth[i] iff it is smaller + // // (fragment is closer to camera) + // int index = getIndex(i, j, width); + // atomicMin(depths + index, depth); } } -} - -glm::vec3 intersect(glm::vec3 vector, glm::mat3 plane) { - glm::vec3 x = glm::inverse(plane) * vector; - float t = 1 / glm::dot(x, glm::vec3(1.0f)); - return t * vector; + __syncthreads(); // wait for all depths to be updated + + range(i, 0, height) { + range(j, 0, width) { + int index = getIndex(i, j, width); + //int depth = getFragmentDepth(i, j, tri); + //if (depth < depths[index] + EPSILON) { + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(i, j)); + if (isBarycentricCoordInBounds(barycentricCoord)) { + Fragment &fragment = fragments[index]; + //Vertex vertex = primitive.v[0]; // TODO: move common fields into Primitive + + //fragment.dev_diffuseTex = vertex.dev_diffuseTex; + //fragment.eyeNor = vertex.eyeNor; + //fragment.eyePos = vertex.eyePos; + //fragment.texcoord0 = vertex.texcoord0; + + ////TODO: get rid of this + fragment.color = glm::vec3(1.0f); + } + } + } } /** @@ -757,21 +825,20 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g } int numPixels = width * height; - cudaMemset(dev_fragmentBuffer, 0, numPixels * sizeof(Fragment)); - initDepth << > >(width, height, dev_depth); + _initDepth << > >(width, height, dev_depth); // TODO: rasterize - _rasterize(totalNumPrimitives, height, width, - dev_primitives, dev_fragmentBuffer); + _rasterize<< > > + (totalNumPrimitives, height, width, + dev_primitives, dev_depth, dev_fragmentBuffer); + checkCUDAError("rasterizer"); - - - // Copy depthbuffer colors into framebuffer - render << > >(width, height, dev_fragmentBuffer, dev_framebuffer); + // Copy depthbuffer colors into framebuffer + _render << > >(width, height, dev_fragmentBuffer, dev_framebuffer); checkCUDAError("fragment shader"); - // Copy framebuffer into OpenGL buffer for OpenGL previewing - sendImageToPBO<<>>(pbo, width, height, dev_framebuffer); - checkCUDAError("copy render result to pbo"); + // Copy framebuffer into OpenGL buffer for OpenGL previewing + _sendImageToPBO<<>>(pbo, width, height, dev_framebuffer); + checkCUDAError("copy render result to pbo"); } /** @@ -790,8 +857,7 @@ void rasterizeFree() { cudaFree(p->dev_normal); cudaFree(p->dev_texcoord0); cudaFree(p->dev_diffuseTex); - - cudaFree(p->dev_verticesOut); + cudaFree(p->dev_vertices); //TODO: release other attributes and materials @@ -800,17 +866,17 @@ void rasterizeFree() { //////////// - cudaFree(dev_primitives); - dev_primitives = NULL; + cudaFree(dev_primitives); + dev_primitives = NULL; cudaFree(dev_fragmentBuffer); dev_fragmentBuffer = NULL; - cudaFree(dev_framebuffer); - dev_framebuffer = NULL; + cudaFree(dev_framebuffer); + dev_framebuffer = NULL; cudaFree(dev_depth); dev_depth = NULL; - checkCUDAError("rasterize Free"); + checkCUDAError("rasterize Free"); } From 54b93044b2d5eacfd6e0584d1a0fabea3ae3d1df Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Sun, 23 Oct 2016 18:55:08 -0400 Subject: [PATCH 06/37] triangle is working. added depth. put common fields in primitve. --- src/rasterize.cu | 53 +++++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 0ba3dfe..9a3ca2e 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -54,15 +54,15 @@ namespace { glm::vec3 eyePos; // eye space position used for shading glm::vec3 eyeNor; // eye space normal used for shading, cuz normal will go wrong after perspective transformation // glm::vec3 col; - glm::vec2 texcoord0; - TextureData* dev_diffuseTex = NULL; - // int texWidth, texHeight; - // ... }; struct Primitive { PrimitiveType primitiveType = Triangle; // C++ 11 init Vertex v[3]; + glm::vec2 texcoord0; + TextureData* dev_diffuseTex = NULL; + // int texWidth, texHeight; + // ... }; struct Fragment { @@ -739,15 +739,16 @@ const Primitive *primitives, int *depths, Fragment *fragments) { range(i, 0, height) { range(j, 0, width) { int index = getIndex(i, j, width); - Fragment &fragment = fragments[index]; - fragment.color = glm::vec3(0.0f); - // int depth = getFragmentDepth(i, j, tri); + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(i, j)); + if (isBarycentricCoordInBounds(barycentricCoord)) { + int depth = getFragmentDepth(i, j, tri); - // // assign fragEyePos.z to dev_depth[i] iff it is smaller - // // (fragment is closer to camera) - // int index = getIndex(i, j, width); - // atomicMin(depths + index, depth); + // assign fragEyePos.z to dev_depth[i] iff it is smaller + // (fragment is closer to camera) + int index = getIndex(i, j, width); + atomicMin(depths + index, depth); + } } } @@ -756,20 +757,22 @@ const Primitive *primitives, int *depths, Fragment *fragments) { range(i, 0, height) { range(j, 0, width) { int index = getIndex(i, j, width); - //int depth = getFragmentDepth(i, j, tri); - //if (depth < depths[index] + EPSILON) { - glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(i, j)); - if (isBarycentricCoordInBounds(barycentricCoord)) { - Fragment &fragment = fragments[index]; - //Vertex vertex = primitive.v[0]; // TODO: move common fields into Primitive - - //fragment.dev_diffuseTex = vertex.dev_diffuseTex; - //fragment.eyeNor = vertex.eyeNor; - //fragment.eyePos = vertex.eyePos; - //fragment.texcoord0 = vertex.texcoord0; - - ////TODO: get rid of this - fragment.color = glm::vec3(1.0f); + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(i, j)); + if (isBarycentricCoordInBounds(barycentricCoord)) { + + int depth = getFragmentDepth(i, j, tri); + if (depth == depths[index]) { + Fragment &fragment = fragments[index]; + //Vertex vertex = primitive.v[0]; // TODO: move common fields into Primitive + + //fragment.dev_diffuseTex = vertex.dev_diffuseTex; + //fragment.eyeNor = vertex.eyeNor; + //fragment.eyePos = vertex.eyePos; + //fragment.texcoord0 = vertex.texcoord0; + + ////TODO: get rid of this + fragment.color = glm::vec3(1.0f); + } } } } From 8c26fbecf5ea23211a0c28b2e335b29d88813417 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Sun, 23 Oct 2016 19:41:32 -0400 Subject: [PATCH 07/37] view transforms are working (I think) --- src/rasterize.cu | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 9a3ca2e..bdddcfe 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -17,6 +17,7 @@ #include "rasterize.h" #include #include +#include #define IDx ((blockIdx.x * blockDim.x) + threadIdx.x) #define IDy ((blockIdx.y * blockDim.y) + threadIdx.y) @@ -51,8 +52,8 @@ namespace { // The attributes listed below might be useful, // but always feel free to modify on your own - glm::vec3 eyePos; // eye space position used for shading - glm::vec3 eyeNor; // eye space normal used for shading, cuz normal will go wrong after perspective transformation + glm::vec3 viewPos; // eye space position used for shading + glm::vec3 viewNor; // eye space normal used for shading, cuz normal will go wrong after perspective transformation // glm::vec3 col; }; @@ -88,7 +89,7 @@ namespace { // Vertex, const after loaded VertexIndex* dev_indices; - VertexAttributePosition* dev_position; + VertexAttributePosition* dev_pos; VertexAttributeNormal* dev_normal; VertexAttributeTexcoord* dev_texcoord0; @@ -640,15 +641,15 @@ void _vertexTransformAndAssembly( // Multiply the MVP matrix for each vertex position, this will transform everything into clipping space // Then divide the pos by its w element to transform into NDC space // Finally transform x and y to viewport space - glm::vec4 modelPos = glm::vec4(vertexParts.dev_position[vid], 1.0); // this is in model space - vertex.pos = (float)width / 2.0f * (modelPos / modelPos.w + 1.0f); - // TODO go over this carefully - // TODO: Apply vertex transformation here + glm::vec4 modelPos = glm::vec4(vertexParts.dev_pos[vid], 1); // this is in model space + vertex.viewPos = glm::vec3(MV * modelPos); + vertex.viewNor = glm::vec3(MV_normal * vertexParts.dev_normal[vid]); + glm::vec4 clipPos(MVP * modelPos); + glm::vec4 screenDims(width, height, 1, 1); + vertex.pos = screenDims * (clipPos + glm::vec4(1, 1, 0, 0)) / clipPos.w; // HELP: what is the fourth dimension for? // Assemble all attribute arrays into the primitive array - //vertex.eyePos = vertexParts.dev_normal[vid]; - //vertex.eyeNor = vertexParts.dev_normal[vid]; //vertex.texcoord0 = vertexParts.dev_texcoord0[vid]; //vertex.dev_diffuseTex = vertexParts.dev_diffuseTex; } @@ -856,7 +857,7 @@ void rasterizeFree() { for (; it != itEnd; ++it) { for (auto p = it->second.begin(); p != it->second.end(); ++p) { cudaFree(p->dev_indices); - cudaFree(p->dev_position); + cudaFree(p->dev_pos); cudaFree(p->dev_normal); cudaFree(p->dev_texcoord0); cudaFree(p->dev_diffuseTex); From 67be3130d56b9ac6c9561ec65d881634967f3bed Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Sun, 23 Oct 2016 20:04:42 -0400 Subject: [PATCH 08/37] got most of _rasterize working on triangle --- src/rasterize.cu | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index bdddcfe..e0923c5 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -23,6 +23,8 @@ #define IDy ((blockIdx.y * blockDim.y) + threadIdx.y) #define MAX_DEPTH 10000.0f #define DEPTH_QUANTUM (float)(INT_MAX / MAX_DEPTH) +#define getIndex(i, j, width) (i * width + j) + #define DEBUG 1 #define debug(...) if (DEBUG == 1) { printf (__VA_ARGS__); } @@ -73,8 +75,8 @@ namespace { // The attributes listed below might be useful, // but always feel free to modify on your own - glm::vec3 eyePos; // eye space position used for shading - glm::vec3 eyeNor; + glm::vec3 viewPos; // eye space position used for shading + glm::vec3 viewNor; VertexAttributeTexcoord texcoord0; TextureData* dev_diffuseTex; // ... @@ -690,6 +692,7 @@ glm::vec3 intersect(glm::vec3 vector, glm::mat3 plane) { } + __device__ int getFragmentDepth(int x, int y, glm::vec3 tri[3]) { @@ -713,17 +716,6 @@ int getFragmentDepth(int x, int y, glm::vec3 tri[3]) { } -__device__ -int getIndex(int i, int j, int width) { - return i * width + j; -} - -__global__ -void test() { - debug("test "); -} - - __global__ void _rasterize(int n_primitives, int height, int width, const Primitive *primitives, int *depths, Fragment *fragments) { @@ -758,7 +750,8 @@ const Primitive *primitives, int *depths, Fragment *fragments) { range(i, 0, height) { range(j, 0, width) { int index = getIndex(i, j, width); - glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(i, j)); + glm::vec2 viewPos = glm::vec2(i, j); + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, viewPos); if (isBarycentricCoordInBounds(barycentricCoord)) { int depth = getFragmentDepth(i, j, tri); @@ -766,9 +759,11 @@ const Primitive *primitives, int *depths, Fragment *fragments) { Fragment &fragment = fragments[index]; //Vertex vertex = primitive.v[0]; // TODO: move common fields into Primitive - //fragment.dev_diffuseTex = vertex.dev_diffuseTex; - //fragment.eyeNor = vertex.eyeNor; - //fragment.eyePos = vertex.eyePos; + fragment.dev_diffuseTex = primitive.dev_diffuseTex; + fragment.viewNor = primitive.v[0].viewNor; + fragment.viewPos = glm::vec3(viewPos, depth); + + //fragment.viewPos = vertex.eyePos; //fragment.texcoord0 = vertex.texcoord0; ////TODO: get rid of this From e294bce4a9c6b86f4f883a6c789a77b763217393 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Tue, 25 Oct 2016 14:35:05 -0400 Subject: [PATCH 09/37] everything is crashing :(' --- src/rasterize.cu | 90 +++++++++++++++++++++--------------------------- 1 file changed, 40 insertions(+), 50 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index e0923c5..74c17ed 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -144,19 +144,6 @@ void _sendImageToPBO(uchar4 *pbo, int w, int h, glm::vec3 *image) { } } -/** -* Writes fragment colors to the framebuffer -*/ -__global__ -void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffer) { - int x = IDx; - int y = IDy; - int index = x + (y * w); - - if (x >= w || y >= h) return; - framebuffer[index] = fragmentBuffer[index].color; -} - /** * Called once at the beginning of the program to allocate memory. */ @@ -193,6 +180,7 @@ void _initDepth(int w, int h, int *depth) * kern function with support for stride to sometimes replace cudaMemcpy * One thread is responsible for copying one component */ + __global__ void _deviceBufferCopy( int N, BufferByte* dev_dst, const BufferByte* dev_src, @@ -684,15 +672,6 @@ void _primitiveAssembly(int numIndices, int curPrimitiveBeginId, Primitive* dev_ } -__device__ -glm::vec3 intersect(glm::vec3 vector, glm::mat3 plane) { - glm::vec3 x = glm::inverse(plane) * vector; - float t = 1 / glm::dot(x, glm::vec3(1.0f)); - return t * vector; -} - - - __device__ int getFragmentDepth(int x, int y, glm::vec3 tri[3]) { @@ -729,51 +708,62 @@ const Primitive *primitives, int *depths, Fragment *fragments) { tri[i] = glm::vec3(primitive.v[i].pos); } - range(i, 0, height) { - range(j, 0, width) { - int index = getIndex(i, j, width); + //range(i, 0, height) { + // range(j, 0, width) { + // int index = getIndex(i, j, width); - glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(i, j)); - if (isBarycentricCoordInBounds(barycentricCoord)) { - int depth = getFragmentDepth(i, j, tri); + // glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(i, j)); + // if (isBarycentricCoordInBounds(barycentricCoord)) { + // int depth = getFragmentDepth(i, j, tri); - // assign fragEyePos.z to dev_depth[i] iff it is smaller - // (fragment is closer to camera) - int index = getIndex(i, j, width); - atomicMin(depths + index, depth); - } - } - } + // // assign fragEyePos.z to dev_depth[i] iff it is smaller + // // (fragment is closer to camera) + // int index = getIndex(i, j, width); + // atomicMin(depths + index, depth); + // } + // } + //} - __syncthreads(); // wait for all depths to be updated + //__syncthreads(); // wait for all depths to be updated range(i, 0, height) { range(j, 0, width) { int index = getIndex(i, j, width); - glm::vec2 viewPos = glm::vec2(i, j); - glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, viewPos); - if (isBarycentricCoordInBounds(barycentricCoord)) { + // glm::vec2 viewPos = glm::vec2(i, j); + // glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, viewPos); + // if (isBarycentricCoordInBounds(barycentricCoord)) { - int depth = getFragmentDepth(i, j, tri); - if (depth == depths[index]) { + // int depth = getFragmentDepth(i, j, tri); + // if (depth == depths[index]) { Fragment &fragment = fragments[index]; - //Vertex vertex = primitive.v[0]; // TODO: move common fields into Primitive + // //Vertex vertex = primitive.v[0]; // TODO: move common fields into Primitive - fragment.dev_diffuseTex = primitive.dev_diffuseTex; - fragment.viewNor = primitive.v[0].viewNor; - fragment.viewPos = glm::vec3(viewPos, depth); + // fragment.dev_diffuseTex = primitive.dev_diffuseTex; + // fragment.viewNor = primitive.v[0].viewNor; + // fragment.viewPos = glm::vec3(viewPos, depth); - //fragment.viewPos = vertex.eyePos; - //fragment.texcoord0 = vertex.texcoord0; + // //fragment.viewPos = vertex.eyePos; + // //fragment.texcoord0 = vertex.texcoord0; - ////TODO: get rid of this + // ////TODO: get rid of this fragment.color = glm::vec3(1.0f); - } - } + // } + // } } } } +/** +* Writes fragment colors to the framebuffer +*/ +__global__ +void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffer) { + int index = IDx + (IDy * w); + + if (IDx >= w || IDy >= h) return; + framebuffer[index] = glm::vec3(1.0f); // fragmentBuffer[index].color; +} + /** * Perform rasterization. */ From ad037f89dc66eb703640fd78cec9914cc7598abb Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Tue, 25 Oct 2016 15:31:48 -0400 Subject: [PATCH 10/37] still debugging crashes --- src/main.cpp | 1 + src/rasterize.cu | 70 ++++++++++++++++++++++++------------------------ 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index a36b955..878a1ec 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -24,6 +24,7 @@ int main(int argc, char **argv) { return 0; } + cout << "Loading " << argv[1] << endl; tinygltf::Scene scene; tinygltf::TinyGLTFLoader loader; std::string err; diff --git a/src/rasterize.cu b/src/rasterize.cu index 74c17ed..ff8a6ea 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -612,6 +612,7 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { } +//////////////// PIPELINE CODE //////////////// __global__ @@ -622,19 +623,17 @@ void _vertexTransformAndAssembly( const int width, const int height) { // vertex id - int vid = IDx; - int id = vid; - if (vid >= numVertices) return; + if (IDx >= numVertices) return; - Vertex &vertex = vertexParts.dev_vertices[vid]; + Vertex &vertex = vertexParts.dev_vertices[IDx]; // Multiply the MVP matrix for each vertex position, this will transform everything into clipping space // Then divide the pos by its w element to transform into NDC space // Finally transform x and y to viewport space // TODO: Apply vertex transformation here - glm::vec4 modelPos = glm::vec4(vertexParts.dev_pos[vid], 1); // this is in model space + glm::vec4 modelPos = glm::vec4(vertexParts.dev_pos[IDx], 1); // this is in model space vertex.viewPos = glm::vec3(MV * modelPos); - vertex.viewNor = glm::vec3(MV_normal * vertexParts.dev_normal[vid]); + vertex.viewNor = glm::vec3(MV_normal * vertexParts.dev_normal[IDx]); glm::vec4 clipPos(MVP * modelPos); glm::vec4 screenDims(width, height, 1, 1); vertex.pos = screenDims * (clipPos + glm::vec4(1, 1, 0, 0)) / clipPos.w; // HELP: what is the fourth dimension for? @@ -652,18 +651,16 @@ __global__ void _primitiveAssembly(int numIndices, int curPrimitiveBeginId, Primitive* dev_primitives, VertexParts vertexParts) { // index id - int iid = IDx; - - if (iid < numIndices) { + if (IDx < numIndices) { // TODO: uncomment the following code for a start //This is primitive assembly for triangles int pid; // id for cur primitives vector if (vertexParts.primitiveMode == TINYGLTF_MODE_TRIANGLES) { - pid = iid / (int)vertexParts.primitiveType; - dev_primitives[pid + curPrimitiveBeginId].v[iid % (int)vertexParts.primitiveType] - = vertexParts.dev_vertices[vertexParts.dev_indices[iid]]; + pid = IDx / (int)vertexParts.primitiveType; + dev_primitives[pid + curPrimitiveBeginId].v[IDx % (int)vertexParts.primitiveType] + = vertexParts.dev_vertices[vertexParts.dev_indices[IDx]]; } int id = IDx; //START HERE @@ -726,29 +723,32 @@ const Primitive *primitives, int *depths, Fragment *fragments) { //__syncthreads(); // wait for all depths to be updated - range(i, 0, height) { - range(j, 0, width) { - int index = getIndex(i, j, width); - // glm::vec2 viewPos = glm::vec2(i, j); - // glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, viewPos); - // if (isBarycentricCoordInBounds(barycentricCoord)) { - - // int depth = getFragmentDepth(i, j, tri); - // if (depth == depths[index]) { - Fragment &fragment = fragments[index]; - // //Vertex vertex = primitive.v[0]; // TODO: move common fields into Primitive - - // fragment.dev_diffuseTex = primitive.dev_diffuseTex; - // fragment.viewNor = primitive.v[0].viewNor; - // fragment.viewPos = glm::vec3(viewPos, depth); - - // //fragment.viewPos = vertex.eyePos; - // //fragment.texcoord0 = vertex.texcoord0; - - // ////TODO: get rid of this - fragment.color = glm::vec3(1.0f); + range(i, 0, height / 1.5) { + range(j, 0, width / 1.5) { + int index = getIndex(i, j, width); // up to (height - 1) * width + (width - 1) = height * width - 1 + if (index >= 0 && index < height * width) { + // glm::vec2 viewPos = glm::vec2(i, j); + // glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, viewPos); + // if (isBarycentricCoordInBounds(barycentricCoord)) { + + // int depth = getFragmentDepth(i, j, tri); + // if (depth == depths[index]) { + Fragment &fragment = fragments[height * width - 1]; + // //Vertex vertex = primitive.v[0]; // TODO: move common fields into Primitive + + // fragment.dev_diffuseTex = primitive.dev_diffuseTex; + // fragment.viewNor = primitive.v[0].viewNor; + // fragment.viewPos = glm::vec3(viewPos, depth); + + // //fragment.viewPos = vertex.eyePos; + // //fragment.texcoord0 = vertex.texcoord0; + + // ////TODO: get rid of this + fragment.color = glm::vec3(1.0f); + //int id = IDx; + //debug0("WTF: index=%d\n ", index); // } - // } + } } } } @@ -761,7 +761,7 @@ void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffe int index = IDx + (IDy * w); if (IDx >= w || IDy >= h) return; - framebuffer[index] = glm::vec3(1.0f); // fragmentBuffer[index].color; + framebuffer[index] = fragmentBuffer[index].color; } /** From 96d26c262fc9702a09953841dc579beed5dbe1da Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Tue, 25 Oct 2016 17:56:40 -0400 Subject: [PATCH 11/37] got a shadow ducky --- src/rasterize.cu | 129 +++++++++++++++++++++---------------------- src/rasterizeTools.h | 12 ++++ 2 files changed, 74 insertions(+), 67 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index ff8a6ea..f1d1a6e 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -54,15 +54,15 @@ namespace { // The attributes listed below might be useful, // but always feel free to modify on your own - glm::vec3 viewPos; // eye space position used for shading - glm::vec3 viewNor; // eye space normal used for shading, cuz normal will go wrong after perspective transformation + glm::vec3 viewPos; // eye space position used for shading + glm::vec3 viewNor; // eye space normal used for shading, cuz normal will go wrong after perspective transformation // glm::vec3 col; + glm::vec2 texcoord0; }; struct Primitive { PrimitiveType primitiveType = Triangle; // C++ 11 init Vertex v[3]; - glm::vec2 texcoord0; TextureData* dev_diffuseTex = NULL; // int texWidth, texHeight; // ... @@ -119,7 +119,6 @@ static int totalNumPrimitives = 0; static Primitive *dev_primitives = NULL; static Fragment *dev_fragmentBuffer = NULL; static glm::vec3 *dev_framebuffer = NULL; - static int *dev_depth = NULL; // you might need this buffer when doing depth test /** @@ -670,26 +669,16 @@ void _primitiveAssembly(int numIndices, int curPrimitiveBeginId, Primitive* dev_ } __device__ -int getFragmentDepth(int x, int y, glm::vec3 tri[3]) { - - // test if fragment is in primitive - glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(x, y)); - if (isBarycentricCoordInBounds(barycentricCoord)) { - // fragment is in primitive - - // get depth of fragment represented as an integer - int i; - float depth = 0; - range(i, 0, 3) { - glm::vec3 weighted = barycentricCoord[i] * tri[i]; - depth += weighted.z; - } - return depth > MAX_DEPTH ? INT_MAX : (int)(depth * DEPTH_QUANTUM); - } - else { - return INT_MAX; +float getFragmentDepth(glm::vec3 bcCoord, glm::vec3 tri[3]) { + // get depth of fragment represented as an integer + int i; + float depth = 0; + +// interpolate vertex depths + range(i, 0, 3) { + depth += bcCoord[i] * tri[i].z; } - + return depth > MAX_DEPTH ? INT_MAX : depth * DEPTH_QUANTUM; } __global__ @@ -705,49 +694,51 @@ const Primitive *primitives, int *depths, Fragment *fragments) { tri[i] = glm::vec3(primitive.v[i].pos); } - //range(i, 0, height) { - // range(j, 0, width) { - // int index = getIndex(i, j, width); + range(i, 0, height) { + range(j, 0, width) { + int index = getIndex(i, j, width); + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(i, j)); + if (isBarycentricCoordInBounds(barycentricCoord)) { + int depth = getFragmentDepth(barycentricCoord, tri); + + // assign fragEyePos.z to dev_depth[i] iff it is smaller + // (fragment is closer to camera) + int index = getIndex(i, j, width); + atomicMin(depths + index, depth); + } + } + } - // glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(i, j)); - // if (isBarycentricCoordInBounds(barycentricCoord)) { - // int depth = getFragmentDepth(i, j, tri); + __syncthreads(); // wait for all depths to be updated - // // assign fragEyePos.z to dev_depth[i] iff it is smaller - // // (fragment is closer to camera) - // int index = getIndex(i, j, width); - // atomicMin(depths + index, depth); - // } - // } - //} + range(i, 0, height - 100) { + range(j, 0, width - 100) { + int index = getIndex(i, j, width); // up to (height - 1) * width + (width - 1) = height * width - 1 + glm::vec2 viewPos = glm::vec2(i, j); + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, viewPos); + if (isBarycentricCoordInBounds(barycentricCoord)) { + float depth = getFragmentDepth(barycentricCoord, tri); + if ((int)depth == depths[index]) { + Fragment &fragment = fragments[index]; + Vertex vertex = primitive.v[0]; // TODO: move common fields into Primitive + + //fragment.dev_diffuseTex = primitive.dev_diffuseTex; + int k; + fragment.viewPos = glm::vec3(0); + fragment.texcoord0 = glm::vec2(0); + range(k, 0, 3) { + float weight = barycentricCoord[k]; + Vertex v = primitive.v[k]; + fragment.viewPos += weight * v.viewNor; + fragment.texcoord0 += weight * v.texcoord0; + } - //__syncthreads(); // wait for all depths to be updated + //fragment.viewNor = primitive.v[0].viewNor; + fragment.viewPos = glm::vec3(viewPos, depth); - range(i, 0, height / 1.5) { - range(j, 0, width / 1.5) { - int index = getIndex(i, j, width); // up to (height - 1) * width + (width - 1) = height * width - 1 - if (index >= 0 && index < height * width) { - // glm::vec2 viewPos = glm::vec2(i, j); - // glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, viewPos); - // if (isBarycentricCoordInBounds(barycentricCoord)) { - - // int depth = getFragmentDepth(i, j, tri); - // if (depth == depths[index]) { - Fragment &fragment = fragments[height * width - 1]; - // //Vertex vertex = primitive.v[0]; // TODO: move common fields into Primitive - - // fragment.dev_diffuseTex = primitive.dev_diffuseTex; - // fragment.viewNor = primitive.v[0].viewNor; - // fragment.viewPos = glm::vec3(viewPos, depth); - - // //fragment.viewPos = vertex.eyePos; - // //fragment.texcoord0 = vertex.texcoord0; - - // ////TODO: get rid of this - fragment.color = glm::vec3(1.0f); - //int id = IDx; - //debug0("WTF: index=%d\n ", index); - // } + // TODO: get rid of: + fragment.color = glm::vec3(1.0f); + } } } } @@ -768,19 +759,22 @@ void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffe * Perform rasterization. */ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const glm::mat3 MV_normal) { - int sideLength2d = 8; - dim3 blockSize2d(sideLength2d, sideLength2d); + int sideLength = 8; + dim3 blockSize2d(sideLength, sideLength); dim3 blockCount2d((width - 1) / blockSize2d.x + 1, (height - 1) / blockSize2d.y + 1); // Execute your rasterization pipeline here + cudaMemset(dev_primitives, 0, width * height * sizeof(Primitive)); + cudaMemset(dev_fragmentBuffer, 0, width * height * sizeof(Fragment)); + // (See README for rasterization pipeline outline.) // Vertex Process & primitive assembly + dim3 numThreadsPerBlock(128); curPrimitiveBeginId = 0; { - dim3 numThreadsPerBlock(128); auto it = mesh2vertexParts.begin(); auto itEnd = mesh2vertexParts.end(); @@ -813,11 +807,12 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g checkCUDAError("Vertex Processing and Primitive Assembly"); } - int numPixels = width * height; _initDepth << > >(width, height, dev_depth); + cudaMemset(dev_framebuffer, 0, width * height * sizeof(Fragment)); // TODO: rasterize - _rasterize<< > > + dim3 blockSize = totalNumPrimitives / numThreadsPerBlock.x + 1; + _rasterize<< > > (totalNumPrimitives, height, width, dev_primitives, dev_depth, dev_fragmentBuffer); checkCUDAError("rasterizer"); diff --git a/src/rasterizeTools.h b/src/rasterizeTools.h index 97e9fcd..fbf9d78 100644 --- a/src/rasterizeTools.h +++ b/src/rasterizeTools.h @@ -12,6 +12,8 @@ #include #include +#define range(i, start, stop) for (i = start; i < stop; i++) + struct AABB { glm::vec3 min; glm::vec3 max; @@ -99,3 +101,13 @@ float getZAtCoordinate(const glm::vec3 barycentricCoord, const glm::vec3 tri[3]) + barycentricCoord.y * tri[1].z + barycentricCoord.z * tri[2].z); } + +__host__ __device__ +glm::vec3 interpolateVec3(const glm::vec3 tri[3], const glm::vec3 bcCoord) { + int i; + glm::vec3 val; + range(i, 0, 3) { + val += bcCoord[i] * tri[i]; + } + return val; +} From 1088dfb403a1de3b9ea74891e7d53a6cd9eda95d Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Tue, 25 Oct 2016 18:49:10 -0400 Subject: [PATCH 12/37] got the ducky working on textures. --- src/rasterize.cu | 52 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index f1d1a6e..202c2a1 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -29,6 +29,7 @@ #define DEBUG 1 #define debug(...) if (DEBUG == 1) { printf (__VA_ARGS__); } #define debug0(...) if (DEBUG == 1 && id == 0) { printf (__VA_ARGS__); } +#define debugDuck(...) if (DEBUG == 1 && id == 36105) { printf (__VA_ARGS__); } #define range(i, start, stop) for (i = start; i < stop; i++) namespace { @@ -105,6 +106,8 @@ namespace { Vertex* dev_vertices; // TODO: add more attributes when needed + int texWidth; + int texHeight; }; } @@ -241,7 +244,7 @@ glm::mat4 getMatrixFromNodeMatrixVector(const tinygltf::Node & n) { } } else { // no matrix, use rotation, scale, translation - + if (n.translation.size() > 0) { curMatrix[3][0] = n.translation[0]; curMatrix[3][1] = n.translation[1]; @@ -514,6 +517,7 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { // You can only worry about this part once you started to // implement textures for your rasterizer TextureData* dev_diffuseTex = NULL; + int texWidth, texHeight; if (!primitive.material.empty()) { const tinygltf::Material &mat = scene.materials.at(primitive.material); printf("material.name = %s\n", mat.name.c_str()); @@ -530,6 +534,8 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { cudaMemcpy(dev_diffuseTex, &image.image.at(0), s, cudaMemcpyHostToDevice); // TODO: store the image size to your PrimitiveDevBufPointers + texWidth = image.width; + texHeight = image.height; // image.width; // image.height; @@ -538,7 +544,7 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { } } - // TODO: write your code for other materails + // TODO: write your code for other materials // You may have to take a look at tinygltfloader // You can also use the above code loading diffuse material as a start point } @@ -573,7 +579,9 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { dev_diffuseTex, - dev_vertex //VertexOut + dev_vertex, //VertexOut + texWidth, + texHeight }); totalNumPrimitives += numPrimitives; @@ -635,7 +643,7 @@ void _vertexTransformAndAssembly( vertex.viewNor = glm::vec3(MV_normal * vertexParts.dev_normal[IDx]); glm::vec4 clipPos(MVP * modelPos); glm::vec4 screenDims(width, height, 1, 1); - vertex.pos = screenDims * (clipPos + glm::vec4(1, 1, 0, 0)) / clipPos.w; // HELP: what is the fourth dimension for? + vertex.pos = screenDims * (clipPos / clipPos.w + glm::vec4(1, 1, 0, 0)) / 2.0f; // Assemble all attribute arrays into the primitive array //vertex.texcoord0 = vertexParts.dev_texcoord0[vid]; @@ -723,21 +731,23 @@ const Primitive *primitives, int *depths, Fragment *fragments) { Vertex vertex = primitive.v[0]; // TODO: move common fields into Primitive //fragment.dev_diffuseTex = primitive.dev_diffuseTex; - int k; - fragment.viewPos = glm::vec3(0); + fragment.viewNor = glm::vec3(0); fragment.texcoord0 = glm::vec2(0); + fragment.color = glm::vec3(0); + int k; range(k, 0, 3) { float weight = barycentricCoord[k]; Vertex v = primitive.v[k]; - fragment.viewPos += weight * v.viewNor; + fragment.viewNor += weight * v.viewNor; fragment.texcoord0 += weight * v.texcoord0; } //fragment.viewNor = primitive.v[0].viewNor; fragment.viewPos = glm::vec3(viewPos, depth); - // TODO: get rid of: - fragment.color = glm::vec3(1.0f); + int texIndex = getIndex(fragment.texcoord0.y, fragment.texcoord0.x, p + unsigned char tex = primitive.dev_diffuseTex[ + fragment.color = glm::vec3(1); } } } @@ -749,10 +759,26 @@ const Primitive *primitives, int *depths, Fragment *fragments) { */ __global__ void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffer) { - int index = IDx + (IDy * w); - - if (IDx >= w || IDy >= h) return; - framebuffer[index] = fragmentBuffer[index].color; + if (IDx >= w || IDy >= h) return; + int index = IDx + (IDy * w); + Fragment frag = fragmentBuffer[index]; + glm::vec3 lightPos(0); + glm::vec3 L = glm::normalize(glm::vec3(0, 1, 1));//lightPos - frag.viewPos); + glm::vec3 V = glm::normalize(-frag.viewPos); + glm::vec3 H = glm::normalize(L + V); + //glm::vec3 + float preclamp = glm::dot(frag.viewNor, H); + float intensity = saturate(glm::dot(frag.viewNor, H)) + 0.1; + int id = index; + //debugDuck("preclamp=%f frag.viewNor=%f,%f,%f H=%f,%f,%f\n", + // preclamp, + // frag.viewNor.x, + // frag.viewNor.y, + // frag.viewNor.z, + // H.x, + // H.y, + // H.z); + framebuffer[index] = intensity * frag.color; } /** From f22e613eca3243518678d117423e2903804962c1 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Tue, 25 Oct 2016 18:49:39 -0400 Subject: [PATCH 13/37] got the ducky working on textures. --- src/rasterize.cu | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/rasterize.cu b/src/rasterize.cu index 202c2a1..9af3099 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -654,6 +654,8 @@ void _vertexTransformAndAssembly( static int curPrimitiveBeginId = 0; +// START HERE: figure out where to put texture info + __global__ void _primitiveAssembly(int numIndices, int curPrimitiveBeginId, Primitive* dev_primitives, VertexParts vertexParts) { From fc17db09f53c116f4c8367d850f996ea09cf7814 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Wed, 26 Oct 2016 18:24:04 -0400 Subject: [PATCH 14/37] working ducky --- src/rasterize.cu | 110 +++++++++++++++++++++++++++++------------------ 1 file changed, 67 insertions(+), 43 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 9af3099..19d7770 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -29,7 +29,7 @@ #define DEBUG 1 #define debug(...) if (DEBUG == 1) { printf (__VA_ARGS__); } #define debug0(...) if (DEBUG == 1 && id == 0) { printf (__VA_ARGS__); } -#define debugDuck(...) if (DEBUG == 1 && id == 36105) { printf (__VA_ARGS__); } +#define debugDuck(...) if (DEBUG == 1 && id == 310031) { printf (__VA_ARGS__); } #define range(i, start, stop) for (i = start; i < stop; i++) namespace { @@ -58,14 +58,14 @@ namespace { glm::vec3 viewPos; // eye space position used for shading glm::vec3 viewNor; // eye space normal used for shading, cuz normal will go wrong after perspective transformation // glm::vec3 col; - glm::vec2 texcoord0; + VertexAttributeTexcoord texcoord0; }; struct Primitive { PrimitiveType primitiveType = Triangle; // C++ 11 init Vertex v[3]; - TextureData* dev_diffuseTex = NULL; - // int texWidth, texHeight; + TextureData* diffuseTex = NULL; + int texWidth, texHeight; // ... }; @@ -78,8 +78,7 @@ namespace { glm::vec3 viewPos; // eye space position used for shading glm::vec3 viewNor; - VertexAttributeTexcoord texcoord0; - TextureData* dev_diffuseTex; + TextureData* diffuseTex; // ... }; @@ -91,19 +90,19 @@ namespace { int numVertices; // Vertex, const after loaded - VertexIndex* dev_indices; - VertexAttributePosition* dev_pos; - VertexAttributeNormal* dev_normal; - VertexAttributeTexcoord* dev_texcoord0; + VertexIndex* indices; + VertexAttributePosition* pos; + VertexAttributeNormal* normal; + VertexAttributeTexcoord* texcoord0; // Materials, add more attributes when needed - TextureData* dev_diffuseTex; + TextureData* diffuseTex; // TextureData* dev_specularTex; // TextureData* dev_normalTex; // ... // Vertex Out, vertex used for rasterization, this is changing every frame - Vertex* dev_vertices; + Vertex* vertices; // TODO: add more attributes when needed int texWidth; @@ -536,8 +535,6 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { // TODO: store the image size to your PrimitiveDevBufPointers texWidth = image.width; texHeight = image.height; - // image.width; - // image.height; checkCUDAError("Set Texture Image data"); } @@ -632,22 +629,21 @@ void _vertexTransformAndAssembly( // vertex id if (IDx >= numVertices) return; - Vertex &vertex = vertexParts.dev_vertices[IDx]; + Vertex &vertex = vertexParts.vertices[IDx]; // Multiply the MVP matrix for each vertex position, this will transform everything into clipping space // Then divide the pos by its w element to transform into NDC space // Finally transform x and y to viewport space // TODO: Apply vertex transformation here - glm::vec4 modelPos = glm::vec4(vertexParts.dev_pos[IDx], 1); // this is in model space + glm::vec4 modelPos = glm::vec4(vertexParts.pos[IDx], 1); // this is in model space vertex.viewPos = glm::vec3(MV * modelPos); - vertex.viewNor = glm::vec3(MV_normal * vertexParts.dev_normal[IDx]); + vertex.viewNor = glm::vec3(MV_normal * vertexParts.normal[IDx]); glm::vec4 clipPos(MVP * modelPos); glm::vec4 screenDims(width, height, 1, 1); vertex.pos = screenDims * (clipPos / clipPos.w + glm::vec4(1, 1, 0, 0)) / 2.0f; // Assemble all attribute arrays into the primitive array - //vertex.texcoord0 = vertexParts.dev_texcoord0[vid]; - //vertex.dev_diffuseTex = vertexParts.dev_diffuseTex; + vertex.texcoord0 = vertexParts.texcoord0[IDx]; } @@ -657,7 +653,7 @@ static int curPrimitiveBeginId = 0; // START HERE: figure out where to put texture info __global__ -void _primitiveAssembly(int numIndices, int curPrimitiveBeginId, Primitive* dev_primitives, VertexParts vertexParts) { +void _primitiveAssembly(int numIndices, int curPrimitiveBeginId, Primitive* primitives, VertexParts vertexParts) { // index id if (IDx < numIndices) { @@ -665,14 +661,16 @@ void _primitiveAssembly(int numIndices, int curPrimitiveBeginId, Primitive* dev_ // TODO: uncomment the following code for a start //This is primitive assembly for triangles - int pid; // id for cur primitives vector if (vertexParts.primitiveMode == TINYGLTF_MODE_TRIANGLES) { - pid = IDx / (int)vertexParts.primitiveType; - dev_primitives[pid + curPrimitiveBeginId].v[IDx % (int)vertexParts.primitiveType] - = vertexParts.dev_vertices[vertexParts.dev_indices[IDx]]; + int n_vertices = vertexParts.primitiveType; + int prim_id = IDx / n_vertices + curPrimitiveBeginId; + Primitive &primitive = primitives[prim_id]; + primitive.v[IDx % n_vertices] + = vertexParts.vertices[vertexParts.indices[IDx]]; + primitive.diffuseTex = vertexParts.diffuseTex; + primitive.texHeight = vertexParts.texHeight; + primitive.texWidth = vertexParts.texWidth; } - int id = IDx; //START HERE - // TODO: other primitive types (point, line) } @@ -726,6 +724,18 @@ const Primitive *primitives, int *depths, Fragment *fragments) { int index = getIndex(i, j, width); // up to (height - 1) * width + (width - 1) = height * width - 1 glm::vec2 viewPos = glm::vec2(i, j); glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, viewPos); + + + // test textures + //if (i < primitive.texHeight && j < primitive.texWidth) { + // Fragment &fragment = fragments[index]; + // int tid = 3 * getIndex(i, j, primitive.texWidth); + // TextureData *tex = primitive.diffuseTex; + // glm::vec3 texColor(tex[tid + 0], tex[tid + 1], tex[tid + 2]); + // fragment.color = texColor; + //} + // end texture test + if (isBarycentricCoordInBounds(barycentricCoord)) { float depth = getFragmentDepth(barycentricCoord, tri); if ((int)depth == depths[index]) { @@ -733,23 +743,27 @@ const Primitive *primitives, int *depths, Fragment *fragments) { Vertex vertex = primitive.v[0]; // TODO: move common fields into Primitive //fragment.dev_diffuseTex = primitive.dev_diffuseTex; + TextureData *tex = primitive.diffuseTex; fragment.viewNor = glm::vec3(0); - fragment.texcoord0 = glm::vec2(0); fragment.color = glm::vec3(0); int k; range(k, 0, 3) { float weight = barycentricCoord[k]; - Vertex v = primitive.v[k]; + Vertex v = primitive.v[k]; // HELP: is this a call to global memory? fragment.viewNor += weight * v.viewNor; - fragment.texcoord0 += weight * v.texcoord0; + int id = index; + int x = v.texcoord0.x * primitive.texWidth; + int y = v.texcoord0.y * primitive.texHeight; + int tid = 3 * getIndex(y, x, primitive.texWidth); + TextureData *tex = primitive.diffuseTex; + glm::vec3 texColor(tex[tid + 0], tex[tid + 1], tex[tid + 2]); + fragment.color += weight * texColor; } + fragment.color /= 255.0f; //fragment.viewNor = primitive.v[0].viewNor; fragment.viewPos = glm::vec3(viewPos, depth); - int texIndex = getIndex(fragment.texcoord0.y, fragment.texcoord0.x, p - unsigned char tex = primitive.dev_diffuseTex[ - fragment.color = glm::vec3(1); } } } @@ -768,10 +782,20 @@ void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffe glm::vec3 L = glm::normalize(glm::vec3(0, 1, 1));//lightPos - frag.viewPos); glm::vec3 V = glm::normalize(-frag.viewPos); glm::vec3 H = glm::normalize(L + V); - //glm::vec3 - float preclamp = glm::dot(frag.viewNor, H); - float intensity = saturate(glm::dot(frag.viewNor, H)) + 0.1; - int id = index; + float intensity = saturate(glm::dot(frag.viewNor, H) + 0.2); + framebuffer[index] = intensity * frag.color; + + //int id = index; + //debugDuck("intensity=%.2f original-color=%.2f,%.2f,%.2f shaded-color=%.2f,%.2f,%.2f\n", + // intensity, + // frag.color.x, + // frag.color.y, + // frag.color.z, + // intensity * frag.color.x, + // intensity * frag.color.y, + // intensity * frag.color.z + // ); + //int id = index; //debugDuck("preclamp=%f frag.viewNor=%f,%f,%f H=%f,%f,%f\n", // preclamp, // frag.viewNor.x, @@ -780,7 +804,7 @@ void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffe // H.x, // H.y, // H.z); - framebuffer[index] = intensity * frag.color; + } /** @@ -864,12 +888,12 @@ void rasterizeFree() { auto itEnd(mesh2vertexParts.end()); for (; it != itEnd; ++it) { for (auto p = it->second.begin(); p != it->second.end(); ++p) { - cudaFree(p->dev_indices); - cudaFree(p->dev_pos); - cudaFree(p->dev_normal); - cudaFree(p->dev_texcoord0); - cudaFree(p->dev_diffuseTex); - cudaFree(p->dev_vertices); + cudaFree(p->indices); + cudaFree(p->pos); + cudaFree(p->normal); + cudaFree(p->texcoord0); + cudaFree(p->diffuseTex); + cudaFree(p->vertices); //TODO: release other attributes and materials From e2366d99ce2cd86aec85e8b2f61fda3d75a7b1ee Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Thu, 27 Oct 2016 15:38:04 -0400 Subject: [PATCH 15/37] solved the screwy texture problem. Now working on depth correction. --- src/rasterize.cu | 254 +++++++++++++++++++++++++------------------ src/rasterizeTools.h | 5 + 2 files changed, 155 insertions(+), 104 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 19d7770..fbc45a9 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -23,14 +23,18 @@ #define IDy ((blockIdx.y * blockDim.y) + threadIdx.y) #define MAX_DEPTH 10000.0f #define DEPTH_QUANTUM (float)(INT_MAX / MAX_DEPTH) -#define getIndex(i, j, width) (i * width + j) +#define getIndex(x, y, width) (x + y * width) #define DEBUG 1 #define debug(...) if (DEBUG == 1) { printf (__VA_ARGS__); } #define debug0(...) if (DEBUG == 1 && id == 0) { printf (__VA_ARGS__); } +#define debug1(...) if (DEBUG == 1 && id == 1) { printf (__VA_ARGS__); } #define debugDuck(...) if (DEBUG == 1 && id == 310031) { printf (__VA_ARGS__); } +//#define debugBoard(...) if (DEBUG == 1 && id == ) { printf (__VA_ARGS__); } #define range(i, start, stop) for (i = start; i < stop; i++) +#define SHOW_TEXTURE 0 +#define debug(...) if (DEBUG == 1) { printf (__VA_ARGS__); } namespace { @@ -65,7 +69,7 @@ namespace { PrimitiveType primitiveType = Triangle; // C++ 11 init Vertex v[3]; TextureData* diffuseTex = NULL; - int texWidth, texHeight; + glm::vec2 texRes; // ... }; @@ -105,8 +109,7 @@ namespace { Vertex* vertices; // TODO: add more attributes when needed - int texWidth; - int texHeight; + glm::vec2 texRes; }; } @@ -516,7 +519,7 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { // You can only worry about this part once you started to // implement textures for your rasterizer TextureData* dev_diffuseTex = NULL; - int texWidth, texHeight; + glm::vec2 texRes; if (!primitive.material.empty()) { const tinygltf::Material &mat = scene.materials.at(primitive.material); printf("material.name = %s\n", mat.name.c_str()); @@ -533,8 +536,7 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { cudaMemcpy(dev_diffuseTex, &image.image.at(0), s, cudaMemcpyHostToDevice); // TODO: store the image size to your PrimitiveDevBufPointers - texWidth = image.width; - texHeight = image.height; + texRes = glm::vec2(image.width, image.height); checkCUDAError("Set Texture Image data"); } @@ -577,8 +579,7 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { dev_diffuseTex, dev_vertex, //VertexOut - texWidth, - texHeight + texRes }); totalNumPrimitives += numPrimitives; @@ -659,19 +660,18 @@ void _primitiveAssembly(int numIndices, int curPrimitiveBeginId, Primitive* prim if (IDx < numIndices) { // TODO: uncomment the following code for a start - //This is primitive assembly for triangles - - if (vertexParts.primitiveMode == TINYGLTF_MODE_TRIANGLES) { - int n_vertices = vertexParts.primitiveType; - int prim_id = IDx / n_vertices + curPrimitiveBeginId; - Primitive &primitive = primitives[prim_id]; - primitive.v[IDx % n_vertices] - = vertexParts.vertices[vertexParts.indices[IDx]]; - primitive.diffuseTex = vertexParts.diffuseTex; - primitive.texHeight = vertexParts.texHeight; - primitive.texWidth = vertexParts.texWidth; - } - // TODO: other primitive types (point, line) +//This is primitive assembly for triangles + +if (vertexParts.primitiveMode == TINYGLTF_MODE_TRIANGLES) { + int n_vertices = vertexParts.primitiveType; + int prim_id = IDx / n_vertices + curPrimitiveBeginId; + Primitive &primitive = primitives[prim_id]; + primitive.v[IDx % n_vertices] + = vertexParts.vertices[vertexParts.indices[IDx]]; + primitive.diffuseTex = vertexParts.diffuseTex; + primitive.texRes = vertexParts.texRes; +} +// TODO: other primitive types (point, line) } } @@ -682,88 +682,151 @@ float getFragmentDepth(glm::vec3 bcCoord, glm::vec3 tri[3]) { int i; float depth = 0; -// interpolate vertex depths + // interpolate vertex depths range(i, 0, 3) { depth += bcCoord[i] * tri[i].z; } return depth > MAX_DEPTH ? INT_MAX : depth * DEPTH_QUANTUM; } +__device__ +glm::vec3 getColor(glm::vec2 texcoord, glm::vec2 texRes, TextureData *tex) { + //glm::vec2 coord = texWidth * texcoord + int tid = 3 * getIndex(texcoord.x, texcoord.y, texRes.x); + return glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]); +} + __global__ void _rasterize(int n_primitives, int height, int width, const Primitive *primitives, int *depths, Fragment *fragments) { if (IDx >= n_primitives) return; + int id = IDx; - int i, j; + int i, y, x; Primitive primitive = primitives[IDx]; glm::vec3 tri[3]; - range(i, 0, 3) { + range(i, 0, 3) { // get coordinates of tri points tri[i] = glm::vec3(primitive.v[i].pos); } - range(i, 0, height) { - range(j, 0, width) { - int index = getIndex(i, j, width); - glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(i, j)); - if (isBarycentricCoordInBounds(barycentricCoord)) { - int depth = getFragmentDepth(barycentricCoord, tri); - - // assign fragEyePos.z to dev_depth[i] iff it is smaller - // (fragment is closer to camera) - int index = getIndex(i, j, width); - atomicMin(depths + index, depth); + AABB aabb = getAABBForTriangle(tri); + + + if (SHOW_TEXTURE) { + range(y, 0, height) { + range(x, 0, width) { + int index = getIndex(x, y, width); // up to (height - 1) * width + (width - 1) = height * width - 1 + + if (y < primitive.texRes.y && x < primitive.texRes.x) { + glm::vec2 texRes = primitive.texRes; + fragments[index].color = getColor( + glm::vec2(x, y), + texRes, + primitive.diffuseTex); + glm::vec2 t1 = texRes * glm::vec2(0.992090, 0.017195); + glm::vec3 c1 = getColor(t1, texRes, primitive.diffuseTex); + glm::vec2 t2 = texRes * glm::vec2(0.993819, 0.016058); + glm::vec3 c2 = getColor(t2, texRes, primitive.diffuseTex); + //debug0("color at (%.4f, %.4f) is (%.4f,%.4f,%.4f)\n", + // t1.x, + // t1.y, + // c1.x, + // c1.y, + // c1.z); + //debug0("color at (%.4f, %.4f) is (%.4f,%.4f,%.4f)\n", + // t2.x, + // t2.y, + // c2.x, + // c2.y, + // c2.z); + //debug0("tex width=%.4f tex height=%.4f", + // texRes.x, texRes.y + // ); + } } } } + else { + range(y, aabb.min.y, aabb.max.y) { + range(x, aabb.min.x, aabb.max.x) { + int index = getIndex(x, y, width); + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(x, y)); + if (isBarycentricCoordInBounds(barycentricCoord)) { + int depth = getFragmentDepth(barycentricCoord, tri); + + // assign fragEyePos.z to dev_depth[i] iff it is smaller + // (fragment is closer to camera) + atomicMin(depths + index, depth); + } + } + } - __syncthreads(); // wait for all depths to be updated - - range(i, 0, height - 100) { - range(j, 0, width - 100) { - int index = getIndex(i, j, width); // up to (height - 1) * width + (width - 1) = height * width - 1 - glm::vec2 viewPos = glm::vec2(i, j); - glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, viewPos); - - - // test textures - //if (i < primitive.texHeight && j < primitive.texWidth) { - // Fragment &fragment = fragments[index]; - // int tid = 3 * getIndex(i, j, primitive.texWidth); - // TextureData *tex = primitive.diffuseTex; - // glm::vec3 texColor(tex[tid + 0], tex[tid + 1], tex[tid + 2]); - // fragment.color = texColor; - //} - // end texture test - - if (isBarycentricCoordInBounds(barycentricCoord)) { - float depth = getFragmentDepth(barycentricCoord, tri); - if ((int)depth == depths[index]) { - Fragment &fragment = fragments[index]; - Vertex vertex = primitive.v[0]; // TODO: move common fields into Primitive - - //fragment.dev_diffuseTex = primitive.dev_diffuseTex; - TextureData *tex = primitive.diffuseTex; - fragment.viewNor = glm::vec3(0); - fragment.color = glm::vec3(0); - int k; - range(k, 0, 3) { - float weight = barycentricCoord[k]; - Vertex v = primitive.v[k]; // HELP: is this a call to global memory? - fragment.viewNor += weight * v.viewNor; - int id = index; - int x = v.texcoord0.x * primitive.texWidth; - int y = v.texcoord0.y * primitive.texHeight; - int tid = 3 * getIndex(y, x, primitive.texWidth); + __syncthreads(); // wait for all depths to be updated + + + range(y, aabb.min.y, aabb.max.y) { + range(x, aabb.min.x, aabb.max.x) { + int index = getIndex(x, y, width); // up to (height - 1) * width + (width - 1) = height * width - 1 + glm::vec2 viewPos = glm::vec2(x, y); + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, viewPos); + + if (isBarycentricCoordInBounds(barycentricCoord)) { + float depth = getFragmentDepth(barycentricCoord, tri); + if ((int)depth == depths[index]) { + Fragment &fragment = fragments[index]; + Vertex vertex = primitive.v[0]; // TODO: move common fields into Primitive + + //fragment.dev_diffuseTex = primitive.dev_diffuseTex; + fragment.viewPos = glm::vec3(viewPos, depth); + fragment.viewNor = glm::vec3(0); + glm::vec2 texcoord(0); + + Vertex *v = primitive.v; + glm::vec3 depthFactor = glm::normalize(glm::vec3( + v[0].viewPos.z, + v[1].viewPos.z, + v[2].viewPos.z)); + + int k; + range(k, 0, 3) { + float weight = barycentricCoord[k]; + Vertex v = primitive.v[k]; + fragment.viewNor += weight * v.viewNor; + texcoord += (depthFactor[k] + weight) * v.texcoord0; + } + glm::vec2 texRes = primitive.texRes; + glm::vec2 scaledCoord = texcoord * glm::vec2(texRes.x, texRes.y); + int tid = 3 * getIndex((int)scaledCoord.x, (int)scaledCoord.y, texRes.x); TextureData *tex = primitive.diffuseTex; - glm::vec3 texColor(tex[tid + 0], tex[tid + 1], tex[tid + 2]); - fragment.color += weight * texColor; + fragment.color = glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]) / 255.0f; + + //float e = 0.005; + //glm::vec3 color(fragment.color); + //glm::vec2 texcoords[3] = { + // v[0].texcoord0, + // v[1].texcoord0, + // v[2].texcoord0 + //}; + //if (texcoord.x < e && texcoord.y < e) { + // debug1("bcCoord=%f,%f,%f\n", barycentricCoord.x, barycentricCoord.y, barycentricCoord.z); + // debug1("texCoord[0]=%f,%f\n", + // texcoords[0].x, + // texcoords[0].y); + // debug1("texCoord[1]=%f,%f\n", + // texcoords[1].x, + // texcoords[1].y); + // debug1("texCoord[2]=%f,%f\n", + // texcoords[2].x, + // texcoords[2].y); + // debug1("weighted texCoord=%f,%f\n", texcoord.x, texcoord.y); + // debug1("rescaled coord=%f,%f\n", scaledCoord.x, scaledCoord.y); + // debug1("color=%f,%f,%f\n\n", + // color.x, + // color.y, + // color.z); + } } - fragment.color /= 255.0f; - - //fragment.viewNor = primitive.v[0].viewNor; - fragment.viewPos = glm::vec3(viewPos, depth); - } } } @@ -783,28 +846,10 @@ void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffe glm::vec3 V = glm::normalize(-frag.viewPos); glm::vec3 H = glm::normalize(L + V); float intensity = saturate(glm::dot(frag.viewNor, H) + 0.2); - framebuffer[index] = intensity * frag.color; - - //int id = index; - //debugDuck("intensity=%.2f original-color=%.2f,%.2f,%.2f shaded-color=%.2f,%.2f,%.2f\n", - // intensity, - // frag.color.x, - // frag.color.y, - // frag.color.z, - // intensity * frag.color.x, - // intensity * frag.color.y, - // intensity * frag.color.z - // ); - //int id = index; - //debugDuck("preclamp=%f frag.viewNor=%f,%f,%f H=%f,%f,%f\n", - // preclamp, - // frag.viewNor.x, - // frag.viewNor.y, - // frag.viewNor.z, - // H.x, - // H.y, - // H.z); - + if (SHOW_TEXTURE) { + intensity = 1; + } + framebuffer[index] = intensity * frag.color; } /** @@ -843,8 +888,9 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g *parts, MVP, MV, MV_normal, width, height); - checkCUDAError("Vertex Processing"); + checkCUDAError("Vertex Transform and Assembly"); cudaDeviceSynchronize(); + _primitiveAssembly << < numBlocksForIndices, numThreadsPerBlock >> > (parts->numIndices, curPrimitiveBeginId, diff --git a/src/rasterizeTools.h b/src/rasterizeTools.h index fbf9d78..5ace704 100644 --- a/src/rasterizeTools.h +++ b/src/rasterizeTools.h @@ -111,3 +111,8 @@ glm::vec3 interpolateVec3(const glm::vec3 tri[3], const glm::vec3 bcCoord) { } return val; } + +__host__ __device__ +bool approxEq(float a, float b) { + return a + EPSILON > b && a - EPSILON < b; +} From 38fa59eef8fca10c93ae524c295e315fa4027147 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Thu, 27 Oct 2016 15:40:25 -0400 Subject: [PATCH 16/37] solved the screwy texture problem. Now working on depth correction. there were some issues with that last commit. --- src/rasterize.cu | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index fbc45a9..5fd01bd 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -793,7 +793,7 @@ const Primitive *primitives, int *depths, Fragment *fragments) { float weight = barycentricCoord[k]; Vertex v = primitive.v[k]; fragment.viewNor += weight * v.viewNor; - texcoord += (depthFactor[k] + weight) * v.texcoord0; + texcoord += weight * v.texcoord0; } glm::vec2 texRes = primitive.texRes; glm::vec2 scaledCoord = texcoord * glm::vec2(texRes.x, texRes.y); @@ -825,7 +825,7 @@ const Primitive *primitives, int *depths, Fragment *fragments) { // color.x, // color.y, // color.z); - } + //} } } } From b774e4d33d92aefd17096e7a8ac270a46ee38edc Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Thu, 27 Oct 2016 16:43:43 -0400 Subject: [PATCH 17/37] abandoned the mutex project. still fixing textures. --- src/rasterize.cu | 72 +++++++++++++++++++++++++------------------- src/rasterizeTools.h | 2 +- 2 files changed, 42 insertions(+), 32 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 5fd01bd..217345c 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -30,7 +30,7 @@ #define debug(...) if (DEBUG == 1) { printf (__VA_ARGS__); } #define debug0(...) if (DEBUG == 1 && id == 0) { printf (__VA_ARGS__); } #define debug1(...) if (DEBUG == 1 && id == 1) { printf (__VA_ARGS__); } -#define debugDuck(...) if (DEBUG == 1 && id == 310031) { printf (__VA_ARGS__); } +#define debugDuck(...) if (DEBUG == 1 && id == 330033) { printf (__VA_ARGS__); } //#define debugBoard(...) if (DEBUG == 1 && id == ) { printf (__VA_ARGS__); } #define range(i, start, stop) for (i = start; i < stop; i++) #define SHOW_TEXTURE 0 @@ -756,7 +756,7 @@ const Primitive *primitives, int *depths, Fragment *fragments) { int depth = getFragmentDepth(barycentricCoord, tri); // assign fragEyePos.z to dev_depth[i] iff it is smaller - // (fragment is closer to camera) + // (fragment is closer to camera) atomicMin(depths + index, depth); } } @@ -775,7 +775,6 @@ const Primitive *primitives, int *depths, Fragment *fragments) { float depth = getFragmentDepth(barycentricCoord, tri); if ((int)depth == depths[index]) { Fragment &fragment = fragments[index]; - Vertex vertex = primitive.v[0]; // TODO: move common fields into Primitive //fragment.dev_diffuseTex = primitive.dev_diffuseTex; fragment.viewPos = glm::vec3(viewPos, depth); @@ -783,17 +782,24 @@ const Primitive *primitives, int *depths, Fragment *fragments) { glm::vec2 texcoord(0); Vertex *v = primitive.v; - glm::vec3 depthFactor = glm::normalize(glm::vec3( + glm::vec3 depthFactor = glm::vec3( v[0].viewPos.z, v[1].viewPos.z, - v[2].viewPos.z)); + v[2].viewPos.z + ); + depthFactor /= + depthFactor.x + + depthFactor.y + + depthFactor.z; + + depthFactor = glm::vec3(0.5, 0.25, 0.25); //TODO: get rid of this; int k; range(k, 0, 3) { float weight = barycentricCoord[k]; Vertex v = primitive.v[k]; fragment.viewNor += weight * v.viewNor; - texcoord += weight * v.texcoord0; + texcoord += ((depthFactor[k] + weight) / 2.0f) * v.texcoord0; } glm::vec2 texRes = primitive.texRes; glm::vec2 scaledCoord = texcoord * glm::vec2(texRes.x, texRes.y); @@ -801,31 +807,35 @@ const Primitive *primitives, int *depths, Fragment *fragments) { TextureData *tex = primitive.diffuseTex; fragment.color = glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]) / 255.0f; - //float e = 0.005; - //glm::vec3 color(fragment.color); - //glm::vec2 texcoords[3] = { - // v[0].texcoord0, - // v[1].texcoord0, - // v[2].texcoord0 - //}; - //if (texcoord.x < e && texcoord.y < e) { - // debug1("bcCoord=%f,%f,%f\n", barycentricCoord.x, barycentricCoord.y, barycentricCoord.z); - // debug1("texCoord[0]=%f,%f\n", - // texcoords[0].x, - // texcoords[0].y); - // debug1("texCoord[1]=%f,%f\n", - // texcoords[1].x, - // texcoords[1].y); - // debug1("texCoord[2]=%f,%f\n", - // texcoords[2].x, - // texcoords[2].y); - // debug1("weighted texCoord=%f,%f\n", texcoord.x, texcoord.y); - // debug1("rescaled coord=%f,%f\n", scaledCoord.x, scaledCoord.y); - // debug1("color=%f,%f,%f\n\n", - // color.x, - // color.y, - // color.z); - //} + float e = 0.005; + glm::vec3 color(fragment.color); + glm::vec2 texcoords[3] = { + v[0].texcoord0, + v[1].texcoord0, + v[2].texcoord0 + }; + if (barycentricCoord.x < e && barycentricCoord.y < e) { + debug1("bcCoord=%f,%f,%f\n", barycentricCoord.x, barycentricCoord.y, barycentricCoord.z); + debug1("texCoord[0]=%f,%f\n", + texcoords[0].x, + texcoords[0].y); + debug1("texCoord[1]=%f,%f\n", + texcoords[1].x, + texcoords[1].y); + debug1("texCoord[2]=%f,%f\n", + texcoords[2].x, + texcoords[2].y); + debug1("weighted texCoord=%f,%f\n", texcoord.x, texcoord.y); + debug1("rescaled coord=%f,%f\n", scaledCoord.x, scaledCoord.y); + debug1("color=%f,%f,%f\n\n", + color.x, + color.y, + color.z); + debug1("depthFactor=%f,%f,%f\n\n", + depthFactor.x, + depthFactor.y, + depthFactor.z); + } } } } diff --git a/src/rasterizeTools.h b/src/rasterizeTools.h index 5ace704..fe5eeb8 100644 --- a/src/rasterizeTools.h +++ b/src/rasterizeTools.h @@ -1,4 +1,4 @@ -/** +/** * @file rasterizeTools.h * @brief Tools/utility functions for rasterization. * @authors Yining Karl Li From a1bd0fa8fe4a8bf4ccdbc80ccbdad23809f95716 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Thu, 27 Oct 2016 17:05:23 -0400 Subject: [PATCH 18/37] init --- src/rasterize.cu | 78 ++++++++++++++++++++++-------------------------- 1 file changed, 35 insertions(+), 43 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 217345c..3204d4f 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -780,62 +780,54 @@ const Primitive *primitives, int *depths, Fragment *fragments) { fragment.viewPos = glm::vec3(viewPos, depth); fragment.viewNor = glm::vec3(0); glm::vec2 texcoord(0); - - Vertex *v = primitive.v; - glm::vec3 depthFactor = glm::vec3( - v[0].viewPos.z, - v[1].viewPos.z, - v[2].viewPos.z - ); - depthFactor /= - depthFactor.x + - depthFactor.y + - depthFactor.z; - - depthFactor = glm::vec3(0.5, 0.25, 0.25); //TODO: get rid of this; + float texWeightNorm = 0; int k; range(k, 0, 3) { float weight = barycentricCoord[k]; Vertex v = primitive.v[k]; fragment.viewNor += weight * v.viewNor; - texcoord += ((depthFactor[k] + weight) / 2.0f) * v.texcoord0; + float texWeight = weight / v.viewPos.z; + texcoord += texWeight * v.texcoord0; + texWeightNorm += texWeight; } + + texcoord /= texWeightNorm; glm::vec2 texRes = primitive.texRes; glm::vec2 scaledCoord = texcoord * glm::vec2(texRes.x, texRes.y); int tid = 3 * getIndex((int)scaledCoord.x, (int)scaledCoord.y, texRes.x); TextureData *tex = primitive.diffuseTex; fragment.color = glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]) / 255.0f; - float e = 0.005; - glm::vec3 color(fragment.color); - glm::vec2 texcoords[3] = { - v[0].texcoord0, - v[1].texcoord0, - v[2].texcoord0 - }; - if (barycentricCoord.x < e && barycentricCoord.y < e) { - debug1("bcCoord=%f,%f,%f\n", barycentricCoord.x, barycentricCoord.y, barycentricCoord.z); - debug1("texCoord[0]=%f,%f\n", - texcoords[0].x, - texcoords[0].y); - debug1("texCoord[1]=%f,%f\n", - texcoords[1].x, - texcoords[1].y); - debug1("texCoord[2]=%f,%f\n", - texcoords[2].x, - texcoords[2].y); - debug1("weighted texCoord=%f,%f\n", texcoord.x, texcoord.y); - debug1("rescaled coord=%f,%f\n", scaledCoord.x, scaledCoord.y); - debug1("color=%f,%f,%f\n\n", - color.x, - color.y, - color.z); - debug1("depthFactor=%f,%f,%f\n\n", - depthFactor.x, - depthFactor.y, - depthFactor.z); - } + //float e = 0.005; + //glm::vec3 color(fragment.color); + //glm::vec2 texcoords[3] = { + // v[0].texcoord0, + // v[1].texcoord0, + // v[2].texcoord0 + //}; + //if (barycentricCoord.x < e && barycentricCoord.y < e) { + // debug1("bcCoord=%f,%f,%f\n", barycentricCoord.x, barycentricCoord.y, barycentricCoord.z); + // debug1("texCoord[0]=%f,%f\n", + // texcoords[0].x, + // texcoords[0].y); + // debug1("texCoord[1]=%f,%f\n", + // texcoords[1].x, + // texcoords[1].y); + // debug1("texCoord[2]=%f,%f\n", + // texcoords[2].x, + // texcoords[2].y); + // debug1("weighted texCoord=%f,%f\n", texcoord.x, texcoord.y); + // debug1("rescaled coord=%f,%f\n", scaledCoord.x, scaledCoord.y); + // debug1("color=%f,%f,%f\n\n", + // color.x, + // color.y, + // color.z); + // debug1("triDepths=%f,%f,%f\n\n", + // triDepths.x, + // triDepths.y, + // triDepths.z); + //} } } } From 3722e97ff42bd3fc90ce1d7b0201513ebaf009a7 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Thu, 27 Oct 2016 23:46:50 -0400 Subject: [PATCH 19/37] got duck to work after reworking init --- src/rasterize.cu | 203 ++++++++++++++++++----------------------------- 1 file changed, 76 insertions(+), 127 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 3204d4f..9eca9e5 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -24,6 +24,7 @@ #define MAX_DEPTH 10000.0f #define DEPTH_QUANTUM (float)(INT_MAX / MAX_DEPTH) #define getIndex(x, y, width) (x + y * width) +#define samplesPerPixel 4 #define DEBUG 1 @@ -124,7 +125,7 @@ static int totalNumPrimitives = 0; static Primitive *dev_primitives = NULL; static Fragment *dev_fragmentBuffer = NULL; static glm::vec3 *dev_framebuffer = NULL; -static int *dev_depth = NULL; // you might need this buffer when doing depth test +static unsigned int *dev_depth = NULL; // you might need this buffer when doing depth test /** * Kernel that writes the image to the OpenGL PBO directly. @@ -164,18 +165,17 @@ void rasterizeInit(int w, int h) { cudaMemset(dev_framebuffer, 0, width * height * sizeof(glm::vec3)); cudaFree(dev_depth); - cudaMalloc(&dev_depth, width * height * sizeof(int)); + cudaMalloc(&dev_depth, samplesPerPixel * width * height * sizeof(int)); checkCUDAError("rasterizeInit"); } __global__ -void _initDepth(int w, int h, int *depth) +void _initDepth(int length, int *depth) { - if (IDx < w && IDy < h) + if (IDx < length * samplesPerPixel) { - int index = IDx + (IDy * w); - depth[index] = FLT_MAX; + depth[IDx] = INT_MAX; } } @@ -686,23 +686,32 @@ float getFragmentDepth(glm::vec3 bcCoord, glm::vec3 tri[3]) { range(i, 0, 3) { depth += bcCoord[i] * tri[i].z; } - return depth > MAX_DEPTH ? INT_MAX : depth * DEPTH_QUANTUM; + if (depth > MAX_DEPTH) { + return INT_MAX; + } + else if (depth < 0) { + return 0; + } + else { + return depth * DEPTH_QUANTUM; + } } __device__ -glm::vec3 getColor(glm::vec2 texcoord, glm::vec2 texRes, TextureData *tex) { - //glm::vec2 coord = texWidth * texcoord - int tid = 3 * getIndex(texcoord.x, texcoord.y, texRes.x); - return glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]); + void atomicAddVec3(glm::vec3 &vec1, glm::vec3 vec2) { + int i; + range(i, 0, 3) { + atomicAdd(&vec1[i], vec2[i]); + } } __global__ void _rasterize(int n_primitives, int height, int width, -const Primitive *primitives, int *depths, Fragment *fragments) { +const Primitive *primitives, unsigned int *depths, Fragment *fragments) { if (IDx >= n_primitives) return; int id = IDx; - int i, y, x; + int i, y, x, offset; Primitive primitive = primitives[IDx]; glm::vec3 tri[3]; range(i, 0, 3) { @@ -711,124 +720,61 @@ const Primitive *primitives, int *depths, Fragment *fragments) { } AABB aabb = getAABBForTriangle(tri); - - - if (SHOW_TEXTURE) { - range(y, 0, height) { - range(x, 0, width) { - int index = getIndex(x, y, width); // up to (height - 1) * width + (width - 1) = height * width - 1 - - if (y < primitive.texRes.y && x < primitive.texRes.x) { - glm::vec2 texRes = primitive.texRes; - fragments[index].color = getColor( - glm::vec2(x, y), - texRes, - primitive.diffuseTex); - glm::vec2 t1 = texRes * glm::vec2(0.992090, 0.017195); - glm::vec3 c1 = getColor(t1, texRes, primitive.diffuseTex); - glm::vec2 t2 = texRes * glm::vec2(0.993819, 0.016058); - glm::vec3 c2 = getColor(t2, texRes, primitive.diffuseTex); - //debug0("color at (%.4f, %.4f) is (%.4f,%.4f,%.4f)\n", - // t1.x, - // t1.y, - // c1.x, - // c1.y, - // c1.z); - //debug0("color at (%.4f, %.4f) is (%.4f,%.4f,%.4f)\n", - // t2.x, - // t2.y, - // c2.x, - // c2.y, - // c2.z); - //debug0("tex width=%.4f tex height=%.4f", - // texRes.x, texRes.y - // ); - } + range(y, aabb.min.y, aabb.max.y) { + range(x, aabb.min.x, aabb.max.x) { + offset = 0; + int fragmentId = getIndex(x, y, width); + int sampleId = samplesPerPixel * fragmentId + offset; + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(x, y)); + if (isBarycentricCoordInBounds(barycentricCoord)) { + unsigned int depth = getFragmentDepth(barycentricCoord, tri); + + // assign fragEyePos.z to dev_depth[i] iff it is smaller + // (fragment is closer to camera) + atomicMin(depths + sampleId, depth); + debug0("depths[0]=%d, depths[-1]=%d\n", depths[0], depths[samplesPerPixel * height * width - 1]); } } } - else { - range(y, aabb.min.y, aabb.max.y) { - range(x, aabb.min.x, aabb.max.x) { - int index = getIndex(x, y, width); - glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(x, y)); - if (isBarycentricCoordInBounds(barycentricCoord)) { - int depth = getFragmentDepth(barycentricCoord, tri); - - // assign fragEyePos.z to dev_depth[i] iff it is smaller - // (fragment is closer to camera) - atomicMin(depths + index, depth); - } - } - } - - __syncthreads(); // wait for all depths to be updated - - - range(y, aabb.min.y, aabb.max.y) { - range(x, aabb.min.x, aabb.max.x) { - int index = getIndex(x, y, width); // up to (height - 1) * width + (width - 1) = height * width - 1 - glm::vec2 viewPos = glm::vec2(x, y); - glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, viewPos); - - if (isBarycentricCoordInBounds(barycentricCoord)) { - float depth = getFragmentDepth(barycentricCoord, tri); - if ((int)depth == depths[index]) { - Fragment &fragment = fragments[index]; - - //fragment.dev_diffuseTex = primitive.dev_diffuseTex; - fragment.viewPos = glm::vec3(viewPos, depth); - fragment.viewNor = glm::vec3(0); - glm::vec2 texcoord(0); - float texWeightNorm = 0; - - int k; - range(k, 0, 3) { - float weight = barycentricCoord[k]; - Vertex v = primitive.v[k]; - fragment.viewNor += weight * v.viewNor; - float texWeight = weight / v.viewPos.z; - texcoord += texWeight * v.texcoord0; - texWeightNorm += texWeight; - } - texcoord /= texWeightNorm; - glm::vec2 texRes = primitive.texRes; - glm::vec2 scaledCoord = texcoord * glm::vec2(texRes.x, texRes.y); - int tid = 3 * getIndex((int)scaledCoord.x, (int)scaledCoord.y, texRes.x); - TextureData *tex = primitive.diffuseTex; - fragment.color = glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]) / 255.0f; - - //float e = 0.005; - //glm::vec3 color(fragment.color); - //glm::vec2 texcoords[3] = { - // v[0].texcoord0, - // v[1].texcoord0, - // v[2].texcoord0 - //}; - //if (barycentricCoord.x < e && barycentricCoord.y < e) { - // debug1("bcCoord=%f,%f,%f\n", barycentricCoord.x, barycentricCoord.y, barycentricCoord.z); - // debug1("texCoord[0]=%f,%f\n", - // texcoords[0].x, - // texcoords[0].y); - // debug1("texCoord[1]=%f,%f\n", - // texcoords[1].x, - // texcoords[1].y); - // debug1("texCoord[2]=%f,%f\n", - // texcoords[2].x, - // texcoords[2].y); - // debug1("weighted texCoord=%f,%f\n", texcoord.x, texcoord.y); - // debug1("rescaled coord=%f,%f\n", scaledCoord.x, scaledCoord.y); - // debug1("color=%f,%f,%f\n\n", - // color.x, - // color.y, - // color.z); - // debug1("triDepths=%f,%f,%f\n\n", - // triDepths.x, - // triDepths.y, - // triDepths.z); - //} + __syncthreads(); // wait for all depths to be updated + + + range(y, aabb.min.y, aabb.max.y) { + range(x, aabb.min.x, aabb.max.x) { + offset = 0; + int fragmentId = getIndex(x, y, width); + int sampleId = samplesPerPixel * fragmentId + offset; + glm::vec2 viewPos = glm::vec2(x, y); + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, viewPos); + + if (isBarycentricCoordInBounds(barycentricCoord)) { + float depth = getFragmentDepth(barycentricCoord, tri); + if ((unsigned int)depth == depths[sampleId]) { + Fragment &fragment = fragments[fragmentId]; + + //fragment.dev_diffuseTex = primitive.dev_diffuseTex; + fragment.viewPos = glm::vec3(viewPos, depth); + fragment.viewNor = glm::vec3(0); + glm::vec2 texcoord(0); + float texWeightNorm = 0; + + int k; + range(k, 0, 3) { + float weight = barycentricCoord[k]; + Vertex v = primitive.v[k]; + fragment.viewNor += weight * v.viewNor; + float texWeight = weight / v.viewPos.z; + texcoord += texWeight * v.texcoord0; + texWeightNorm += texWeight; } + + texcoord /= texWeightNorm; + glm::vec2 texRes = primitive.texRes; + glm::vec2 scaledCoord = texcoord * glm::vec2(texRes.x, texRes.y); + int tid = 3 * getIndex((int)scaledCoord.x, (int)scaledCoord.y, texRes.x); + TextureData *tex = primitive.diffuseTex; + fragment.color = glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]) / 255.0f; } } } @@ -907,7 +853,10 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g checkCUDAError("Vertex Processing and Primitive Assembly"); } - _initDepth << > >(width, height, dev_depth); + //int numSamples = samplesPerPixel * height * width; + //dim3 blockSize = numSamples / numThreadsPerBlock.x + 1; + //_initDepth << > >(numSamples, dev_depth); + cudaMemset(dev_depth, 0xff, samplesPerPixel * width * height * sizeof(dev_depth[0])); cudaMemset(dev_framebuffer, 0, width * height * sizeof(Fragment)); // TODO: rasterize From 8b18a33148f5f8352d0d70d7eb913afb42b80ba4 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Thu, 27 Oct 2016 23:53:05 -0400 Subject: [PATCH 20/37] duck is working. about to try to o antialiasing in one fatal go --- src/rasterize.cu | 87 ++++++++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 9eca9e5..34a1ebc 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -722,17 +722,17 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { AABB aabb = getAABBForTriangle(tri); range(y, aabb.min.y, aabb.max.y) { range(x, aabb.min.x, aabb.max.x) { - offset = 0; - int fragmentId = getIndex(x, y, width); - int sampleId = samplesPerPixel * fragmentId + offset; - glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(x, y)); - if (isBarycentricCoordInBounds(barycentricCoord)) { - unsigned int depth = getFragmentDepth(barycentricCoord, tri); - - // assign fragEyePos.z to dev_depth[i] iff it is smaller - // (fragment is closer to camera) - atomicMin(depths + sampleId, depth); - debug0("depths[0]=%d, depths[-1]=%d\n", depths[0], depths[samplesPerPixel * height * width - 1]); + range(offset, 0, samplesPerPixel) { + int fragmentId = getIndex(x, y, width); + int sampleId = samplesPerPixel * fragmentId + offset; + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(x, y)); + if (isBarycentricCoordInBounds(barycentricCoord)) { + unsigned int depth = getFragmentDepth(barycentricCoord, tri); + + // assign fragEyePos.z to dev_depth[i] iff it is smaller + // (fragment is closer to camera) + atomicMin(depths + sampleId, depth); + } } } } @@ -742,39 +742,40 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { range(y, aabb.min.y, aabb.max.y) { range(x, aabb.min.x, aabb.max.x) { - offset = 0; - int fragmentId = getIndex(x, y, width); - int sampleId = samplesPerPixel * fragmentId + offset; - glm::vec2 viewPos = glm::vec2(x, y); - glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, viewPos); - - if (isBarycentricCoordInBounds(barycentricCoord)) { - float depth = getFragmentDepth(barycentricCoord, tri); - if ((unsigned int)depth == depths[sampleId]) { - Fragment &fragment = fragments[fragmentId]; - - //fragment.dev_diffuseTex = primitive.dev_diffuseTex; - fragment.viewPos = glm::vec3(viewPos, depth); - fragment.viewNor = glm::vec3(0); - glm::vec2 texcoord(0); - float texWeightNorm = 0; - - int k; - range(k, 0, 3) { - float weight = barycentricCoord[k]; - Vertex v = primitive.v[k]; - fragment.viewNor += weight * v.viewNor; - float texWeight = weight / v.viewPos.z; - texcoord += texWeight * v.texcoord0; - texWeightNorm += texWeight; - } + range(offset, 0, samplesPerPixel) { + int fragmentId = getIndex(x, y, width); + int sampleId = samplesPerPixel * fragmentId + offset; + glm::vec2 viewPos = glm::vec2(x, y); + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, viewPos); + + if (isBarycentricCoordInBounds(barycentricCoord)) { + float depth = getFragmentDepth(barycentricCoord, tri); + if ((unsigned int)depth == depths[sampleId]) { + Fragment &fragment = fragments[fragmentId]; + + //fragment.dev_diffuseTex = primitive.dev_diffuseTex; + fragment.viewPos = glm::vec3(viewPos, depth); + fragment.viewNor = glm::vec3(0); + glm::vec2 texcoord(0); + float texWeightNorm = 0; + + int k; + range(k, 0, 3) { + float weight = barycentricCoord[k]; + Vertex v = primitive.v[k]; + fragment.viewNor += weight * v.viewNor; + float texWeight = weight / v.viewPos.z; + texcoord += texWeight * v.texcoord0; + texWeightNorm += texWeight; + } - texcoord /= texWeightNorm; - glm::vec2 texRes = primitive.texRes; - glm::vec2 scaledCoord = texcoord * glm::vec2(texRes.x, texRes.y); - int tid = 3 * getIndex((int)scaledCoord.x, (int)scaledCoord.y, texRes.x); - TextureData *tex = primitive.diffuseTex; - fragment.color = glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]) / 255.0f; + texcoord /= texWeightNorm; + glm::vec2 texRes = primitive.texRes; + glm::vec2 scaledCoord = texcoord * glm::vec2(texRes.x, texRes.y); + int tid = 3 * getIndex((int)scaledCoord.x, (int)scaledCoord.y, texRes.x); + TextureData *tex = primitive.diffuseTex; + fragment.color = glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]) / 255.0f; + } } } } From f4736bba80da573c6dd2e700f46c2fba7f5556f5 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Fri, 28 Oct 2016 14:00:22 -0400 Subject: [PATCH 21/37] init --- src/rasterize.cu | 69 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 19 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 34a1ebc..2f27c0c 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -24,7 +24,7 @@ #define MAX_DEPTH 10000.0f #define DEPTH_QUANTUM (float)(INT_MAX / MAX_DEPTH) #define getIndex(x, y, width) (x + y * width) -#define samplesPerPixel 4 +#define samplesPerPixel 1 #define DEBUG 1 @@ -61,7 +61,7 @@ namespace { // but always feel free to modify on your own glm::vec3 viewPos; // eye space position used for shading - glm::vec3 viewNor; // eye space normal used for shading, cuz normal will go wrong after perspective transformation + glm::vec3 viewNorm; // eye space normal used for shading, cuz normal will go wrong after perspective transformation // glm::vec3 col; VertexAttributeTexcoord texcoord0; }; @@ -82,7 +82,7 @@ namespace { // but always feel free to modify on your own glm::vec3 viewPos; // eye space position used for shading - glm::vec3 viewNor; + glm::vec3 viewNorm; TextureData* diffuseTex; // ... }; @@ -638,7 +638,7 @@ void _vertexTransformAndAssembly( // TODO: Apply vertex transformation here glm::vec4 modelPos = glm::vec4(vertexParts.pos[IDx], 1); // this is in model space vertex.viewPos = glm::vec3(MV * modelPos); - vertex.viewNor = glm::vec3(MV_normal * vertexParts.normal[IDx]); + vertex.viewNorm = glm::vec3(MV_normal * vertexParts.normal[IDx]); glm::vec4 clipPos(MVP * modelPos); glm::vec4 screenDims(width, height, 1, 1); vertex.pos = screenDims * (clipPos / clipPos.w + glm::vec4(1, 1, 0, 0)) / 2.0f; @@ -705,6 +705,17 @@ __device__ } } +__global__ +void _fragmentInit(Fragment fragments[], int n_fragments) { + if (IDx < n_fragments) { + Fragment &fragment = fragments[IDx]; + fragment.color = glm::vec3(0); + fragment.viewPos = glm::vec3(0); + fragment.viewNorm = glm::vec3(0); + } + +} + __global__ void _rasterize(int n_primitives, int height, int width, const Primitive *primitives, unsigned int *depths, Fragment *fragments) { @@ -722,9 +733,14 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { AABB aabb = getAABBForTriangle(tri); range(y, aabb.min.y, aabb.max.y) { range(x, aabb.min.x, aabb.max.x) { + + // zero out values of fragment struct + int fragmentId = getIndex(x, y, width); + range(offset, 0, samplesPerPixel) { - int fragmentId = getIndex(x, y, width); int sampleId = samplesPerPixel * fragmentId + offset; + + // determine if screenPos is inside polygon glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(x, y)); if (isBarycentricCoordInBounds(barycentricCoord)) { unsigned int depth = getFragmentDepth(barycentricCoord, tri); @@ -742,42 +758,54 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { range(y, aabb.min.y, aabb.max.y) { range(x, aabb.min.x, aabb.max.x) { - range(offset, 0, samplesPerPixel) { + //range(offset, 0, samplesPerPixel) { + offset = 0; int fragmentId = getIndex(x, y, width); int sampleId = samplesPerPixel * fragmentId + offset; - glm::vec2 viewPos = glm::vec2(x, y); - glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, viewPos); + glm::vec2 screenPos = glm::vec2(x, y); + // determine if screenPos is inside polygon + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, screenPos); if (isBarycentricCoordInBounds(barycentricCoord)) { float depth = getFragmentDepth(barycentricCoord, tri); + + // if the sample is not occluded if ((unsigned int)depth == depths[sampleId]) { Fragment &fragment = fragments[fragmentId]; - //fragment.dev_diffuseTex = primitive.dev_diffuseTex; - fragment.viewPos = glm::vec3(viewPos, depth); - fragment.viewNor = glm::vec3(0); + fragment.viewPos = glm::vec3(screenPos, depth); + //atomicAddVec3(fragment.viewPos, glm::vec3(screenPos, depth) / (float)samplesPerPixel); + + // interpolate texcoord and texnorm + fragment.viewNorm = glm::vec3(0); glm::vec2 texcoord(0); float texWeightNorm = 0; - int k; range(k, 0, 3) { float weight = barycentricCoord[k]; Vertex v = primitive.v[k]; - fragment.viewNor += weight * v.viewNor; + + fragment.viewNorm += weight * v.viewNorm; + //atomicAddVec3(fragment.viewNorm, weight * v.viewNor / (float)samplesPerPixel); + float texWeight = weight / v.viewPos.z; texcoord += texWeight * v.texcoord0; texWeightNorm += texWeight; } + // get the color using texcoord texcoord /= texWeightNorm; glm::vec2 texRes = primitive.texRes; glm::vec2 scaledCoord = texcoord * glm::vec2(texRes.x, texRes.y); int tid = 3 * getIndex((int)scaledCoord.x, (int)scaledCoord.y, texRes.x); - TextureData *tex = primitive.diffuseTex; - fragment.color = glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]) / 255.0f; + TextureData *tex = primitive.diffuseTex; + glm::vec3 color = glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]) / 255.0f; + + fragment.color = color; + //atomicAddVec3(fragment.color, color / (float)samplesPerPixel); } } - } + //} } } } @@ -794,11 +822,12 @@ void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffe glm::vec3 L = glm::normalize(glm::vec3(0, 1, 1));//lightPos - frag.viewPos); glm::vec3 V = glm::normalize(-frag.viewPos); glm::vec3 H = glm::normalize(L + V); - float intensity = saturate(glm::dot(frag.viewNor, H) + 0.2); + float intensity = saturate(glm::dot(frag.viewNorm, H) + 0.2); if (SHOW_TEXTURE) { intensity = 1; } framebuffer[index] = intensity * frag.color; + //framebuffer[index] = frag.color; } /** @@ -854,11 +883,13 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g checkCUDAError("Vertex Processing and Primitive Assembly"); } - //int numSamples = samplesPerPixel * height * width; - //dim3 blockSize = numSamples / numThreadsPerBlock.x + 1; //_initDepth << > >(numSamples, dev_depth); cudaMemset(dev_depth, 0xff, samplesPerPixel * width * height * sizeof(dev_depth[0])); cudaMemset(dev_framebuffer, 0, width * height * sizeof(Fragment)); + + int numFragments = height * width; + dim3 blockSizeFrag = numFragments / numThreadsPerBlock.x + 1; + _fragmentInit<<>>(dev_fragmentBuffer, numFragments); // TODO: rasterize dim3 blockSize = totalNumPrimitives / numThreadsPerBlock.x + 1; From faf745682100f4e709319cb893decd7be57b4031 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Fri, 28 Oct 2016 14:59:08 -0400 Subject: [PATCH 22/37] going back to working to see when mixed-depth bug happens --- src/rasterize.cu | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 2f27c0c..8952671 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -84,6 +84,7 @@ namespace { glm::vec3 viewPos; // eye space position used for shading glm::vec3 viewNorm; TextureData* diffuseTex; + float numSamples; // ... }; @@ -712,6 +713,7 @@ void _fragmentInit(Fragment fragments[], int n_fragments) { fragment.color = glm::vec3(0); fragment.viewPos = glm::vec3(0); fragment.viewNorm = glm::vec3(0); + fragment.numSamples = 0; } } @@ -739,9 +741,10 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { range(offset, 0, samplesPerPixel) { int sampleId = samplesPerPixel * fragmentId + offset; + glm::vec2 screenPos = glm::vec2(x, y); // determine if screenPos is inside polygon - glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, glm::vec2(x, y)); + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, screenPos); if (isBarycentricCoordInBounds(barycentricCoord)) { unsigned int depth = getFragmentDepth(barycentricCoord, tri); @@ -758,8 +761,7 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { range(y, aabb.min.y, aabb.max.y) { range(x, aabb.min.x, aabb.max.x) { - //range(offset, 0, samplesPerPixel) { - offset = 0; + range(offset, 0, samplesPerPixel) { int fragmentId = getIndex(x, y, width); int sampleId = samplesPerPixel * fragmentId + offset; glm::vec2 screenPos = glm::vec2(x, y); @@ -773,7 +775,7 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { if ((unsigned int)depth == depths[sampleId]) { Fragment &fragment = fragments[fragmentId]; - fragment.viewPos = glm::vec3(screenPos, depth); + fragment.viewPos += glm::vec3(screenPos, depth); //atomicAddVec3(fragment.viewPos, glm::vec3(screenPos, depth) / (float)samplesPerPixel); // interpolate texcoord and texnorm @@ -785,7 +787,7 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { float weight = barycentricCoord[k]; Vertex v = primitive.v[k]; - fragment.viewNorm += weight * v.viewNorm; + fragment.viewNorm = weight * v.viewNorm; //atomicAddVec3(fragment.viewNorm, weight * v.viewNor / (float)samplesPerPixel); float texWeight = weight / v.viewPos.z; @@ -801,11 +803,12 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { TextureData *tex = primitive.diffuseTex; glm::vec3 color = glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]) / 255.0f; - fragment.color = color; + atomicAddVec3(fragment.color, color); + atomicAdd(&fragment.numSamples, 1.0f); //atomicAddVec3(fragment.color, color / (float)samplesPerPixel); } } - //} + } } } } @@ -826,8 +829,8 @@ void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffe if (SHOW_TEXTURE) { intensity = 1; } - framebuffer[index] = intensity * frag.color; - //framebuffer[index] = frag.color; + framebuffer[index] = intensity * frag.color / frag.numSamples; + framebuffer[index] = frag.color / frag.numSamples; } /** From 16a2c4ccc8457a74809c7895c325d1bb5c48a312 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Fri, 28 Oct 2016 16:28:31 -0400 Subject: [PATCH 23/37] solved the upside down bug --- src/rasterize.cu | 51 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 8952671..3d6b2e8 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -23,7 +23,7 @@ #define IDy ((blockIdx.y * blockDim.y) + threadIdx.y) #define MAX_DEPTH 10000.0f #define DEPTH_QUANTUM (float)(INT_MAX / MAX_DEPTH) -#define getIndex(x, y, width) (x + y * width) +#define getIndex(x, y, width) ((x) + (y) * (width)) #define samplesPerPixel 1 @@ -32,7 +32,11 @@ #define debug0(...) if (DEBUG == 1 && id == 0) { printf (__VA_ARGS__); } #define debug1(...) if (DEBUG == 1 && id == 1) { printf (__VA_ARGS__); } #define debugDuck(...) if (DEBUG == 1 && id == 330033) { printf (__VA_ARGS__); } +#define debugMinMax(...) if (DEBUG == 1 && id == 320) { printf (__VA_ARGS__); } +#define debugDepthsId 369228 +#define debugDepths(...) if (DEBUG == 1 && id == debugDepthsId) { printf (__VA_ARGS__); } //#define debugBoard(...) if (DEBUG == 1 && id == ) { printf (__VA_ARGS__); } + #define range(i, start, stop) for (i = start; i < stop; i++) #define SHOW_TEXTURE 0 #define debug(...) if (DEBUG == 1) { printf (__VA_ARGS__); } @@ -84,7 +88,7 @@ namespace { glm::vec3 viewPos; // eye space position used for shading glm::vec3 viewNorm; TextureData* diffuseTex; - float numSamples; + int numSamples; // ... }; @@ -644,6 +648,10 @@ void _vertexTransformAndAssembly( glm::vec4 screenDims(width, height, 1, 1); vertex.pos = screenDims * (clipPos / clipPos.w + glm::vec4(1, 1, 0, 0)) / 2.0f; + if (vertex.pos.y > height) { + debug("WFT: %d", vertex.pos.y); + } + // Assemble all attribute arrays into the primitive array vertex.texcoord0 = vertexParts.texcoord0[IDx]; } @@ -733,11 +741,12 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { } AABB aabb = getAABBForTriangle(tri); + range(y, aabb.min.y, aabb.max.y) { range(x, aabb.min.x, aabb.max.x) { // zero out values of fragment struct - int fragmentId = getIndex(x, y, width); + int fragmentId = getIndex(x, height - y, width); range(offset, 0, samplesPerPixel) { int sampleId = samplesPerPixel * fragmentId + offset; @@ -762,7 +771,7 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { range(y, aabb.min.y, aabb.max.y) { range(x, aabb.min.x, aabb.max.x) { range(offset, 0, samplesPerPixel) { - int fragmentId = getIndex(x, y, width); + int fragmentId = getIndex(x, height - y, width); int sampleId = samplesPerPixel * fragmentId + offset; glm::vec2 screenPos = glm::vec2(x, y); @@ -773,9 +782,11 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { // if the sample is not occluded if ((unsigned int)depth == depths[sampleId]) { + id = fragmentId; + //debugDepths("depth=%u\n", depth); Fragment &fragment = fragments[fragmentId]; - fragment.viewPos += glm::vec3(screenPos, depth); + fragment.viewPos += glm::vec3(screenPos, depth); //atomicAddVec3(fragment.viewPos, glm::vec3(screenPos, depth) / (float)samplesPerPixel); // interpolate texcoord and texnorm @@ -787,7 +798,7 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { float weight = barycentricCoord[k]; Vertex v = primitive.v[k]; - fragment.viewNorm = weight * v.viewNorm; + fragment.viewNorm = weight * v.viewNorm; //atomicAddVec3(fragment.viewNorm, weight * v.viewNor / (float)samplesPerPixel); float texWeight = weight / v.viewPos.z; @@ -803,13 +814,28 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { TextureData *tex = primitive.diffuseTex; glm::vec3 color = glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]) / 255.0f; - atomicAddVec3(fragment.color, color); - atomicAdd(&fragment.numSamples, 1.0f); - //atomicAddVec3(fragment.color, color / (float)samplesPerPixel); + //atomicAddVec3(fragment.color, color); + atomicAdd(&fragment.numSamples, 1); + fragment.color = color; } } } } + + int halfwidth = width / 2; + int halfheight = height / 2; + int cr = 3; + if (halfwidth - cr < x && halfheight + cr > x && halfheight + cr > y && halfheight - cr < y) { + int fragmentId = getIndex(x, height - y, width); + int sampleId = samplesPerPixel * fragmentId + offset; + glm::vec2 screenPos = glm::vec2(x, y); + glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, screenPos); + float depth = getFragmentDepth(barycentricCoord, tri); + fragments[fragmentId].color = glm::vec3(1, 0, 0); + if (x == halfwidth && y == halfheight) { + debug("depth=%y", depth); + } + } } } @@ -829,8 +855,11 @@ void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffe if (SHOW_TEXTURE) { intensity = 1; } - framebuffer[index] = intensity * frag.color / frag.numSamples; - framebuffer[index] = frag.color / frag.numSamples; + //framebuffer[index] = intensity * frag.color / frag.numSamples; + //framebuffer[index] = frag.color / frag.numSamples; + framebuffer[index] = frag.color / (float)frag.numSamples; + int id = index; + if (frag.numSamples > 1) debugDepths("numSamples=%d\n", frag.numSamples); } /** From fe888b605602f368ab83697315266fda4f617c41 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Fri, 28 Oct 2016 17:42:15 -0400 Subject: [PATCH 24/37] broken. working on screen going black with samplesPerPixel > 1 --- src/rasterize.cu | 83 ++++++++++++++++++------------------------------ 1 file changed, 31 insertions(+), 52 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 3d6b2e8..6773cf2 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -24,7 +24,7 @@ #define MAX_DEPTH 10000.0f #define DEPTH_QUANTUM (float)(INT_MAX / MAX_DEPTH) #define getIndex(x, y, width) ((x) + (y) * (width)) -#define samplesPerPixel 1 +#define samplesPerPixel 2 #define DEBUG 1 @@ -58,7 +58,7 @@ namespace { }; struct Vertex { - glm::vec4 pos; + glm::vec4 screenPos; // TODO: add new attributes to your VertexOut // The attributes listed below might be useful, @@ -163,7 +163,7 @@ void rasterizeInit(int w, int h) { cudaFree(dev_fragmentBuffer); cudaMalloc(&dev_fragmentBuffer, width * height * sizeof(Fragment)); - cudaMemset(dev_fragmentBuffer, 0, width * height * sizeof(Fragment)); + cudaMemset(dev_fragmentBuffer, 0, samplesPerPixel * width * height * sizeof(Fragment)); cudaFree(dev_framebuffer); cudaMalloc(&dev_framebuffer, width * height * sizeof(glm::vec3)); @@ -646,10 +646,10 @@ void _vertexTransformAndAssembly( vertex.viewNorm = glm::vec3(MV_normal * vertexParts.normal[IDx]); glm::vec4 clipPos(MVP * modelPos); glm::vec4 screenDims(width, height, 1, 1); - vertex.pos = screenDims * (clipPos / clipPos.w + glm::vec4(1, 1, 0, 0)) / 2.0f; + vertex.screenPos = screenDims * (clipPos / clipPos.w + glm::vec4(1, 1, 1, 0)) / 2.0f; - if (vertex.pos.y > height) { - debug("WFT: %d", vertex.pos.y); + if (vertex.screenPos.y > height) { + debug("WFT: %d", vertex.screenPos.y); } // Assemble all attribute arrays into the primitive array @@ -695,14 +695,14 @@ float getFragmentDepth(glm::vec3 bcCoord, glm::vec3 tri[3]) { range(i, 0, 3) { depth += bcCoord[i] * tri[i].z; } - if (depth > MAX_DEPTH) { + if (depth > 1) { return INT_MAX; } else if (depth < 0) { return 0; } else { - return depth * DEPTH_QUANTUM; + return depth * INT_MAX; } } @@ -737,19 +737,17 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { glm::vec3 tri[3]; range(i, 0, 3) { // get coordinates of tri points - tri[i] = glm::vec3(primitive.v[i].pos); + tri[i] = glm::vec3(primitive.v[i].screenPos); } AABB aabb = getAABBForTriangle(tri); - range(y, aabb.min.y, aabb.max.y) { range(x, aabb.min.x, aabb.max.x) { // zero out values of fragment struct - int fragmentId = getIndex(x, height - y, width); range(offset, 0, samplesPerPixel) { - int sampleId = samplesPerPixel * fragmentId + offset; + int index = samplesPerPixel * getIndex(width - x, height - y, width) + offset; glm::vec2 screenPos = glm::vec2(x, y); // determine if screenPos is inside polygon @@ -759,7 +757,7 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { // assign fragEyePos.z to dev_depth[i] iff it is smaller // (fragment is closer to camera) - atomicMin(depths + sampleId, depth); + atomicMin(depths + index, depth); } } } @@ -771,8 +769,7 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { range(y, aabb.min.y, aabb.max.y) { range(x, aabb.min.x, aabb.max.x) { range(offset, 0, samplesPerPixel) { - int fragmentId = getIndex(x, height - y, width); - int sampleId = samplesPerPixel * fragmentId + offset; + int index = samplesPerPixel * getIndex(width - x, height - y, width) + offset; glm::vec2 screenPos = glm::vec2(x, y); // determine if screenPos is inside polygon @@ -781,15 +778,13 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { float depth = getFragmentDepth(barycentricCoord, tri); // if the sample is not occluded - if ((unsigned int)depth == depths[sampleId]) { - id = fragmentId; + if ((unsigned int)depth == depths[index]) { //debugDepths("depth=%u\n", depth); - Fragment &fragment = fragments[fragmentId]; + Fragment &fragment = fragments[index]; - fragment.viewPos += glm::vec3(screenPos, depth); - //atomicAddVec3(fragment.viewPos, glm::vec3(screenPos, depth) / (float)samplesPerPixel); - // interpolate texcoord and texnorm + // interpolate texcoord and viewPos and texnorm + fragment.viewPos = glm::vec3(0); fragment.viewNorm = glm::vec3(0); glm::vec2 texcoord(0); float texWeightNorm = 0; @@ -799,6 +794,7 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { Vertex v = primitive.v[k]; fragment.viewNorm = weight * v.viewNorm; + fragment.viewPos = weight * v.viewPos; //atomicAddVec3(fragment.viewNorm, weight * v.viewNor / (float)samplesPerPixel); float texWeight = weight / v.viewPos.z; @@ -815,27 +811,11 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { glm::vec3 color = glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]) / 255.0f; //atomicAddVec3(fragment.color, color); - atomicAdd(&fragment.numSamples, 1); fragment.color = color; } } } } - - int halfwidth = width / 2; - int halfheight = height / 2; - int cr = 3; - if (halfwidth - cr < x && halfheight + cr > x && halfheight + cr > y && halfheight - cr < y) { - int fragmentId = getIndex(x, height - y, width); - int sampleId = samplesPerPixel * fragmentId + offset; - glm::vec2 screenPos = glm::vec2(x, y); - glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, screenPos); - float depth = getFragmentDepth(barycentricCoord, tri); - fragments[fragmentId].color = glm::vec3(1, 0, 0); - if (x == halfwidth && y == halfheight) { - debug("depth=%y", depth); - } - } } } @@ -845,21 +825,20 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { __global__ void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffer) { if (IDx >= w || IDy >= h) return; - int index = IDx + (IDy * w); - Fragment frag = fragmentBuffer[index]; - glm::vec3 lightPos(0); - glm::vec3 L = glm::normalize(glm::vec3(0, 1, 1));//lightPos - frag.viewPos); - glm::vec3 V = glm::normalize(-frag.viewPos); - glm::vec3 H = glm::normalize(L + V); - float intensity = saturate(glm::dot(frag.viewNorm, H) + 0.2); - if (SHOW_TEXTURE) { - intensity = 1; + int index = getIndex(IDx, IDy, w); + int offset; + range(offset, 0, samplesPerPixel) { + Fragment frag = fragmentBuffer[samplesPerPixel * index + offset]; + glm::vec3 lightPos(0); + glm::vec3 L = glm::normalize(glm::vec3(0, 1, 1));//lightPos - frag.viewPos); + glm::vec3 V = glm::normalize(-frag.viewPos); + glm::vec3 H = glm::normalize(L + V); + float intensity = saturate(glm::dot(frag.viewNorm, H) + 0.2); + if (SHOW_TEXTURE) { + intensity = 1; + } + framebuffer[index] = intensity * frag.color / (float)samplesPerPixel; } - //framebuffer[index] = intensity * frag.color / frag.numSamples; - //framebuffer[index] = frag.color / frag.numSamples; - framebuffer[index] = frag.color / (float)frag.numSamples; - int id = index; - if (frag.numSamples > 1) debugDepths("numSamples=%d\n", frag.numSamples); } /** @@ -919,7 +898,7 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g cudaMemset(dev_depth, 0xff, samplesPerPixel * width * height * sizeof(dev_depth[0])); cudaMemset(dev_framebuffer, 0, width * height * sizeof(Fragment)); - int numFragments = height * width; + int numFragments = height * width * samplesPerPixel; dim3 blockSizeFrag = numFragments / numThreadsPerBlock.x + 1; _fragmentInit<<>>(dev_fragmentBuffer, numFragments); From 796383033b838d23b856531688da7db38c000c18 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Fri, 28 Oct 2016 18:09:27 -0400 Subject: [PATCH 25/37] can render with supersampling although color is screwed up. --- src/rasterize.cu | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 6773cf2..2abc1bd 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -24,7 +24,7 @@ #define MAX_DEPTH 10000.0f #define DEPTH_QUANTUM (float)(INT_MAX / MAX_DEPTH) #define getIndex(x, y, width) ((x) + (y) * (width)) -#define samplesPerPixel 2 +#define samplesPerPixel 3 #define DEBUG 1 @@ -160,17 +160,18 @@ void _sendImageToPBO(uchar4 *pbo, int w, int h, glm::vec3 *image) { void rasterizeInit(int w, int h) { width = w; height = h; + int numSamples = samplesPerPixel * width * height; cudaFree(dev_fragmentBuffer); - cudaMalloc(&dev_fragmentBuffer, width * height * sizeof(Fragment)); - cudaMemset(dev_fragmentBuffer, 0, samplesPerPixel * width * height * sizeof(Fragment)); + cudaMalloc(&dev_fragmentBuffer, numSamples * sizeof(Fragment)); + cudaMemset(dev_fragmentBuffer, 0, numSamples * sizeof(Fragment)); cudaFree(dev_framebuffer); cudaMalloc(&dev_framebuffer, width * height * sizeof(glm::vec3)); cudaMemset(dev_framebuffer, 0, width * height * sizeof(glm::vec3)); cudaFree(dev_depth); - cudaMalloc(&dev_depth, samplesPerPixel * width * height * sizeof(int)); + cudaMalloc(&dev_depth, numSamples * sizeof(unsigned int)); checkCUDAError("rasterizeInit"); } @@ -714,18 +715,6 @@ __device__ } } -__global__ -void _fragmentInit(Fragment fragments[], int n_fragments) { - if (IDx < n_fragments) { - Fragment &fragment = fragments[IDx]; - fragment.color = glm::vec3(0); - fragment.viewPos = glm::vec3(0); - fragment.viewNorm = glm::vec3(0); - fragment.numSamples = 0; - } - -} - __global__ void _rasterize(int n_primitives, int height, int width, const Primitive *primitives, unsigned int *depths, Fragment *fragments) { @@ -812,6 +801,8 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { //atomicAddVec3(fragment.color, color); fragment.color = color; + int id = index; + debug("color in rasterize=%f %f %f\n", color.r, color.g, color.b); } } } @@ -828,7 +819,8 @@ void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffe int index = getIndex(IDx, IDy, w); int offset; range(offset, 0, samplesPerPixel) { - Fragment frag = fragmentBuffer[samplesPerPixel * index + offset]; + int sampleId = samplesPerPixel * index + offset; + Fragment frag = fragmentBuffer[sampleId]; glm::vec3 lightPos(0); glm::vec3 L = glm::normalize(glm::vec3(0, 1, 1));//lightPos - frag.viewPos); glm::vec3 V = glm::normalize(-frag.viewPos); @@ -837,6 +829,11 @@ void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffe if (SHOW_TEXTURE) { intensity = 1; } + int id = sampleId; + //debug("color in render=%f %f %f\n", + // frag.color.r, + // frag.color.g, + // frag.color.b); framebuffer[index] = intensity * frag.color / (float)samplesPerPixel; } } @@ -852,7 +849,7 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g // Execute your rasterization pipeline here cudaMemset(dev_primitives, 0, width * height * sizeof(Primitive)); - cudaMemset(dev_fragmentBuffer, 0, width * height * sizeof(Fragment)); + cudaMemset(dev_fragmentBuffer, 0, samplesPerPixel * width * height * sizeof(Fragment)); // (See README for rasterization pipeline outline.) @@ -897,10 +894,6 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g //_initDepth << > >(numSamples, dev_depth); cudaMemset(dev_depth, 0xff, samplesPerPixel * width * height * sizeof(dev_depth[0])); cudaMemset(dev_framebuffer, 0, width * height * sizeof(Fragment)); - - int numFragments = height * width * samplesPerPixel; - dim3 blockSizeFrag = numFragments / numThreadsPerBlock.x + 1; - _fragmentInit<<>>(dev_fragmentBuffer, numFragments); // TODO: rasterize dim3 blockSize = totalNumPrimitives / numThreadsPerBlock.x + 1; From 4ab27a79b91ebe921bfdb5cbe1851023ed5b26c4 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Fri, 28 Oct 2016 18:45:03 -0400 Subject: [PATCH 26/37] duck is working, but no jitter and cesium truck/cow/box is not working --- src/rasterize.cu | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 2abc1bd..53b4701 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -379,10 +379,10 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { return; // TODO: add new attributes for your PrimitiveDevBufPointers when you add new attributes - VertexIndex* dev_indices; - VertexAttributePosition* dev_position; - VertexAttributeNormal* dev_normal; - VertexAttributeTexcoord* dev_texcoord0; + VertexIndex* dev_indices = NULL; + VertexAttributePosition* dev_position = NULL; + VertexAttributeNormal* dev_normal = NULL; + VertexAttributeTexcoord* dev_texcoord0 = NULL; // ----------Indices------------- @@ -649,10 +649,6 @@ void _vertexTransformAndAssembly( glm::vec4 screenDims(width, height, 1, 1); vertex.screenPos = screenDims * (clipPos / clipPos.w + glm::vec4(1, 1, 1, 0)) / 2.0f; - if (vertex.screenPos.y > height) { - debug("WFT: %d", vertex.screenPos.y); - } - // Assemble all attribute arrays into the primitive array vertex.texcoord0 = vertexParts.texcoord0[IDx]; } @@ -704,7 +700,7 @@ float getFragmentDepth(glm::vec3 bcCoord, glm::vec3 tri[3]) { } else { return depth * INT_MAX; - } + }; } __device__ @@ -777,14 +773,12 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { fragment.viewNorm = glm::vec3(0); glm::vec2 texcoord(0); float texWeightNorm = 0; - int k; - range(k, 0, 3) { - float weight = barycentricCoord[k]; - Vertex v = primitive.v[k]; + range(i, 0, 3) { + float weight = barycentricCoord[i]; + Vertex v = primitive.v[i]; - fragment.viewNorm = weight * v.viewNorm; - fragment.viewPos = weight * v.viewPos; - //atomicAddVec3(fragment.viewNorm, weight * v.viewNor / (float)samplesPerPixel); + fragment.viewNorm += weight * v.viewNorm; + fragment.viewPos += weight * v.viewPos; float texWeight = weight / v.viewPos.z; texcoord += texWeight * v.texcoord0; @@ -802,7 +796,6 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { //atomicAddVec3(fragment.color, color); fragment.color = color; int id = index; - debug("color in rasterize=%f %f %f\n", color.r, color.g, color.b); } } } @@ -822,7 +815,7 @@ void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffe int sampleId = samplesPerPixel * index + offset; Fragment frag = fragmentBuffer[sampleId]; glm::vec3 lightPos(0); - glm::vec3 L = glm::normalize(glm::vec3(0, 1, 1));//lightPos - frag.viewPos); + glm::vec3 L = glm::normalize(glm::vec3(0, -1, -1));//lightPos - frag.viewPos); glm::vec3 V = glm::normalize(-frag.viewPos); glm::vec3 H = glm::normalize(L + V); float intensity = saturate(glm::dot(frag.viewNorm, H) + 0.2); @@ -830,7 +823,6 @@ void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffe intensity = 1; } int id = sampleId; - //debug("color in render=%f %f %f\n", // frag.color.r, // frag.color.g, // frag.color.b); From a6019c3232e617e9902ea328e5e6e2ef6cfc9579 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Fri, 28 Oct 2016 18:46:05 -0400 Subject: [PATCH 27/37] added checkerboard --- gltfs/checkerboard.gltf | 301 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 301 insertions(+) create mode 100644 gltfs/checkerboard.gltf diff --git a/gltfs/checkerboard.gltf b/gltfs/checkerboard.gltf new file mode 100644 index 0000000..a333738 --- /dev/null +++ b/gltfs/checkerboard.gltf @@ -0,0 +1,301 @@ +{ + "accessors": { + "accessor_index_0": { + "bufferView": "bufferView_1", + "byteOffset": 0, + "byteStride": 0, + "componentType": 5123, + "count": 6, + "type": "SCALAR", + "min": [ + 0 + ], + "max": [ + 3 + ] + }, + "accessor_position": { + "bufferView": "bufferView_0", + "byteOffset": 0, + "byteStride": 0, + "componentType": 5126, + "count": 4, + "min": [ + -1, + 0, + -1 + ], + "max": [ + 1, + 0, + 1 + ], + "type": "VEC3" + }, + "accessor_uv": { + "bufferView": "bufferView_0", + "byteOffset": 48, + "byteStride": 0, + "componentType": 5126, + "count": 4, + "type": "VEC2", + "min": [ + 0.00009999999747378752, + 0.00009999999747378752 + ], + "max": [ + 0.9998999834060669, + 0.9998999834060669 + ] + }, + "accessor_normal_generated": { + "bufferView": "bufferView_0", + "byteOffset": 80, + "byteStride": 0, + "componentType": 5126, + "count": 4, + "type": "VEC3", + "min": [ + 0, + 1, + 0 + ], + "max": [ + 0, + 1, + 0 + ] + } + }, + "asset": { + "generator": "OBJ2GLTF", + "premultipliedAlpha": true, + "profile": { + "api": "WebGL", + "version": "1.0" + }, + "version": "1.0" + }, + "buffers": { + "buffer_0": { + "type": "arraybuffer", + "byteLength": 140, + "uri": "data:application/octet-stream;base64,AACAvwAAAAAAAIA/AACAPwAAAAAAAIA/AACAPwAAAAAAAIC/AACAvwAAAAAAAIC/F7fROHL5fz9y+X8/cvl/P3L5fz8Xt9E4F7fROBe30TgAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAEAAgAAAAIAAwA=" + } + }, + "bufferViews": { + "bufferView_0": { + "buffer": "buffer_0", + "byteLength": 128, + "byteOffset": 0, + "target": 34962 + }, + "bufferView_1": { + "buffer": "buffer_0", + "byteLength": 12, + "byteOffset": 128, + "target": 34963 + } + }, + "images": { + "Checkered": { + "uri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhwAAAIcCAIAAAAynOArAAAACXBIWXMAAAsTAAALEwEAmpwYAAALjUlEQVR42u3ZMU5jZxuGYY5tJtiWEGnRrGNSjKZmD6np2Uf2geQGiWWkQyILCQVgG5njvxhpVnAX/3GuawevnuLWp2/4559/lsvl2cTNZrO///77zz///P3336d+yx9//PHXX3+tViujGMUoRpmWi4uLxWq1OoFV5vP5zzT++++/U7/l7e1ttVqt12ujGMUoRpmW1Wo1m/oNAPz/EBUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAzGI2m83n86mfcQIn/LLb7YZhMIpRjGKUyXl/fx82m81yuTyBY8ZxfH19PR6PUz/kcDhcXl6en58bxShGMcq0fHx8DCewx0/39/c3NzfjOE79kO12e3d39/j4aBSjGMUo07Lf7xdXV1cvLy8nsMrxeBzH8fPz8wRuGYYTib1RjGKU/9Qo4zj6qAcgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAmcW3b9/e3t6mfsZutzscDrvd7ng8Tv2W7Xb79evX79+/G8UoRjHKtOz3++H5+Xm5XE79kmEYnp6eNpvNbDb5t9f19fXt7e3FxYVRjGIUo0zLly9fFuv1erVaTf2S+Xy+WCweHh6mfsjZ2dmPHz+Wy+V6vTaKUYxilGlZrVb+VADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJAZjGbzebz+dTPOIETftntdsMwGMUoRjHK5Ly/vw+bzWa5XJ7AMeM4vr6+Ho/HqR9yOBwuLy/Pz8+NYhSjGGVaPj4+hhPY46f7+/ubm5txHKd+yHa7vbu7e3x8NIpRjGKUadnv94urq6uXl5cTWOV4PI7j+Pn5eQK3DMOJxN4oRjHKf2qUcRx91AOQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAzOLbt29vb29TP2O32x0Oh91udzwep37Ldrv9+vXr9+/fjWIUoxhlWvb7/fD8/LxcLqd+yTAMT09Pm81mNpv82+v6+vr29vbi4sIoRjGKUably5cvi/V6vVqtpn7JfD5fLBYPDw9TP+Ts7OzHjx/L5XK9XhvFKEYxyrSsVit/KgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgs5jNZvP5fOpnnMAJv+x2u2EYjGIUoxhlct7f34fNZrNcLk/gmHEcX19fj8fj1A85HA6Xl5fn5+dGMYpRjDItHx8fwwns8dP9/f3Nzc04jlM/ZLvd3t3dPT4+GsUoRjHKtOz3+8XV1dXLy8sJrHI8Hsdx/Pz8PIFbhuFEYm8UoxjlPzXKOI4+6gHIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJAZvHt27e3t7epn7Hb7Q6Hw263Ox6PU79lu91+/fr1+/fvRjGKUYwyLfv9fnh+fl4ul1O/ZBiGp6enzWYzm03+7XV9fX17e3txcWEUoxjFKNPy5cuXxXq9Xq1WU79kPp8vFouHh4epH3J2dvbjx4/lcrler41iFKMYZVpWq5U/FQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQWcxms/l8PvUzTuCEX3a73TAMRjGKUYwyOe/v78Nms1kulydwzDiOr6+vx+Nx6occDofLy8vz83OjGMUoRpmWj4+P4QT2+On+/v7m5mYcx6kfst1u7+7uHh8fjWIUoxhlWvb7/eLq6url5eUEVjkej+M4fn5+nsAtw3AisTeKUYzynxplHEcf9QBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgIyoAZEQFgIyoAJARFQAyogJARlQAyIgKABlRASAjKgBkRAWAjKgAkBEVADKiAkBGVADIiAoAGVEBICMqAGREBYCMqACQERUAMqICQEZUAMiICgAZUQEgs7i4uFgul1M/Y7vdfnx8fHx8jOM49Vv2+/1vv/1mFKMYxShTHOV/51nv6/az2UUAAAAASUVORK5CYII=" + } + }, + "materials": { + "material_Material.001": { + "name": "Material.001", + "extensions": {}, + "values": { + "ambient": [ + 0, + 0, + 0, + 1 + ], + "diffuse": "texture_Checkered", + "emission": [ + 0, + 0, + 0, + 1 + ], + "specular": [ + 0.5, + 0.5, + 0.5, + 1 + ], + "shininess": 96.078431, + "transparency": 1 + }, + "technique": "technique0" + } + }, + "meshes": { + "mesh_checkerboard": { + "name": "checkerboard", + "primitives": [ + { + "attributes": { + "POSITION": "accessor_position", + "TEXCOORD_0": "accessor_uv", + "NORMAL": "accessor_normal_generated" + }, + "indices": "accessor_index_0", + "material": "material_Material.001", + "mode": 4 + } + ] + } + }, + "nodes": { + "rootNode": { + "children": [], + "meshes": [ + "mesh_checkerboard" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ] + } + }, + "samplers": { + "sampler_0": { + "magFilter": 9729, + "minFilter": 9986, + "wrapS": 10497, + "wrapT": 10497 + } + }, + "scene": "scene_checkerboard", + "scenes": { + "scene_checkerboard": { + "nodes": [ + "rootNode" + ] + } + }, + "textures": { + "texture_Checkered": { + "format": 6407, + "internalFormat": 6407, + "sampler": "sampler_0", + "source": "Checkered", + "target": 3553, + "type": 5121 + } + }, + "extensionsUsed": [], + "animations": {}, + "cameras": {}, + "techniques": { + "technique0": { + "attributes": { + "a_position": "position", + "a_normal": "normal", + "a_texcoord_0": "texcoord_0" + }, + "parameters": { + "modelViewMatrix": { + "semantic": "MODELVIEW", + "type": 35676 + }, + "projectionMatrix": { + "semantic": "PROJECTION", + "type": 35676 + }, + "normalMatrix": { + "semantic": "MODELVIEWINVERSETRANSPOSE", + "type": 35675 + }, + "ambient": { + "type": 35666 + }, + "diffuse": { + "type": 35678 + }, + "emission": { + "type": 35666 + }, + "specular": { + "type": 35666 + }, + "shininess": { + "type": 5126 + }, + "transparency": { + "type": 5126 + }, + "position": { + "semantic": "POSITION", + "type": 35665 + }, + "normal": { + "semantic": "NORMAL", + "type": 35665 + }, + "texcoord_0": { + "semantic": "TEXCOORD_0", + "type": 35664 + } + }, + "program": "program0", + "states": { + "enable": [ + 2884, + 2929 + ] + }, + "uniforms": { + "u_modelViewMatrix": "modelViewMatrix", + "u_projectionMatrix": "projectionMatrix", + "u_normalMatrix": "normalMatrix", + "u_ambient": "ambient", + "u_diffuse": "diffuse", + "u_emission": "emission", + "u_specular": "specular", + "u_shininess": "shininess", + "u_transparency": "transparency" + } + } + }, + "programs": { + "program0": { + "attributes": [ + "a_position", + "a_normal", + "a_texcoord_0" + ], + "fragmentShader": "fragmentShader0", + "vertexShader": "vertexShader0" + } + }, + "shaders": { + "vertexShader0": { + "type": 35633, + "uri": "data:text/plain;base64,cHJlY2lzaW9uIGhpZ2hwIGZsb2F0Owp1bmlmb3JtIG1hdDQgdV9tb2RlbFZpZXdNYXRyaXg7CnVuaWZvcm0gbWF0NCB1X3Byb2plY3Rpb25NYXRyaXg7CnVuaWZvcm0gbWF0MyB1X25vcm1hbE1hdHJpeDsKYXR0cmlidXRlIHZlYzMgYV9wb3NpdGlvbjsKdmFyeWluZyB2ZWMzIHZfcG9zaXRpb25FQzsKYXR0cmlidXRlIHZlYzMgYV9ub3JtYWw7CnZhcnlpbmcgdmVjMyB2X25vcm1hbDsKYXR0cmlidXRlIHZlYzIgYV90ZXhjb29yZF8wOwp2YXJ5aW5nIHZlYzIgdl90ZXhjb29yZF8wOwp2b2lkIG1haW4odm9pZCkgewogIHZlYzQgcG9zID0gdV9tb2RlbFZpZXdNYXRyaXggKiB2ZWM0KGFfcG9zaXRpb24sMS4wKTsKICB2X3Bvc2l0aW9uRUMgPSBwb3MueHl6OwogIGdsX1Bvc2l0aW9uID0gdV9wcm9qZWN0aW9uTWF0cml4ICogcG9zOwogIHZfbm9ybWFsID0gdV9ub3JtYWxNYXRyaXggKiBhX25vcm1hbDsKICB2X3RleGNvb3JkXzAgPSBhX3RleGNvb3JkXzA7Cn0K" + }, + "fragmentShader0": { + "type": 35632, + "uri": "data:text/plain;base64,cHJlY2lzaW9uIGhpZ2hwIGZsb2F0Owp1bmlmb3JtIHZlYzQgdV9hbWJpZW50Owp1bmlmb3JtIHNhbXBsZXIyRCB1X2RpZmZ1c2U7CnVuaWZvcm0gdmVjNCB1X2VtaXNzaW9uOwp1bmlmb3JtIHZlYzQgdV9zcGVjdWxhcjsKdW5pZm9ybSBmbG9hdCB1X3NoaW5pbmVzczsKdW5pZm9ybSBmbG9hdCB1X3RyYW5zcGFyZW5jeTsKdmFyeWluZyB2ZWMzIHZfcG9zaXRpb25FQzsKdmFyeWluZyB2ZWMzIHZfbm9ybWFsOwp2YXJ5aW5nIHZlYzIgdl90ZXhjb29yZF8wOwp2b2lkIG1haW4odm9pZCkgewogIHZlYzMgbm9ybWFsID0gbm9ybWFsaXplKHZfbm9ybWFsKTsKICB2ZWM0IGRpZmZ1c2UgPSB0ZXh0dXJlMkQodV9kaWZmdXNlLCB2X3RleGNvb3JkXzApOwogIHZlYzMgZGlmZnVzZUxpZ2h0ID0gdmVjMygwLjAsIDAuMCwgMC4wKTsKICB2ZWMzIHNwZWN1bGFyID0gdV9zcGVjdWxhci5yZ2I7CiAgdmVjMyBzcGVjdWxhckxpZ2h0ID0gdmVjMygwLjAsIDAuMCwgMC4wKTsKICB2ZWMzIGVtaXNzaW9uID0gdV9lbWlzc2lvbi5yZ2I7CiAgdmVjMyBhbWJpZW50ID0gdV9hbWJpZW50LnJnYjsKICB2ZWMzIHZpZXdEaXIgPSAtbm9ybWFsaXplKHZfcG9zaXRpb25FQyk7CiAgdmVjMyBhbWJpZW50TGlnaHQgPSB2ZWMzKDAuMCwgMC4wLCAwLjApOwogIGFtYmllbnRMaWdodCArPSB2ZWMzKDAuMiwgMC4yLCAwLjIpOwogIHZlYzMgbCA9IHZlYzMoMC4wLCAwLjAsIDEuMCk7CiAgZGlmZnVzZUxpZ2h0ICs9IHZlYzMoMS4wLCAxLjAsIDEuMCkgKiBtYXgoZG90KG5vcm1hbCxsKSwgMC4pOwogIHZlYzMgaCA9IG5vcm1hbGl6ZShsICsgdmlld0Rpcik7CiAgZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHkgPSBtYXgoMC4sIHBvdyhtYXgoZG90KG5vcm1hbCwgaCksIDAuKSwgdV9zaGluaW5lc3MpKTsKICBzcGVjdWxhckxpZ2h0ICs9IHZlYzMoMS4wLCAxLjAsIDEuMCkgKiBzcGVjdWxhckludGVuc2l0eTsKICB2ZWMzIGNvbG9yID0gdmVjMygwLjAsIDAuMCwgMC4wKTsKICBjb2xvciArPSBkaWZmdXNlLnJnYiAqIGRpZmZ1c2VMaWdodDsKICBjb2xvciArPSBzcGVjdWxhciAqIHNwZWN1bGFyTGlnaHQ7CiAgY29sb3IgKz0gZW1pc3Npb247CiAgY29sb3IgKz0gYW1iaWVudCAqIGFtYmllbnRMaWdodDsKICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yICogZGlmZnVzZS5hLCBkaWZmdXNlLmEgKiB1X3RyYW5zcGFyZW5jeSk7Cn0K" + } + }, + "skins": {}, + "extensions": {} +} From 8d52858ba13830f41c73eecfe0cffd8d10723e50 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Fri, 28 Oct 2016 18:56:27 -0400 Subject: [PATCH 28/37] implemented supersampling with jitter --- src/rasterize.cu | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index 53b4701..f9470d2 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -24,7 +24,8 @@ #define MAX_DEPTH 10000.0f #define DEPTH_QUANTUM (float)(INT_MAX / MAX_DEPTH) #define getIndex(x, y, width) ((x) + (y) * (width)) -#define samplesPerPixel 3 +#define samplesPerPixel 16 +#define ambientLight 0.1 #define DEBUG 1 @@ -725,6 +726,7 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { tri[i] = glm::vec3(primitive.v[i].screenPos); } + thrust::uniform_real_distribution u01(0, 1); AABB aabb = getAABBForTriangle(tri); range(y, aabb.min.y, aabb.max.y) { range(x, aabb.min.x, aabb.max.x) { @@ -733,7 +735,8 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { range(offset, 0, samplesPerPixel) { int index = samplesPerPixel * getIndex(width - x, height - y, width) + offset; - glm::vec2 screenPos = glm::vec2(x, y); + thrust::default_random_engine seed(index); + glm::vec2 screenPos = glm::vec2(x + u01(seed), y + u01(seed)); // determine if screenPos is inside polygon glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, screenPos); @@ -755,7 +758,8 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { range(x, aabb.min.x, aabb.max.x) { range(offset, 0, samplesPerPixel) { int index = samplesPerPixel * getIndex(width - x, height - y, width) + offset; - glm::vec2 screenPos = glm::vec2(x, y); + thrust::default_random_engine seed(index); + glm::vec2 screenPos = glm::vec2(x + u01(seed), y + u01(seed)); // determine if screenPos is inside polygon glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, screenPos); @@ -818,15 +822,9 @@ void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffe glm::vec3 L = glm::normalize(glm::vec3(0, -1, -1));//lightPos - frag.viewPos); glm::vec3 V = glm::normalize(-frag.viewPos); glm::vec3 H = glm::normalize(L + V); - float intensity = saturate(glm::dot(frag.viewNorm, H) + 0.2); - if (SHOW_TEXTURE) { - intensity = 1; - } + float intensity = saturate(glm::dot(frag.viewNorm, H) + 0.2) + ambientLight; int id = sampleId; - // frag.color.r, - // frag.color.g, - // frag.color.b); - framebuffer[index] = intensity * frag.color / (float)samplesPerPixel; + framebuffer[index] += intensity * frag.color / (float)samplesPerPixel; } } @@ -885,7 +883,7 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g //_initDepth << > >(numSamples, dev_depth); cudaMemset(dev_depth, 0xff, samplesPerPixel * width * height * sizeof(dev_depth[0])); - cudaMemset(dev_framebuffer, 0, width * height * sizeof(Fragment)); + cudaMemset(dev_framebuffer, 0, width * height * sizeof(dev_framebuffer[0])); // TODO: rasterize dim3 blockSize = totalNumPrimitives / numThreadsPerBlock.x + 1; From 876105cc7790677ffef651f29bcc06ef9550f0c4 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Fri, 28 Oct 2016 19:03:36 -0400 Subject: [PATCH 29/37] added tune shading --- src/rasterize.cu | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index f9470d2..d23e269 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -26,6 +26,7 @@ #define getIndex(x, y, width) ((x) + (y) * (width)) #define samplesPerPixel 16 #define ambientLight 0.1 +#define tuneShade 0 #define DEBUG 1 @@ -730,12 +731,9 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { AABB aabb = getAABBForTriangle(tri); range(y, aabb.min.y, aabb.max.y) { range(x, aabb.min.x, aabb.max.x) { - - // zero out values of fragment struct - + thrust::default_random_engine seed(getIndex(x, y, width)); range(offset, 0, samplesPerPixel) { int index = samplesPerPixel * getIndex(width - x, height - y, width) + offset; - thrust::default_random_engine seed(index); glm::vec2 screenPos = glm::vec2(x + u01(seed), y + u01(seed)); // determine if screenPos is inside polygon @@ -756,9 +754,9 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { range(y, aabb.min.y, aabb.max.y) { range(x, aabb.min.x, aabb.max.x) { + thrust::default_random_engine seed(getIndex(x, y, width)); range(offset, 0, samplesPerPixel) { int index = samplesPerPixel * getIndex(width - x, height - y, width) + offset; - thrust::default_random_engine seed(index); glm::vec2 screenPos = glm::vec2(x + u01(seed), y + u01(seed)); // determine if screenPos is inside polygon @@ -768,6 +766,7 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { // if the sample is not occluded if ((unsigned int)depth == depths[index]) { + //debug("."); //debugDepths("depth=%u\n", depth); Fragment &fragment = fragments[index]; @@ -799,7 +798,6 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { //atomicAddVec3(fragment.color, color); fragment.color = color; - int id = index; } } } @@ -823,7 +821,9 @@ void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffe glm::vec3 V = glm::normalize(-frag.viewPos); glm::vec3 H = glm::normalize(L + V); float intensity = saturate(glm::dot(frag.viewNorm, H) + 0.2) + ambientLight; - int id = sampleId; + if (tuneShade) { + intensity = intensity > 0.5 ? 1 : ambientLight; + } framebuffer[index] += intensity * frag.color / (float)samplesPerPixel; } } From b19dddb5f8b76cd61689b267f40f40b248016ee9 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Fri, 28 Oct 2016 21:13:47 -0400 Subject: [PATCH 30/37] got truck and box working but not cow --- src/rasterize.cu | 68 ++++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/src/rasterize.cu b/src/rasterize.cu index d23e269..41abe5f 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -24,9 +24,10 @@ #define MAX_DEPTH 10000.0f #define DEPTH_QUANTUM (float)(INT_MAX / MAX_DEPTH) #define getIndex(x, y, width) ((x) + (y) * (width)) -#define samplesPerPixel 16 -#define ambientLight 0.1 -#define tuneShade 0 +#define SAMPLES_PER_PIXEL 4 +#define AMBIENT_LIGHT 0.1 +#define TUNE_SHADE 0 +#define DEFAULT_COLOR (glm::vec3(0.5)) #define DEBUG 1 @@ -37,7 +38,7 @@ #define debugMinMax(...) if (DEBUG == 1 && id == 320) { printf (__VA_ARGS__); } #define debugDepthsId 369228 #define debugDepths(...) if (DEBUG == 1 && id == debugDepthsId) { printf (__VA_ARGS__); } -//#define debugBoard(...) if (DEBUG == 1 && id == ) { printf (__VA_ARGS__); } +#define debugBox(...) if (DEBUG == 1 && id == 305194) { printf (__VA_ARGS__); } #define range(i, start, stop) for (i = start; i < stop; i++) #define SHOW_TEXTURE 0 @@ -162,7 +163,7 @@ void _sendImageToPBO(uchar4 *pbo, int w, int h, glm::vec3 *image) { void rasterizeInit(int w, int h) { width = w; height = h; - int numSamples = samplesPerPixel * width * height; + int numSamples = SAMPLES_PER_PIXEL * width * height; cudaFree(dev_fragmentBuffer); cudaMalloc(&dev_fragmentBuffer, numSamples * sizeof(Fragment)); @@ -181,7 +182,7 @@ void rasterizeInit(int w, int h) { __global__ void _initDepth(int length, int *depth) { - if (IDx < length * samplesPerPixel) + if (IDx < length * SAMPLES_PER_PIXEL) { depth[IDx] = INT_MAX; } @@ -685,7 +686,7 @@ if (vertexParts.primitiveMode == TINYGLTF_MODE_TRIANGLES) { } __device__ -float getFragmentDepth(glm::vec3 bcCoord, glm::vec3 tri[3]) { +unsigned int getFragmentDepth(glm::vec3 bcCoord, glm::vec3 tri[3]) { // get depth of fragment represented as an integer int i; float depth = 0; @@ -716,7 +717,8 @@ __device__ __global__ void _rasterize(int n_primitives, int height, int width, const Primitive *primitives, unsigned int *depths, Fragment *fragments) { - if (IDx >= n_primitives) return; + if (IDx >= n_primitives) return; + int id = IDx; int i, y, x, offset; @@ -726,18 +728,19 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { // get coordinates of tri points tri[i] = glm::vec3(primitive.v[i].screenPos); } - thrust::uniform_real_distribution u01(0, 1); AABB aabb = getAABBForTriangle(tri); range(y, aabb.min.y, aabb.max.y) { range(x, aabb.min.x, aabb.max.x) { thrust::default_random_engine seed(getIndex(x, y, width)); - range(offset, 0, samplesPerPixel) { - int index = samplesPerPixel * getIndex(width - x, height - y, width) + offset; + range(offset, 0, SAMPLES_PER_PIXEL) { + int index = SAMPLES_PER_PIXEL * getIndex(width - x, height - y, width) + offset; + int id = index; glm::vec2 screenPos = glm::vec2(x + u01(seed), y + u01(seed)); // determine if screenPos is inside polygon glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, screenPos); + if (isBarycentricCoordInBounds(barycentricCoord)) { unsigned int depth = getFragmentDepth(barycentricCoord, tri); @@ -755,19 +758,21 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { range(y, aabb.min.y, aabb.max.y) { range(x, aabb.min.x, aabb.max.x) { thrust::default_random_engine seed(getIndex(x, y, width)); - range(offset, 0, samplesPerPixel) { - int index = samplesPerPixel * getIndex(width - x, height - y, width) + offset; + range(offset, 0, SAMPLES_PER_PIXEL) { + + int index = SAMPLES_PER_PIXEL * getIndex(width - x, height - y, width) + offset; glm::vec2 screenPos = glm::vec2(x + u01(seed), y + u01(seed)); // determine if screenPos is inside polygon glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, screenPos); if (isBarycentricCoordInBounds(barycentricCoord)) { - float depth = getFragmentDepth(barycentricCoord, tri); + + unsigned int depth = getFragmentDepth(barycentricCoord, tri); + //debug0("depth = %u, min depth = %u, index = %d\n", depth, depths[index], index); + //debug("%f/%f \n", depth, INT_MAX); // if the sample is not occluded - if ((unsigned int)depth == depths[index]) { - //debug("."); - //debugDepths("depth=%u\n", depth); + if (depth == depths[index]) { Fragment &fragment = fragments[index]; @@ -783,21 +788,22 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { fragment.viewNorm += weight * v.viewNorm; fragment.viewPos += weight * v.viewPos; - float texWeight = weight / v.viewPos.z; + float texWeight = weight / (v.viewPos.z + EPSILON); texcoord += texWeight * v.texcoord0; texWeightNorm += texWeight; } // get the color using texcoord - texcoord /= texWeightNorm; + texcoord /= (texWeightNorm + EPSILON); glm::vec2 texRes = primitive.texRes; glm::vec2 scaledCoord = texcoord * glm::vec2(texRes.x, texRes.y); int tid = 3 * getIndex((int)scaledCoord.x, (int)scaledCoord.y, texRes.x); TextureData *tex = primitive.diffuseTex; - glm::vec3 color = glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]) / 255.0f; - - //atomicAddVec3(fragment.color, color); - fragment.color = color; + if (tex) { + fragment.color = glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]) / 255.0f; + } else { + fragment.color = DEFAULT_COLOR; + } } } } @@ -813,18 +819,18 @@ void _render(int w, int h, const Fragment *fragmentBuffer, glm::vec3 *framebuffe if (IDx >= w || IDy >= h) return; int index = getIndex(IDx, IDy, w); int offset; - range(offset, 0, samplesPerPixel) { - int sampleId = samplesPerPixel * index + offset; + range(offset, 0, SAMPLES_PER_PIXEL) { + int sampleId = SAMPLES_PER_PIXEL * index + offset; Fragment frag = fragmentBuffer[sampleId]; glm::vec3 lightPos(0); glm::vec3 L = glm::normalize(glm::vec3(0, -1, -1));//lightPos - frag.viewPos); glm::vec3 V = glm::normalize(-frag.viewPos); glm::vec3 H = glm::normalize(L + V); - float intensity = saturate(glm::dot(frag.viewNorm, H) + 0.2) + ambientLight; - if (tuneShade) { - intensity = intensity > 0.5 ? 1 : ambientLight; + float intensity = saturate(glm::dot(frag.viewNorm, H) + 0.2) + AMBIENT_LIGHT; + if (TUNE_SHADE) { + intensity = intensity > 0.5 ? 1 : AMBIENT_LIGHT; } - framebuffer[index] += intensity * frag.color / (float)samplesPerPixel; + framebuffer[index] += intensity * frag.color / (float)SAMPLES_PER_PIXEL; } } @@ -839,7 +845,7 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g // Execute your rasterization pipeline here cudaMemset(dev_primitives, 0, width * height * sizeof(Primitive)); - cudaMemset(dev_fragmentBuffer, 0, samplesPerPixel * width * height * sizeof(Fragment)); + cudaMemset(dev_fragmentBuffer, 0, SAMPLES_PER_PIXEL * width * height * sizeof(Fragment)); // (See README for rasterization pipeline outline.) @@ -882,7 +888,7 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g } //_initDepth << > >(numSamples, dev_depth); - cudaMemset(dev_depth, 0xff, samplesPerPixel * width * height * sizeof(dev_depth[0])); + cudaMemset(dev_depth, 0xff, SAMPLES_PER_PIXEL * width * height * sizeof(dev_depth[0])); cudaMemset(dev_framebuffer, 0, width * height * sizeof(dev_framebuffer[0])); // TODO: rasterize From 0ca4fee90fc045b19e5b4671333716f5d8e01822 Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Fri, 28 Oct 2016 22:05:00 -0400 Subject: [PATCH 31/37] got pictures --- Capture.PNG | Bin 0 -> 70292 bytes MilkTruck.PNG | Bin 0 -> 75362 bytes box1.png | Bin 0 -> 14846 bytes box2.png | Bin 0 -> 15605 bytes boxAA1.PNG | Bin 0 -> 18559 bytes boxAA32.PNG | Bin 0 -> 16745 bytes checkerboard.PNG | Bin 0 -> 19421 bytes checkerboard2.PNG | Bin 0 -> 23303 bytes checkerboardAA1.PNG | Bin 0 -> 10630 bytes checkerboardAA32.PNG | Bin 0 -> 20653 bytes debug.txt.txt | 16 ++++++++++ duck2.PNG | Bin 0 -> 62717 bytes duckAA1.PNG | Bin 0 -> 62533 bytes duckAA32-2.PNG | Bin 0 -> 44983 bytes duckAA32.PNG | Bin 0 -> 61961 bytes milkTruckAA1.PNG | Bin 0 -> 80050 bytes milktruckAA32.PNG | Bin 0 -> 53253 bytes src/rasterize.cu | 69 +++++++++++++++++++++---------------------- 18 files changed, 49 insertions(+), 36 deletions(-) create mode 100644 Capture.PNG create mode 100644 MilkTruck.PNG create mode 100644 box1.png create mode 100644 box2.png create mode 100644 boxAA1.PNG create mode 100644 boxAA32.PNG create mode 100644 checkerboard.PNG create mode 100644 checkerboard2.PNG create mode 100644 checkerboardAA1.PNG create mode 100644 checkerboardAA32.PNG create mode 100644 debug.txt.txt create mode 100644 duck2.PNG create mode 100644 duckAA1.PNG create mode 100644 duckAA32-2.PNG create mode 100644 duckAA32.PNG create mode 100644 milkTruckAA1.PNG create mode 100644 milktruckAA32.PNG diff --git a/Capture.PNG b/Capture.PNG new file mode 100644 index 0000000000000000000000000000000000000000..b9a766c1a347e25998b34c5e78abfdb88001daf3 GIT binary patch literal 70292 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ⅅ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 literal 0 HcmV?d00001 diff --git a/MilkTruck.PNG b/MilkTruck.PNG new file mode 100644 index 0000000000000000000000000000000000000000..dd969d48234dece8fc22060cf6cdc7486d4ef4c0 GIT binary patch literal 75362 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 literal 0 HcmV?d00001 diff --git a/box2.png b/box2.png new file mode 100644 index 0000000000000000000000000000000000000000..2c02a49953cf1d6797454d34d46d8a698bc1595e GIT binary patch literal 15605 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 literal 0 HcmV?d00001 diff --git a/boxAA1.PNG b/boxAA1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..a46fc12e13482251df6029a0de6a965f9d919fc8 GIT binary patch literal 18559 zcmeHui(k@b`#)r5ttBhBYNe3#>F|_^TQf6JDpzjHbXy0r6tR}BEUnA~B8OIsT1#ym zuuQ4BPFCXbEU1(g87h?(p7D&Ph=78C!1umC(4IZN??3SS{a)?$ifM7*_jO;_^?qOP z>*B-d?*ja0elY(76bd!-o3Fq60fn-01AjJ7n+pEsv)Cvh_#Zm<2fy{G+)==v%B~9jK?`GU|A<0;{qZ+nt=pPNlDAPx?gfQ*7-qIl z_3PS(-MRMDM?Wo0bE~-L_)vD%cOHZ5#{_&@+>mMy7ebh_Z zH|ygomp`n{{_TrX9n5LZ4(%K+8@n6(rbfY+1rn}5`_qLx7JQtm{;ib&nDVl5RPe?TKeC)uE ze`ZhWo0)$cEO1`4jNCpx90-2=aNstR(m*xMN1@1H`%S6MkQ%;0p-TLd#&-EUr^~Je z6-kqyZPNHBlah0zR;%XEX*wbx^c832U7E`uy{P6U=fqAz38rO@-y=qI!A8wIqRNB1 z*az<;ad)81Jmc_*TMR{d>r&F7Zmw&bY0BKf8LmlGFY}|~;^I2GLg>8PqO;~|nmJ?<_?whH)TMh@xi@-VYB>auO^6r78AI=IC6{adDR zs+MKGS+4mbbqKC#-So(PqIW}nV|wYh^195`rIwRX9&e(WDgE99?#k8v-0*Y23kPxI zwLh3OG3Ga>F1)mDc_rZ@hYI@cVChck?yH9OD6lUQ&^CqQ(43Eh9RU zNz_i(vsmnCO8gsfTYlR>k1u`rs^*riaY8v1hxbx7qcC;c%anf6O>WZ$brc~xb4=e=TKL%8acBOs>qJjgt9BV%gqpsW6_>Z+`=Qzw7bw9xRJ?MN9K(sc*bP3>IS+!WK# z^~%p&Nvj)8OftPPwP&Zy1QhR)mf*-XT)u9-M^Yw z&7P5QTCzod)BQ*n%?_f+OCr2-%}hqW%&S}Gl4M7j z*uwE3nmsC%XRC6A$}*k#Je{E!O17mXYsNd2Jl+I#YK}Xb#{Fp69gF zCq50_M^s+TZz<2xj#C85@~E&3+fCXIGv!GqlTzhHJTmGjJvyB1=97>#kw@grtf+jI zHGb1%aQQY%UGE&WlIUj^pHoFeRuUsux!{t9!|`Dn{hf)@mH5=_hE`1^D~p&g$Ir-5 zNE+qflEe?Mo4dqbiRFIf!>7awEqz3d)%1t0IXcuOHs{N#|B4ga3(FF7cMg^eI}_En z4aB#~?Wuv{(4lv}Y9V0bUs5qMhy6mTh8i>4jWsup2&xrZbfs^N!Kt^ix#96=zajV} z4xMMEX6g!J`#6U?1jn+gm5HW~C_G*KSXR0NlTNn~k@>0Yl3rCwkHfkx@gCbJj}|BY zz!S!b_iHJpm_kE&{|hzKb7aif=H?kDrJLuI1e}pf@*0zgqqtYF#G#H3!=D~np&~kP z&BxO*hVF^7<0N;SM!a9nrPKcpLryjo?{H22~ncjAN@Qir% z+qi~74k4>t_DaS#JXg+p+pT>|Gw!H-vrT-ySG$D8_2R_pn`>l_hY9x^Y9G=(Rb%Qn zpWPg`0(gU-*xC@*+-^Qy85KiU++rs^YRF=&{`e9Cj4pLoY;n@e!zMAqq>fb@a>U!_ zkgBL%99Pq;){HLB=PAOKYH9cQgz{E|mg2TsAE^BSjPM=Arq4Igxh$E7_kE@oMcl{e1 z!I{g+;5wz0@71(^adwJxjrp9gJAc^Rs>LP`-^c%?<;?8CU#%SOSJ!iw zpH%6*H`g<&srdtO{@BXhbNqFrARqB)=>WBBhuzta6r5JcC1OldoWq@VKNPcEJMOC- z>1$eB?*CyQ&e-qg@d@{CJ7xQw}FK(L-XeH_+>|e z=5p}WtJGI*no)Cs3mR~1Q*o74|=v$$Ui+ciIHF6g=?1%9Cbz0{Ydj2BGUyop#u;z6UM{5{MZHHV= zsxb7C;~Brgq5-kt$3Lkijux-v9F#Fe^5sA4#7*6oXG93AM(1}ao5ZWmvGO-bX72EYibZZ_ax~qz&A?PwO7MUuYwjR+zZ?(#ll^;{vtNEH#^+O@!eL zZ-XjcR!sEb3-KoPT$xmmtlMNJVA6~E3a%)&zFhuG{zv^%)K^>idF6ffwyc&jIP>EJ zO9Qx+p|INa3{vcPoRP094a=HY*RZES5~&O}dfS%wB```$a`Ri9vB~{$to1|J@>|Z> zl`A%+dLKPNFVEl8K+VK)=s7HO&XEikLlGG6;mBm(qF|1G)1e%uNC9s2w2=2 z&AH>LQXjMNx%l#UQ|g%3TFJ{f6OVpSjQ7hTE^6+q;B_45T%NlnEUhY zGt(0fF@tP?fhgk zknK!yX&WNT zZz#+r1<^$)%0aI@%idD3o9vv905Wdl-}Vv@)>tM}a@Q!d~U?HjB5S^WPS`&2sx}YRB()kWRvNuS$SB z^5M}zcz#3Tok^;|ZEg|28XMYK9-Q+^L zG{t|12l+_#v`?8zvAV6uH6;V^x(?uy#G*HAb3SAgK?>m-}J zO5}p%L!YO~)_M0hRfv4)Z0CjkRf~qcvYgQ*V$S*;wdXEuotVd}1(~+WG}fpqMj47# z`PwmoP2o!>MP!1zF7Db}IjL{Hq~u9RAs!5v5cf9vQJ&jTrYTfu?Y&MuJ?Kgi`nmio z{?Jx%k-e{(({=6YvYt56VA;~$Imkh`k%MTz+YY&6Izq9}eX;Gl0VeJU>cl?&i8y#t z@FH>&e-td$tIK<-;;8eI72LsPAT`nzh6=@U?M!AlXafOHQx{^Mhhp=11SX4cHGz_- zP#walI;6dardvZZIJGuH`5+7~-6t45HESh`%0=QB-*|Mb9fdipVmhiu+Il}``43q?Pn8)#qv8&fJp4W(G_8{UBS#E3(&xjaI00%f&AHG)-< zrM(Y{J%IKZWd57!>2+Ou@1pHhJ9`SB z4K_+vD;^%@6fFR_BFii&c(;ii+ZEI5gy{~&zNtEzj-fPSK!StC7nx1_`S)hKd6RB} zZIA>%Ct1ebOOo+16b?9GUv-Fle^AC<(*aao9Kw8gzN)pYy~j#LHgQj@;@K>vD`wCM zqjJLN+P<8OU=pN8fZ)I!d;|0J;4?|4;@{F(QYwEtWrcdDjP}$}u#|jrR{pn;N-{0^ z=Cu%06^gy&i~W;F_$h(%5r*=$LiG_&#gz70IvuMgfJIan>m0MeHxL40QzUX)o+g6vxnn<&`*5X25bq2)!2!AU~ z0D$f1lI7e;(jb2>g&Y4Fu*e?myc<-`@ss)HZlek4jw~dn!nzEXg8nFsXsxP9du3_h-ZSFCw4#P@uPPMTTmj zgDS1H*Qre83mi9+W((+GBz#Q=%K;Uh50hdU`aC2_>*k*1^%bV%7%S4Fu1E-qZ`$)A z6IX9#M5A`(B9JTkH|CKOrY02o2aoV$0%aP8vR0u&;jEBNoSrcSVl_a}V_}*C=H-q4 za0|dnncEP!w_LF8Ok?%9VqSz|ANXPgJi;{=fzKi|CQwE&o*|ErOtad={u8YKjfrl= zS(0Hh<)eC=BW&A#S4?9lR^W@R=OIg3gwX^~(xV6%s(rxc$i238BiX9&852ddNW2xB z+C9)VZdsP--6Twtp-V-bFMB)7L{$k-k5fDx+tp;8>bbNR-oiiS9c&R2zb>sB^-<67 z8LJs&OIC4d?HT-p7H}54mmHZ_F%RyXgLgtG#TU!x5z<+Nf`o>LKCDeoKYzaB3_A`G z5vVr1PO}f4+11)LQrJhW(O#A;h=TfATONBsQ5snJRE3vz^wUiW&w=g zi`DQPT%F)n4T+bh0$fgp{#jx5Pxe%QJ9hM4iv#3OL|+2L$1fwV50mmu6b8(s>U;Cu zJa^|1Jy0$|mUt8_C9TI^^-Z}Hz2+#3aDhe0OQ2jsKpO%)`Tz$u+q)d#6@h)a#8crb zJ zSt<~KLscm7_!@uNI-clwBHMN>4S_BwKrLdZ6>g$qMZ4Nnr$8Yzsmf(>HBpx&Uveq! zsTDzY0j=(y{GnjjQne30>zw_+0qca(I$=!V#BRWzH82|XIaW;U`Wq8=l&^ z)?TX@mn$E%F{c}`Dr2v~Qo^H1T0Wj4EwTrGy#s6Efly1jZo!^VGh2JnWg?q+w(W>3 zrr!ypaKdPu00KH^Lnh33A%Svn_X)_|>(V_HX8tNlo2o28Qt`i`d1&CK&C#be@lUG~ z*erFLt=3hz>8T9^WK#SWBU4{Z~ixDO*R2k1H&h9qkm0~;y*!>aGvd#`)<9P{Z3 z2by5IsB7<^%+lBQqvOV}sEs|;y1_KbQf@e@8{$geet$kpV}+%bu99yM^c*V}+0ZP> zZ!x)n84QcmbR%6=-WT_D@PfpRdzfVA6T!j|tIcO7Eq+&nS%kC%3K>I5R~+G=a6pF# z3l1zIX_k}MS4#MED4D7?eeU(tH0{>{)Ngk!seR{Hb{ebC74zB&(;A9>$|K~l08?Oe zPPS`z%)tY;%1nWBXtWTX{W({C6sO0^fxv_5d?3uqIXUR_wr{P~+YanE?uu;C_$@p> zemS{ozM)WNc&5E7`4=~cB<8=N;8i~Icp%H}n1)b!JFL0ziQE5C8lUUNp2F z?sOBKzZ8l9J*}5oANBixienOx_MnVeh;aM6%sR;VfG z+dfQpz-Qa~r=&v-1hH-@s}P$`m}j9#oo5kFBv8J_P?*r2Ai+W8w|DKG?*`(EyaWqQ z(4~}6)s5clXp1L`xuC?~AD-#`$f9jjaW{sv*E$Vq#Av(_3 z;ZE8(Bi-S10CA(%3h{*YRDKw5mc^u9R<6Ck>P)i*-1X84)8qt%GgL}ekQ7H-9g~@; zJBAxSwgQO7D2W903~(cmB>wO4KF^NwogL-WFuVyAuNcZ94CS`sNXZEYe0VVwywQ{W z`?cwyxCD}T{32SNI?G?{4>IL%$21z1A@ z)*x^RBen1~lo(aTeb5%cNO}FkAfV(EhgF9hRUM8Hdx_I2Ksi2#;o1ug%7^S1EVyTn z-!&bmDTqC(WwUMQ{Q6?IGymkGhCjgaL_12}FxU-R1c3y0gZkn@Vv`FHW(VfDd6Iw> zTVHuAxstL%Kfl+#b}&OiRGej^=k2nh;g5e*U_fJ4No|ircLdU#%!a-+}1X$3bF#!o#J@X|rWC=N%Hn>a7{VR-G!KI5S z-m0Cwg+ozSfi0>3umvEq>W0WB;b~RkQy?{g6=*9lA+E^;{sHR80e^QY@b)=?C?KmV zY$*)DY>k!-UNGnJCcvPowT`MhAX*84)+kI2r3Cu;{$x<}>R|3bn~<;}+F>PmeS3D@ zXAxf3TJLU2!kLh%YD2NNeJwTE0Z5+_SgKf?8oz~N^&b~RHv0n*A5#AYKrQ`(8`sX_ z2SSwv0ak1^Z~M&jcM^ELrK5z~8Z9Y}xC*wEE;E3?y}6si^7&bm`)X1Tt$Dyg{X48A z=KBd)R_lamaKbc)rhqDd0QI_0&oQEZ_o91H8Gu~62>BS8(69YnkuPPCGWgLnZ*`Ka z9P|vJ)PmVY1VZYOR#FGOa1WZ$1DZ_W!tZdvXHbWU0;bmf0W%8twxsT0bpAfUiHcPe zxvESvR!=>r-Pgtp)~tXM?Nh7gwh4N|OW_`Ajw%#_x`G7CZE@$z6*CYiZVkbKMIa8~ zuBX^wM>#+c*zDW?ki8S4JJMMFX-M$~g7B#?6$bYj?$TpWU}171F#h|8GhLvGoK6Fl z^~EU+|7$bgCuB1qTtvqye{Tk94KJE>Qz&`>7CWluj}?ldGJu-?M!FoR>0FDHI0*|4 zYzlm_dA_i0s30}21Jr0jH2GdjYJw8@vBmj-ZUJrQ1pzff^hLe0CIHg0IH*vLszYs% z0G0wCS&!}U1-5lBayi2WZb)GxY%t#qT*nL4kLJEYvEg^^f#uRiK#G@JnJEovG16@N zp&8eCB3}w5T2=URq?d#2=1J0gK?a{8mmJMOCK(5x9zTRl;}O=fV9vEce;!W)MGLqT zGLTgU2Mby?MaAC97@bK^lerH>T?B>naF_v6M6-deMill|#!1v|tD@~$w;J;lpaKjC z(pbZgJHY$~T&)CBr4DG*6_wmgr2L9YK(}K@%WDja$*3n= zkq#ni=f@!YbxxR9Q0w_7LZUsry;8_6dU624Fx`78QOg0n*1O+5yOY`6^_XF_r0nFz~0_6;;{s@n^#e_vC@LC*a z0con(4*W-ZO8pnOp`~s|B2= zVA+Ma3dzlE@%iS4#Oa

Dyb2mX;KJ=uX|Lja**fZa*JDPS}&^jOr8Dt`Gn@9)%P2{XsG|e3QIfEcK;SG6Nw4C`?0&s$p4)W z9y=E7;Y-Yz_v?tRG6QZD-_EKw3m6-Nn9n7G@SNW53{Z}kshHH$w2dM{%?sfZu>c30zlY*|hCP_gs( zyI-}ZqK@cJO~3y}=qdem(ZELE^k&)$K0L9exnYOCt|-=>-E8}iz+3bI9zDDMZkn&h zL-DEcH9PrAP2SWMiErcC=^(;9Ot2ey=d-txa9N^D;Db{{XTa&J&<{N$z-jj#FnBhh zrq}jqbJUTgZ7xZ@ z6Bfbfn86N}b`>`q1T(Ck7bUMN#HN=iUA_9_$Mg2ul0Ap681DMC>hn=i)l*f|Q&wJ$ zRtoB0xyPxv+PUBl&9@=KufyaWg*Z78p|6*aAItYhF@;rO9%Sm%v%hfiel)UOIHPSl z{1b61_uTcb-p1)N;g-1y8TxWf~*5& zRE&I{i8p+N6e`dXp>p?f-N@+D`w)rJ>W_-r?VUsY3xs9vg2n1DI<8sSK7wfs=e8I~GVupN|maj2vuGxJMGi~GO^l1+nFM9cW*n@@& zz2+>8vv$wZYJS2$$Ze9>R^He9GYc4*^KMRu`@J!IwnuJL>t>enmDC@h&+=B1`x^FY zbK3(8d(%8T+-UK366RnF)dkcCbYYsW*Ga{V#)IwRdc=|pR|6(iSJz4}PID(?X`T1m zRlGFAT`ZAl+34Z5tMISRHw9Et4L1eKqpxnX4El>^gsYrW6-f9lYKkanP4tow0PQor zlCE0p?;w={A(efqWjiNC1RDCz7wZZ7~vmA=maBS+cBSmc0v^-}=*j2WB~aV}8D^7n)${9f+;7S?Agsrk94yTg#)I zlLgf4vmSsBUUGlLA)*HS|CE0h&AS0?k19r#F|Okgu=E?9PwH3gfl^<=k89xyipghp z&U=UTe`Q)%KYwRm0!+@0$BQ?F^|%)*1jgC&?6d4f6}b=kv7KrF{99B^9d+wcM+I$d z5-7QQrq_xb8x9)Qs0uAi-0Zhql-_*z=RWyMRnr0_ZyHH{+mUZs^5T};NKVAl&=2I8 z%?uTZ&v%ou0uLqx2(pxkf!jYk^4syT)NjY;+Cm6~;IZ$0$IUr~spQD6xccg>T{lY8 zvTp5z*ANL=4}v~9XXW_B&zZQgWzO#ZJPPIjjs3}un^*9cM-ithwm*NhVjM88`#(g| z#D*DzsYM=JAQ=cm*&Tk?nOC(TZGSLx?1g%PS36#;GL5f|5(NySodhZfuC908ccudN zCJD(so@sSuCyg54KkYYAvT&`z-`Muyu&s%?q|poC)1T-Lb|TFqR|7s}M+gm^yzDN` zmh7;1jBgej*RnK`fVrH*K4Cy4RgZ43kmb78Kb{t6?r3|RDnd*^Ynbci%|phI$vZVt zWB9P_{M6S;a5do8u#cAlT+ZGB99rSj0IIeq2R*4@LS868Kff2i11e$maD@ z%AKs+wZ9}c$k)%m7?go0{yScwKS8C5jmX2mg;9BtZzt4Ck+d7TW?4+WW{-(?H$;3x zDOciZY=HnOuHyTnhWU6ATf%hSA`!SMC#d0uxFwPL_Ah`U81F7*2{YGAIhq~;6RLs5 zaJQ|@2?CCooqP=UTBA0cZ6PN7yOk|Ro_}R~J)WJ~Z>f;SyTO(dX9M0w8<)*Rv0z=| zu-%q{ik{3*Yd&IklnldP>(o~GMt_$U14-9=!543TQh)#@Z$2dm$E2$v6QM&_i}rOT zH~er>H5loa7nPJKy<2(-wB}nK$_4n7&EL_1Ztmn$hCXh+ryltAMfn1xCs-injP

zor{2cWr_fD{n^>Q0`zKCwi?f6qZ+)bqS^LDgN15`r^4T*sF9VtdAH;H9eL*NzyG;I zEj-A_d{f~6$w%Yn`#gSMyDL}jH0(=~SBw$Er@tzPzq{wdPx0u{WkK1S2-{eIFZiGa zClP~-Za*fXJBCeKK=`=z=-zalX@5Ev!A?=6)G z64bQZj8C}z^8>Wz%FOjfEg2y<(E!>yz@|@e44Jq`G*aGJ_3wt)pvuYF<Jn|XAXn%xGoGrO!%Cb zS3_QtK+6nfr@$p1{B&yS}y? z$eZYNN#_t9=)9d0MZdh9YpmR2fU<-z3mvd0EV-uFaokun<++VUMSr{OmD)jiKY_q2bm#)VEUyr+mWti-D^1qJL=Xt2rfkOJTSdCD_=}wFab)JC1~M zJfsleKuh+W5gi7c!sOrMULDx;I}I53)C+hQe>zNgtYE2pO4;`wS>%Fz=CPwTZsIQt zW+mVxAxJ+IyO_!tPx~BY+xx24Sb|(6`_D%(V*9msH5URRRQ)gDD3!k{*k0g<)BZ$UB$D77;?S|Qw-sDR z?P-_4m;a*GfF>yE>GTF*OI;940@_+nJkZL_>0?{3t3mioQPl-}r}z`@GUW6!p7I2v z1n%&EX}Z!u?n)MgNehgt{wrLvaIQ$_pOaTtoy?WXCLdE(r_E4ek^<33-BX3kHAE>n z%@C&X!DWbbdWOmoQ(S6>*dD02D~lTw?L0ehrEqYU)uA&<_b8HU{ymtJoF3gS_|ojnh3kw zC$Ifu@;Cp(&IX$+)*YAzOe#TCYKT!*5a(k@NfqJByKqJ0ea?7OnUpQ;o!ZX)yJ zd6W&?&_pocR5XH5*w}rU`>#tz!{i1w;(v1`HJFJ&9bUlkNy3Sief~;_-Mm)w3n|bX za$uVn3_BfQMY$lg5ib03xRE*y-Ig@_^xFROiage{*#2KTzZ)3Ge6k1WX=GRxALp#D z|G*T5ZmopO#2iYct5?_2YvJ-d!_osV#o?~xl;@I1`Uvc zLvmuAc=<_2fS{k=puPJyN1QE$HsI^OnDC`B*kqv%uNfOsJgnIIOod?s_mo$!dQ%I0 zQGsDjB1O$AUCJyEp=OD(K4s31&Ma@}0WKv#dk;-Y!lSeDShv+MFJkAuct{}127mOog8(`60AtV`{S$`~ z(3;XBj0V`yFA~H0eX5VUx+=+sB{k>ol+G8}K2W=b((lGsD!Wkt59y1_N)t#x1T4!5 z`3rjjy0WdXNjEW0pYol*=b%REd-)9G-aP0H)a5v9&)-p67zpfs4m+R4x=m5# zc?BGxRC4Z2t{bLkj`jYH?@kM4$<*AAbrLu`x&MA-5nt`EU66qLn=VL#6Q^=_a6#3Y zSCo<&qKpQHF1=K`502!TN?(P;w|*bQV2RG#xnBZ1f{tug;rEt}Oknmdb{K|quR%@d zl>5Hph03vRqr&dOSzvreg*S|xG(I#88846vgJRDV3%>|ytDqHl%4>-9+Mlx`I-TxP zSjK^!zD?BcbCy|pLAnPF%Sn79gg(DGH6BXa1*Jyz<6=fmh#Y(l2ngMX z*BSM^6V@4|Z1GnMx2}Arj{=wPI_p|tuZ(J^ujtcTMd2vi750-V zGB&Mr-n(P`Ul!|M-^7xFXk0&^ePw2F$JHYD!})Nu2HQnK+U1_B z^G=4MhO=qxZzYX_GIDEKzM5zk+Wb^1_tcHFbTO%flgCGX)i#VoLIeui8xk+@HErT+ zQsW-lpw2$5)l4K8+tF^xqc!ma3Fhq-Kpq>QE7({21c@s0^{(9keN}7zf+vnDPV!L1 zAw^%WE+ZClkE-pU+2)b%UG9cgH)6QVP^R=)K+pz*@@01-W!&f?Wzaf83TA+%b#s8T9K7S5BbH(Ji`*FV=k;2KW23n&@KOQ`8 zav5hDB1Jtm$DZX!X3PQgCu+w949Sz=%y#YprfoSp(^F|4I&kqu{K{imI`k~WoZtMt z#R8l^VHh4`45s+vaqXBSG%JMth6ce&F>1?p@O$e{r7_>xuX74r)oIb}=r~7jGPl)9G*T&%JUahj;1*BE9)o-_3^AB$099-=>cE zgkw}Ok_SdE5TPW@fr?L%loF?!*&);+s6ypB`I$#O_#64RiOu; ztLgZrUzTXaBn;YKl4(qU_0{ZTdPH+qQlSajC96)_pjq4>?xVqgwo7 zM0PJu2j1gZ#vnco>@(<*8zJHz?D9F_&Z7E1b6xH|G4v1lhlO#>NS_t7UN ztTRaID8YT9V=V-LnbBbjV|m+F_@9tNj{Rswj^1_?f*1(j)@3F+?LmE%Isb-@HEMoZ z2lnB3g!oR2bu9CriDLrBp!pTt3Y#c${xQBVev^TZjL?AaG?)WtJb^JCluVj1|;;ZI|7-o_8jmXG%+645pjfd zF)9hZET1xz`8KclC#$R)REa3u3rT;nSHWX5prECa!t^X>V;k}zSxC83mh0jjNu{(7QKr9DSx3nia(A2$BM-9D>hGVUJ^&) zpV^D@DaVWZwZf#|WDp)!vtmh z3FmI!VcuXNhe@qkExdCoHPYk$FfB6YB5sxyEssRf8GEZh$HhRTdTDbiC25V0cX!PN z1rnaGQG4H7NIPE|;t3h{yR>1$v%vfcMy?h4ng1sL4cZT}--?@81`JB-FAkjm8rQkV z{&tB1&)Y^Z=LiZ3mg#e)8?x5}s(HC*OpboEk$W&{w#hC1>aASh#wM4q7$;!&*ltZd zY18?5qq;C5i~8bzgj=7y;zGpkeTc=zh)Jx$lts68eH{%Iki%bLM)-%!s)_;LTf?@ z)qNo30!mk2sl`JFf9{kB$?*6dz*NN2ATdT_xl=e63SS*#XNdrR+A6YRv8i% zu3Mu?a%Bs4QNrCAq-+UI;no)tX(uh6U2AQ&D$I!pzm~V;$ZeTJ*M2Pp5QsZon91*b z&r`xG_9UNuY#^U?ES3-RM)MYBR1NY%p{ZX%==n)01RBs5#0XMRNfwSmzKY#=tQFCj zS}}e^eCHzk|8Vu@@lbdF|G#CFt&FiNF=K|AOqQWgwi)Y;oywAs1}R;H7Rff&iI^E< z8I)bQE+JG}Y^98)Y?YKNOSU5WK9=9<{k^XD?fv=vlYeuZ*Lj}vd_Erc$N9~Q`rj7m zvm!hTCkg2>%YNXfaJzX$w4_b}Gx*(?@A)eByj%x-f#ncF8F_*lzg92ZY!q^lqA8x^ zezE#9lLf4z4i|l3*{;`=$nm}vShXa75JFb|xk@emUdcHi4t~Eq8Jftbe%1y?*Jax| zpdvi`Z$*HT#k9nVMY~0zFe?CnP}Ky7teLPPhrkQKl+_rEwt}#uzy3n1Rt`AvEKz2U z!i-NVAxovQCT*kuZ0fso&t7AiWtDXxiHnp^G;+zHf6U$xO?ZasdG=UA74v(>veo-O z6k3HirPzz$_ZQ6o(4h{o0m4_fD7RYO#S5y$ z;}$_5B2D6liBUu&q5_eN7}coiBF&c!xs4Gj;u57Aq0uNsotF=*HOfq|zGo19y|(DG z;E`Jd=iUomCAHT&AmHh;8gPL!_r1;h$9Js2R zE$$Fpl}Mlo2`KjJD93+Y@b6R^Hwb&i!e1!$zHk`f2y+ngay)WEg{)MqNd`GUW=Mbp zu}Dtz7e;y0sWKTL>J|{p?K-yX)H_=`CuGh}G^|9v06LR1|Mq*@^k+X2xuP|>4>Zeh zBe+q3`lZH@G7~b^VK)F^E7gLTQh&IkV|q1*A^oWYJSBnL_G<=@v6$g&bXweirI$EM zTB#PvMn#S5@wW@83mg{3Qd<4Mf>0rei6))5ZK9-$4Bv^cMwTGCGn&+-l(hEO)wRnd z=bmTubn(EkxhmX$92PNl4vG{SDq%`e#-v@6hgo5-uA95xywamj8j!?C-J`4=e7QDC z0V`A&D=z#d?$RBt_mcOhSL`l2p8*+@tn|)KA{hV#0G;nP*eu2cWxrt&Bsyr8dIC+p zg)l0Teg}h6nn)Uv8F7(Gu{)M?FRNtEarY@W9BTf%K?XN$&dysytwUkahnf-1C|tBN z4TaZ&?ypt@sTG_c_Pu8zR=taxQb&KCLm($UT7W5;8!5g?9pL+3tG8PS<3QWVt7VwW z0tN#ja!5_?UOcAxcr>aR$&H*OHL)%17A&uWq#}=JY3wnDM@$xzC0dg%^W=OOrL)1x ziZdb2??`s#cj&+har_+yO7H&Q>$YqxhWT4s)-G&H2F7}5gv zY8s5w6CXx5KdA`@ zKPIRkfZ+Wk>Sp!?b@PmaZBhz7dmg2#=#r6LMf0|gI?xLewVDI?fft#dq1eZeU6L?K z01P%~$e`jVY>~i~7qjW^MsSBpX>`^hL+K}(4j_&oO<#i3{Nu?9o?S#Q zy|R-3c^s2wLt0hO7_o$#HJT6M74aa`!|#KJz#f)VyrG%zS&^04_>8M7lHnxl9!$M%5u#>PcF}?jY>QQ#IJH&eB zxbD~wT&%PYXwUbg67^g(%(CKD!R=<-8@>L2QBl5rdUju1I1Z!^-MdkJ0TSN zI;@)3+P%`)ILGvC>@m1jcswxUJ^$pkhF19=(NyPe1+1Cl1i(?7Y2Zuk<#eZ8NYFsd_vj&)XiFQ;mgV zDc`8B8L0MG?e{X+RZIrVZbzII!+s92KX%mGGl=FPCLRCqkZ2a|_JG|+r=4BaSLI>% z{lv(=YmXY~LwyO-Q zb;(}s4FHh0{0%w=tAl}IqQg&PJDC!)eM4HrMn)%cQEeEH(IEz*S73=Y%NPiRh41X? z^*ytE-JsRrv+qz>;dil@rPWpVcyBb8?82x@WS(p5B@7=7!XeuPW6R0ssJ#zp848qT z2TzBnyqKL0ggR@WT~M);yXz$F(~khn+g99@dgR=}lW&xStSzk7aL?mk`&(&o`hVNh ze3;VuQhM@w%6e)Gx%*Ii&e_P|dn`MvuSQ={1TFgiHknAX*ZOU^_6-Au=qDyoYcR%F-eMH{8k_G8L1>isZx2pm)VLeQn34HIDyVHA%EP!vU;tC1{A~^8 z^#$nD2(I9FKPedxq9=4aC{-r%mOvxK#{7k&rMcVjP^Pa`GfYdwGZc7Mkm|Zoc}nUo z!ageM_2ovAseXk#y!K_y;c++Q^Nys_Qw~fjF+PhkgLuD>`DA}4v#6IO5Ml$;v#sD0 zVo1{g*(Nn~PZ$+*@5NMt3_S~>C|#10Xhq&8Q48ctm4Gm<5ftkK{}yY3v@y|Tu`1C{ zQDK;s!`nA*M=bcp-Tg|p&wVnbfDn<5rc(W%`Iv9QuGf)daAh`*SIW$SK1V*kf0al%sfhbP!)N-%6 zOg=MpVAL5>bMQng%G)I*0@C0u4}wo!Y;I~`FsKsG)77AgySNhEV7d>$TEK;QNd;L- z*hF(lnk*bsQ?TVm_PLnM-WNE_5^Wv{8=uQW7b}^>UuroDz$PGY-z zR?=`uNr0ub%ha$B4S%lCe|~u~TE!kA@d~7m<#*aFFY@q5RRpLVMj2DlCPl?cC~mR*AdyKE{}Wrc z>`u(uT|;P!Ps$gHdA+`VNK~dmu3yvROhs5CpeX#1Q9STk^VnXhfbM>o6vkWdrt`p> zD(%UgLQUZR<_|Ug&o|=Z{_n{72*eX|2@(RKl&yLDQXxzAdX>{I7!btq=kh4xobKs^ z*AsPW{Zgf{p^^S}iTm=5y=V&LsjFIRlOq{L#lqBrM|r^tVkT9jD!FD~$UV%kIQ?BB zOrgP&AJW05m~dsscf4bWHBTkZh<8kRP`~XRKKivrq}ban9%bTv%!`L;dmzSCz2ENH!RX64#nH4i zdxt|s;<-qz&3ivw$0pJGmM-MFw}UYbUhxB2%h(?gsbsIk;O52x=#YaKdoZ1qg|@bO zx2>y~hV-FP3z+^{agUn713&#=B@ZFrrpe66oF=W93Wt%+&~jn*7vfLN8vJW*! zKnlIpvx^aXi|G<@^qnRxCGA-B0YO9!1A>kbe{>lp+1#LO!{4E$0lXVZ_4&;CzZb7t zjWwN+7R?}>_A$QYGq&{RxkFStqnth1G#}0kzQgVbJe#42jN#laM!f6fg)AHL`JLU; zf4!0?ZNJ|B2pV^6aBNu{?GC%e<@E%jaOZQ|J$ zUcVj5R^;;tu{2o@N<;XOp8wR-|GOqi(VlnmQ-*16D8E0I4}e=eESU`w{peQ&`~?uRzm!pMuy_yr1l~df<>6f^SjmYxt#G8IDw&^%)vTvMa-A%Q#N4N7 z(-I`l+|Jd7hT?tILzW0lT^(TDeF* zUf`6m=WNjA|0}Kkq}%%x#Cax19S~4ZKynzeYk-Pe)?GvKUv>dQE8{ElDg{;LhEl(w zg)f*JA^{25V*x#r(0m843$v-`G62ZlQ26hIMQJO+Z%)RR?n)T!E*ikfeQq|}H_75v zn3WubT%%)qr$n0)Vq>}Z6e$k3;>Y5910$ou^a<`#ks_q#X!k#= zyOSkY*)54W*BcbQZ-cd9J;&n8kdFWxHmsukTUPF!A7STjS662}Zp12|ISYFY?daTB zk-S-auJMakU{gL#(in|pS#THC@qup_bY=Q0(W?sy)HC{g26PM3(LIP@;q5T3t#JdoM?xUP->C@ug7P_%WqrH);phIu7IL(Ji$b@J4DV<1 z;b0otLoCq=z3cvmc6G&*uI7e5&S*fcIZW=ZvRBj9(Xa*mXP=0kA+~k4gHIhuqxX7+ z-st;yCcw*W$1ZnFdJf&#vlt9z4wPV!>EY8lHAuCwQ?{caBZW7)*kLQjg;iVlkk_eK(igtjru_1!gu zi8zKvi(>T=@+pEF0eBhG_FwvP{q+Id&3Dh!s=KT7^L#yK(k6Da2re3(L7g(MtKMlO zMKUwfH8<`TWY&BzDUBC~d5P6<%(=kvC&)D2a?OiX-u05-mOlCeA7~a)-xWPab2q^e zV+9d`d))WdWAQU;mf+jo9DXib6%OXFRw#ja}KlCwv+Di z@uf9T_ zOb1cFyrNvKl^Z|$IR}kIc!zN757YllkDX#x{nGKuS>Mv35_vTDQsGqMgC@!C zv25^nIULH_xr#R&ZjOowWR zra6FmeOMDQAUA8b`+s-Q;P=_Ho@V*xRklAQU1&gV@gXS!BpcE)udpP?kRWI`bZ*3& z)1ZiZDLMCXb8Tvl=vA91N-bzLV=l3QL)QfLh~BMmYP)>rxH(RX>`TkWIi`&%W#*%r z>C89fyU7)jB^LlM`klr60q(&4rLEi9dAOsx^KuM|*N!{<2}>U4C{zk&E2oVV6ng%` z_vu2Nd09Mrf`$Y9vivrWLvv)m*j{D911GcKYPlkl5;D@H;fp-4kAlG(QeEN-Ugy&2 zD^HOt@}eJUAL}X?Sf8ah*zEx`9CU!_F_zgZBRiHX(Er;sE&xS?A|sKudsVk`3O*V<uG9cRvdSFcG z89d44trBuF-JYUUfcIg4rago^rWN}ne>UNA z^O;2lV^ksUKvHk^`8tnczGp@zg-q&5^?7Ew!o(9QQFow1JO`=matlP(y01-NJxIBl zV!g^2ji9A=3Qd0X^;p(lx4C85pfXf1E)8~3*6q5PypobkslOFtp^KCZ4AXG6^dtSYybK&nhdzk+Z0sp zy{C#|!PTo0);lwK!d=uy;u<$)TBubpWvg9YMiK;)#~JBX!{LW8&H%lJA%9W$elGz%J7?#% z;ijg$VURE!sF&h#TX@px+tV+DI3gM8PxM+0zuj98@(oe_+NAc;hIvH-GrfcX;!7`u z?Az8_?BDtO|Li*9o_4iS$O>eO%|)S&m7wK{{F8Tp!^DE00%HW-gk$D+icY*2_m$J+ zn||NzOYkb3!LGDMrEvEw%Li_`hd_cH-+d7e5*zmwHjC;si3iPAxaRBXn(S^PvfrrG z*7{0=a0r~|EYFH~trYhkOvgvaZrkVzN(ALB4n00~`Vo>VC7C1`TVn+kZrxIZw7`*~ z;!D#J$r0)9ljBxAj%h&1hCT|=iOf6ci#Y$m%Je(wqYRwWb02u5TL-&|IZAO0{6&|X z6p+%9m!}d?yG8;jY0k=7$G72 z$jgoW&_an7?9d&2hL(@h^jT&5OJg!65YaZv6S1rW{DAa&CjEvnc- zsm;AxG8WV7q*LH$SnNH2?pqR4gOTkX5%fgK+c#*BviJ2xSP#)IJHxV@Yee7~-e1R- z)N9j;6GQnLv#5t;P2!_6dOF+*QGX6E$1%gbiEwq(lhSXc@uA1KH%kRS|5$*2#h_8N zp~HJQ_OH?-&MB*>tD6W&Es7#US*g%u+8tV|C&KcNq8}>mvSBYNO@}k4-Bn#AeMvS`~yH-Kf#g%rO zc~r(i2ti>gV95P62i#@owmp{qsoLZA;-5WO#La7rAWVA0S4=2RoqpF}>%MU+_udCl?g!#!VNF)~bjLipPfajCzP zkg8oOEv9SyWn4G25Ph&-*egPp*y5dBrQ6@o8QgON`!`3PCzZP;|B;}8q8EI?CV>bU zQ#J8{Li!>ueCWfxEuaIJbiK78)ATDau-D174g2gag^JFlv8!u*ci5FhrPTqy?oTl>#n(Np1R?vs#46Xl|v5tr)N) zE%U@?6a`ZFF^BOt7|XFU;)?V^?Nx%}L}G9?9syzG5kXekb^(w)(r@NHWf?vFPN-{+BchwkGQ6gsSv z{k0w3r4ebGxLgmI%-!qD1Q2cqW@i1!O#nM$+r_EnX#7=fxBC=$ zivK$)!aoE7#7Z&B?}HeH4Dn zfNF!$gP)KwQEmYP+a=QW(c@iHmFM!KuGgO?Tzfz{$@d`Ovn_WuPq&mxotgVR+f^g{ z#4Kc55O*Ekp>R#>|40a8RHG5?FA-@3u5XsNEm%yqP1F4S z{3IhTc?u61a}zH>?75m6k#XT(>SEP}xA&7ZsFrj;JUadrqu8{|&!XeX^G0&N!k+6< z(uFS${`mrXB)Q=EfVqo1dx1dKNk!t0SAI|~3jSpppPby_3&N&l1CP`lD>F3fKk}Q9 zIQ1nH_ImsK01)BLYIm7R${;fsMn2yww@-li^uMS!NtxNk5Ggcl_-+=*gH2X|kdIG= z;-!HfAzMM3Z4P6k9XB`{zcloBZJxoi?-a*UcizaDAkJqG*j!VsRHHlPJ1;OIQ;i%o%*BF$n+c zITHt(82%WqSFAeel|y_OnGSOEXE|40H?w$6M zQ_q&m6Dq)yKO2G><^ja(jaYWzY|nh&P4e>Hgm*h`+BgUM)1NGpXTiMfdFJ35FuZ?l zBmko9H2x#>F9V9Ge^oIS&1!9s;Ids)kk=^5V+;a5>)25WA|)@GK`=Kv#JOkl`qmto z8v%V0rvU**F7I8HLBZwE8C}8xZFnEVCF4@1w&eFhq32QnCD+Ez=w>mc%js7^lq2^< zheV?MgW*MQK~)a~b-;srB0_Lt?UY?(Dy6ete0i?SXla8HHA&pF3hjEQp!EWwMfMYq zoy{##ijChBS*%3rf*!~qhAeA;%CvlPf2cIJTwvS{@{EqhaDE>JieY%N&ArMwfYFyp zV`r!bopwbapYM4zqlq?>H08c=c&)vVaP3?cUI0+w)7ZIWU3i^x3?q96?&|=RsFuOI z?3dKX3J`fmp)AQ3K%_6J>h6oZ5u2!h)~h57(`RA#M(9_^kHxr`ML0y7-={RPhwDmmsyETrGXmn~v#dM=PHhJ+u;8^gr`;#G9WY zKPYBA#y2f4q}*?eg&o1kVWtd?PuGnnUT7B0*M9f`e+Fl#Cd}bW(%Dh<7IhmBxCLNl^OKKw^Jci=_hk zk%1KvLU1|QGxV~&0vnZVcW8im~$+T`&be_k+fXMRE+#stpr*9UX0vyWZ#2W zG^?jE#*jiJ=C!y7%-E`VxA?00TRbt^-D?m<|tW$39Kk0)^C$F}b~G z8hW_F2__RBP+dFd#lP%?cIF#O4Bv?v6+PMRhFz=+V{M*C#Bm_JiU$~-vaETLUSpz=f&L)Jse(q zCx}h8^9-%y>Ci@3-Kyv5=%4*l;VjtUNFMCSDVebe3BltohYs)Oes~}9Yxt!e|MF&2 zXGaUS>l!RP#UMv2X?tZ8<(g-tBe=hN0q)*tHQ7@2o>mR#7qG+|S$THm9*w$T_gowY z^LFcjBUFaI?}{PzjxadKI1 zn2URcnYuCUs{RxZU|;!rvmjGc=I;a5&WYYy>$YiGm$S99c;0Q>ACm?QyNMBzhr3?^ zM(e*aEk?KIf(>5)|5-Ql`nPAi zv~Ftk@4P(*KU&hMU@7(UmVxTCNl2RgOI#Uis_ly-xe3i)52-Cm0XR(g@ey z`;eUiJ-HWSS!i@31CD^Q(i97Bh%li_#5Qj?8U*Nq$s~f+O&JUl*}}^RyG-dYfro3olT|7iB;wDAQR%d)03FgXd03d?+N z89gO)9JmE;ZQigo`)x_I$~E>%zmYz6btG_#itsGReEldncptS98|@? zd4nJ_G&aRZ@=k-B3i}nk#dx{sDyI7oW~3bfwlyZ0kx8_v&NqpyOsNSsc&pSQa1aupjeg}R4Fh}cKW*8_STxnqk0syMllc}3t7k8C_ zSm=*`#*;}{=38hLtW#7E2*pH5tgCo;(iOb=#esCBiiG_$L4$9#PDufGwfW|v8*45D zYyyZNarU@n+vlDiwftHT*98uOKPl~Nn8e6bo}Dy_t;RFa<3t!GNOz3+Qm*RV3*6jE zBiWAYQ?4)17Dfx#pRF7!?GKQ^bi8)3dvfjN6aCX2=WF#`JBl9bnQ^@BqR(Ho33PKm zl$Pmtm*T18P6^7Tc*RHVw=ptUu6JG)=Yfr%LD{#T$_U`2YY>ARupK_@v@|FTC(q^| zxNRc2KLfI((Q*x{_$dzEQuTGbrDWlG?z)yh{F6JE3CBj47H-ycEr;so=;axe1}aI% zQhv3M)C~;nz54!^e1j7ZLF{)EA$8Q9rr#Oa>^mT4y)$l-MeYFozRuL3YQPN3BzSEO zaDecbT9BJO!o0M5=>M#xN@af2YSnD!RWR<>qckGb=YF+6oeH3q3vFXxV=XaQ;%S2O zp6Z}?%B6LyY1UzPJq7&2;aY5AnVia>bsl7h7GLM&;X1uD_;Hrt;V!%G$aqS7pZLiJ zr=WQQYO^1M=Tp5$Mh3 z%oXldBY8E5`Y0GZn^x=&%oQ+}809)nba0975Q~M>Yn^O?$3IQ6|LOIILj2bhc$JHk zu~+N!sIHPWTbGIOeZXGDLiIeSp$m)cy~-0SOi%B|dlDy)~;f#J`- zg`=sqmAT9ggfFs1@So*6v}=pB5tiNf!;t-Ju{-~yQS{QD3thD(2!xGxPK0-(vxT=NT z?Yf_G+UTLtwi{o%yo1pOo^RJz<$<0h0(#46&JYRLal%1!i!OJpO&(UzPgr4zB#BfT zhR^bjVt;+NT8Q{10=?V!rVIwHHkgx`qcd|6Hj;CnIM=7=l>NS5pAJSTPagzT>_nq& z<<;`Et25UfVfW`kZWoV<^S!&Tpg5`z0@W~1cFYhyOc(;gT}&?aFj>P@D`694(wL%c zI35imX6^1bWk?jNh4x9qwks~wF5ze3mpPRT=FX3!!joI)BClZg+_sqdovrIEKiRC? z!U(rj+|^Hc9YHD(pu@#lj>0+Y$KQ_!odt>k7jjT14Ol!Kh%OmGV+4)>eYA2~i~4i7 z&Owi3Yn9I({-2NdAIhu`eWGD)mdC3-9xBb_%45J|Z^m0h#xd!B0Ao;~u%dUFbA|6u`Hz#(gT+cjm_yO{ zz^GMy{F<+glX{q}g_(`SeZQQ({Jyl(99@3Cd_>0T8~{X{#LWo2crm~c=J9!@vs|?r1R{m{iqQL zZ&dR!s9ecAMH7^|_*F=}{9a{OxI^Bq4x>0c0#Z8^tSSGABSIB9oV6VVfxQ1T9s4P- z!TaCia>;mVkeWq_ zJ1hgeL^w^eotT5`sMVlFTY_yBKZ^`l6t$TKq)E%nM%UIUn~I|SBzTzYM_asNko?qZf&HsHXAPdw(0oJAzoGFqQPf*&ab%p;<;Ee zyv2JOQa{Sg+aV*Nec@YGpb1!{TZiZxeo`t1K#I@T!0rJjnE)J2Th=FrXE&W zYl<2@gF}{`JHXCwrhGopdxDAy15^3(XQb_+{Qog-J&HP)zVR{7bK@4@RmhE!Cg@AX zRg9*pJwkE-_zIZ446^Cge3CUsu@0o_=8hblhClhPseMttAFb11gHbuc z>d||2y>N9w_t&)Mmo>iQ@9)3a7@@4k=66-EUy#61j_Uq(;KY!rH?)@xe;|MPr!5+hTS; zTwcTOm4)O!I4UVa)6aXzVOg2`>!Qr?5+0*V45Y#7@m-P!4HJ{yVGpeGdfI~0*_C13 zhbhVFq?R{6&s_b6I6vYo-7C6L@0@|-e^RVTY6*bi@aD14B3i)+O7DMt7Qh9Q@_4D88l?y2v5Du{PW>HtOPbvHl$N1WJV~&MrtZ|xQ0!P z?}vP`7c?EVJ{Darh}Xs6gry&BQsgbO#rWC~9O|xnNA^~ING*36Y-Qgo={0zm+S@QU z(Pfh7pr+&UN8#Sv=i{c5E%s04-W=%BH9Mx&;1JTtTks&tBa?v*7nUWOx*(elziwKV+4?B549I(Z#A*8x=N zUuwLIeOSb?If;4B`k})ezglrz_yMvGK;5lVq8_nn^*;#T0xP zEDt|>|NGf8qiq~tx`&eyQRZ_$Qk=h|zpZL&Tf%kMTA)=M#S{4WJxBI(qyCiOSHZtN62Gej!AlL{XD z!0+9MoEZOmiX4#7^#3gKdz|6_FyZ6w-+)83k!;lnniVg5( z^`9$qhBTjlGyaz~M`dBU(z-c}zifk#P}J2ezjRh^`ivm1@EGnCDUSIHG+8Zc9<9gMv$RMuaz?2!VRe< zv);_jxOt`*uQv6=YbHvWA2iYBnuEn+XJS1cS+VXCZf=&pH}WSnQ~Nbi?KYlP=N@VQ zJk=w>!h5mbD*OZ$&f_hq^O1`eLQD*{lwI~VVuJc3XR`>T(Ey6sBmDLdi0>Jc1v=x# zY9Jbu)CQLir7P{1*3+{+Qx#|m45PGstuYkki#Sr{GirF7#p6La9}CgNycvJ$kvFQH zd5!7tdezXrX)9cA@;J5cqu@Gb+K;5BoACwiL1j3jA|CL zCri7gVyA>#l!|@O$FA&iP*QH3jZqc2 zsb%-Fm~o*lnQ>H*zn#TFH z_{mb3MvLim+mk`$BO|wn;^1v6WW<*d(=zZSGedv#kRdl;g`e(??eq2VwX?=w@-mu5 zR@US%gr=>A#;jhA`4(wAn12=9cz^u*3TuvJ*1#)BtL$IA`S68JUOV98S#tY6hYb#)j=yZ z*Eic=xJ#S$b}9*DjyC?Sz#QO&QQKG`*WLU5s}}$5gh_jl^uFo2j`#e*`LO#C90UJ# znPli~XqEN2;dsm`@5D_~>6u7XQw8h!Lv!=wd3qI zq^$j|DUp0Q-^3X$#(9!&HN(-J#))Ums3;45d1_X}(p@2PuBN3pKmc{7(ZeXxJi)+u?hmC;;3H76j>VG$z; zL5wM~-w{n+qJPLY_%TI7OeeVjQ{q$pSv=@8TxX|h#`_*VxF1817Hv#;6Y;u$l^=(-H@BQr8zfi&q{L;RJ?yNmBix2I28bF?+w z-d;-lwbNc5wGzo1F+dIUJTk{!w7B!0z9jqzSa(Xg6J1M7v8F=LMszL7k62=5%I5t# zL=i%ow^Dl#TGO~iQPEgQ34mS}fJkG6No|Am+1_A*d4yHAGRUIQco_u9ZBl>%%Wm2l z3ZLF>NCx(me~}tzJ~@|kyqZtaik8D4;+E%Dz{8sn;cE0yfly4$46aFO9;ILty%5F! zoO@)WWOYL^rQm#TUJ!t!9k_ak=(fDs8dtY9>M!TCxOjlrF^9y?hw+s(X4Y=GdoAw0 ztGQ**t+GWNwO?%Ij%07y4=srxG9vBfg&KX!JnPISH}(p&$%p7i$fJjM>M3(W80mx| zO2x+j@$y}>pOOE4c5~X?|;U@f=!?d*DU#58|jJ zzbyvGEJ{a+!D4b#Ev&$7h`RCN#eG?hBgW;ApQ!_z2`k`AUoy1B8$Se zPjYr2Q99&_HW6r-jpiSB>xzRk>UT}wKi@LLPXw(l_^1WQZ5zaC|Y41jro>hcS+7e;dE(uxD75e~tS})6nC; zuGo`wePwiJDa3v#sORs)EOXt8~0;R87!q7ZJMg7f)X!$#v(?@Ga{} zp~%d{rXzx$0rm<)yWP`~W8;R8x9&Ie8%oUVDB8_`Et(4xni~AWJ}TF)>Q+)k^AW)Z z0X;`8rep^TFG07?4o%Lv?(AFM40wJl^5f%;oQiitA(z+RD>^VTp@;=F(V*xH%pgkQ z*4&Ar+M##10`_?2Slzm25>ov+Ryv&^HYrQ!OF|RU1j;aRK1fSm7ytNiU!uPe07c}+ zj`@sTh3f%E9s#FipYqAq8-lQ@iNt91e3m!HM%r}k#KE$r5~w5TT`5?r9wFmB@i1Jx z!?$&Tl}KAKvTgiFrJAI#qW^%ym+hG{tlG|Am&oy?dAtyi6*yKDlFXIv`IsriGsxem z$e&_VC!83K?F@L_VX$C$@CNO=8jF+Zk`xjbRu>PA)O-kQag^oB-dN- z$MJlOl%y=GQHgDhEBZIZ$6iH>FRxCW*fDPoBuuUZ*fr(a8EprIuSKd%?L2MZG_KU| z7A@^QT~BQ=+yd2PM`Fr#%d&seW3z&2WfVj!Ms^shTa!rK8xa%ng4#ZRw6}zzpC*MH zJ)4XEyrrGAZ&HetO~+a{T(74gwBkMp$CY+|SmxyyexuZ3&3cAG-6xyeFk!u+mV?-J zGMW9B_PcL7@tJ6hoz}HYJ8NcWrGb-i$qEjZoY*$M?vmvQAnat%tnkLwfHp9S{ci%% zeS?Oa&kT>!jr8N`bj-X;2YWp(*Qf?7cc5JeuZj;K!$zI9Ma6|{j+C5gJeALq9q*D5 zJRFI-BGdMK%54WQbORWfXF_atyPxdZsc+g+I~tKk1i-)I4|dLsE(U;C{$9N3?!INY z9Vs+B?lgD6UrkRxUcV&4|8z4#fUor-&%~kd$gJRW;(_#ZRp<5T~lPeA&bu1 z2x+2~?qQeZSGhYr0#=6{WI(uF&B)D_NOQ2g4F4I9D81H`O73ofM3K);$%7nO!A${S z%rAH#vMJe!$(0_J&XwVL%=>`&nAs0Ud9J-10sd=F;XA2PD(F*D8)x`38c%t)vAwi@ ztSuHU@rQ2QZyEPEem^p%W!!LcFcPV{+oQYV6#X;Ou(Ih4{!$_-sTjg0MO8(m=vzB4 zZ^HyL&V+ZxHeC8E_*V&^eb0unc&GC6-Cl>GM|Z49{3Ht^M#}DXtB6p9mV6?}3q_}% zC0VN$-^OBp2YWP@UA$Nm&0dD3S%SDf zkaF4OBwXp1!C0wRpPQ;y_m$7&Q}X?tm31g9?C+YL0QUdv9x~`^I<3jONKbqO7q^Iy zrOC;jqS5efY>gVE98zVkBr$G>O{k1kSeF;{-~E$oIrU4V?6zezN-^mpPHmU*QbBch zyB2I4!@K>v;#oVkqrE?usI&}+)9fk;{0RAsLJKgo3ev*-dafUAtDOo{0!@B}SX5-I ziG`&_yH(KQ_fFdhMqY}`o<|<&RHu6#cK&aP*8J~`F1ClsP-I=QaU4n1g`;IW+vTG-*{ z!;1u?9G(sSYpq5!jtJlV$d3`bSolU->?cfyLpxu!=$3y|*JSi!@OVS}cV?^n z?RWmgrQ$idWIw{icvf~nH`7Z~^^zt+CqIl~qMT%%XvLzRvynr_TL~+s!!?+MQjiL3 zY)>*X?DRIpxU|1|S?OnZB%1hc3mmgCc+YP;vLZSD$u3p@@1`lO>A7}UqWkVcE;ZkC z>nqs`>YJYYFacRnX+VzIq+mhNzx0?lCmf9+lQSCV<#2Q^KjsbEYQ$#TQWT!1knO{X-=5w)hH z<&F#LWR8PmN-kiTN|~sX;7Zoa)FduxE))r+BO)j@Go_BE<^nxBmV&9cz)SR==bw1| z;XVfr-*dQ@&vM;+8$kBM_cyf0!-5tnJ=IrqLxn$tjHk^#GjF3}cOy0j>R0dmRXg+a zoG_9Yzi-Ke|BdxQGbb}gvxDxxL+QUlNB-Jg7O1|JVyk(uaNwn%9`Fm07 zCy{<0VbpmR`c zGdOmJJ%Evcp(T5=k7p%>@AvH56rukkFoUj6EMo=vXxVpaNvmD^dAiP0(X(aM>|5`= zgp8ok`7#Q^7JrBGwrk6C3zF)qb7%^l>U{{g~Kyz(-oIjkI?Ur$f4;EmMYHp ze;i4xy&?@(se+urx{!TR-m;suY6-1eE?P`XL1(HIDp#8eeMbplzY|9cdgmD`uunP>(8xJM3W$g? z3Dklo&K)+A#cqPTZDXp4>#>{0a6kHhwRFe6;>yl2pY4QS4gcV|m})X;rG<2eA#?N@ zLUJi^fnr7)pE@+TTW>U7#Em`m3{*uTDn^*?pi=e5V77Y*dwaact!nJ~sa|cc)_kjw zg88HnTqzc+Pj7Qsv~J0(?64B!s>Gmi)Gt&QB}k4M7MHL<>y+%B))0#czw2(#?oUW} zb6q8?OqELd0G-ntdYS+#BNp)QpiTSR{QmCD?meOvD>CryYb|%K4lM|dlo%r^j0&dy z>;)?!x;&5gCRC6VJf&JNX$8tZlIEvZMt5n!jpj*%qtk8{0Q)oX#oHYKDa$jY*~K@H zpfXwTjQn6D==xw6jVw4-3Y5?DNCk97?|NX)Sh~^*rc~kHuZgTqCaq4WQuIs2(XXf4 z5-yD6Uf=@4VxA6k3K2nI8#-Tc?uAvOtT@%{aYYBN>O{^o(G+qZ%2dVrK~(7GPKtbI z{IzsB^>zXE-nCxDd3X#w?(>{4df@N0TGS257am~0p-E1DHdtw*i7Z6ErWU^LnK!~Sj!tr zGc2I$oiq2-rFfr~;pn-vNRvU_Nl_w4ZZZd=QFE1057Zq~ZMgOa5GPi#=HYSI;&icL ziHCPUC_Jn&;Q&d+@~2Pid=&U&DV8#5SCT4tC~SIRC0mZ&!!*m7#QQaf$Zj3#*ElBU z3gyFwj(o$i*2cr?HXUjYkUsbk50Ubq1Q+;)qzXG(m?L4SDI3%G2di_k4o7V*#u-YI z>O}iR6I)hDOVcac?18lSXK<`6>?D^?CNAWZsK&3ZOSQ)Q<1~OoXO4xBD1SSgVp;Cb z_}nO}lZ}J;1|52l58^3W(?egF?`y0fFm14_xM<-y%P_DVHRql4 zM7-(htNHoe9ahNq;)kAFa&K0(9+R`~lrqq|y^Q{S^@E%Oh$A9`a4Ek6QA7Zhc09x! zgAesIf@uwXY2C215t3&S1+D&l#LA~dxGjUdmECqgRAQW>UWHc?0jd5$v}`i4Etex- z#v8(oPR1VM40>LoT)FU0kl2x!(-ZrL5VRHx&6a}3#IqG zP{%tUI8y06)TPD`zrrk4G(oBXqQqwKFmvF`D-lmyA>U4qv z$*c32fXEm_I6fon8gaZJnobtH?FKs#-55HeUIUR8Hfd8UlNQ>=VOway ze^=FCWwZ0#b~tpXn#OTC!_f5D?R}$DY0=4+X2plR8Z6bPj=RA2e1Ez=J&IG&Vf7rT zIzn=-<6$_%PFM;0k9joi0m)iN6u3oAO$f?1u1lvEwnXgh((xsLDk+S>BJ^=g3sMpy zTJ46_UlUx9XmM4?Dot!DnhNQ=w#Hl=paE%y46Z6=RSe+O{9R_L1L6f2#%syCN}xKZ zulrV?4~OWX5QWvUL(5`7S;WPhfvCr#Ip>a_l}AP`M(u0%Qf{$YEHwg??Dbgm&^wrj zE+?bwUPN!MnvH@uNVhxly+zwy#W>y7S69ZWpT;Lkh!GINztk)U#3`2FEtq+G49>T$ zaZoo4T{q}i($LPXl})*z!$nN8U}vLBIX^@$UAiJD4^+-^|08wf)x7x<=EC!(w_lM5 zOK3A#Q$0-N9w03O>5j`05!yOI4XELmf!?t+Se~4ySV^zX?q+pahI|MjmZq}(c%3?; z?0yyx(~03d_GdiRipg0jlK!bRR{7r8ksn3OFT>}T-=kEZ-DLRjm@p~vt#zdOC5}5T zH{JXSe_tJ;uTei+@ zTpCq-V0ZLf=Slr)mO~mS&gbC+~UpufFZqkU6-I7%ADL3K4 zMj^Ybma1BX_$8Wo^VZ(yCMND0=}RH^S37!bHYST-rDTjP20R|TEC0K)y8uYYr%x0z zfsXF~dI$rRwoH1x&v%n);`1UMk=#5cAOdW20)pTtL^l}_&hlUu5|{%q-xe!_{X>{& zDySxWn?>tK)X$=$!3gwDv@1FQeTg2$xXoj$y-l**RpN+sy_~$hJ5w>eQp3H=lmhC# zHL{=B;k0&jXvUz?UrHehzC&xPh&)nQ8*G;a{OGNZm3zG&SOyjBppi@S&^aOx%$8Dp zMq9i|pzb7v;gUn(iKc~&ROk}1>Y{BlJTfV4>XR5R!1o}Y!aC&14o)c+PjxUYYKaJ} z%Mv7quyx@nW~-g`iv*Lgr@|m7@);)NRLKYPdu4?_|2a2+rJ zx*ru1QzK^m5WP7;dpbjO9+T7Wff={3IUvnb^T@+hYK(x`6^$L%6=e%wA+WOaf*J?t zU2Cjt;DZ4pPE1)XpY!RQOm_XrLikAVsE3G07dR!JSHu~@ok~ygqSZ$)#*t$vi7 z!KE){M7iYxTfX>+)v}V5>3nhobX%GbZ6E3E-|m+)kUpy8dH0uVBD^Df2g=4lu~wAl z#S<+)ioNEYGsQ?%m;LG8srScSK03YC!Gwu9i{hYbY*_yVi&eSsk=W6JJ-c+@6`#DW z$IVP$ui_4hgULP`Gf4GnU-M3EopEV4kY8#k+J$3O9zBRh^moDB)gccaD&LA z|BP0}-1)dR(Vfz2REP9N$W4aras3;eo{^SW#aOjtcVd(kacrB&7?VM~m73#(0{Tve z31hqYORatQ8JGiF7Y*l=1$Z@hIn}s;@T8?j!$`$YJDbS_1UJL=f!cEhYh&CePn7oD z4Cn#Wg%}>`mG(NQ85)NY#pE5y#RSBF4@?*%5Wxaja+86&fP`M5jtCK1Wn@2Zes$L8 zO#rqJNI?I@R$6`RWY$KJ7ShHyr82%$=vt;s&rUlgrw_DZf8J)W`)3o%y{K->@4?mt zpenS$2Ei{x*L7C7tEn&j8J+e@tniU@3>iXvPqRHcBWZ*u8{+=T%mr-wf~ooezfg0D zWUD=Dj?21D(Juu(fhM7beHoYv%X2}U`3er(?zaSMwL^IJ$S3j7SkiSkgDjYF1=1Qg z*)e@J7mS2HmjAHz<_aHcaxYtZK@C?&ch^3R;nsx-@B^DsicT1%jk2EPXA9R-#&H;) zsH9P!!I;6qPkopSimHTBbOt09CycIi=b026Fu>bw~=*8r9HO}4n<&9wkYiphT8FO<4>NFyy_4{97_oj^PDOD$V z!%mT9YpQ>u#`mF}TxEo_{o$W*>oBcUYt3E)wwfz%t*;|VPSn-8ebUP)%=jIQQrMDQ zO*>-Dt#(_7g?aD>JQqXs>DyF)W!3>WXEbnX7&gjy_xh9ldT0FgQaB!!g|azVWXw+N z7D*}e*dDxJcZ*zYg>{;8=}pe4MrIQy!i5K$R!5FDZdqHo{>nTO7qgA~yuHFn_e?rsK;e9n**Z~$cTcMJs^E4ju6rMn2 z=@(B#F{Qh=QCjRHe4Wn)xrOoi0pWQvQ0q@m|0A9y^ KJ?f5Oulyf>P*Ar3 literal 0 HcmV?d00001 diff --git a/duckAA1.PNG b/duckAA1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..75f9bc948d0c74c6a3eaf4d46b8e7eab8cb79fca GIT binary patch literal 62533 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 REnNE%VSB@an*tLq{4bgi_80&F literal 0 HcmV?d00001 diff --git a/duckAA32-2.PNG b/duckAA32-2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..81e375eca6ecb26913dafecfda29bee16f596fa4 GIT binary patch literal 44983 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 J`*-I%{{<2qu0;R< literal 0 HcmV?d00001 diff --git a/duckAA32.PNG b/duckAA32.PNG new file mode 100644 index 0000000000000000000000000000000000000000..192aea9607904197b7e8ec8040eafddfa3676cbc GIT binary patch literal 61961 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 literal 0 HcmV?d00001 diff --git a/milkTruckAA1.PNG b/milkTruckAA1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..2aa579254d62a56c0adfef3626bda20c32f0c66f GIT binary patch literal 80050 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

*!>t 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 x4kQLPS#c+ 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%0AjT+NcPoO)mT>&GBz0KB=K=TTp4W%)ZU+1w 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 z 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 Zo(KJRxLl6uLifdHVPb1sMs~gNe*l)S=w1K- literal 0 HcmV?d00001 diff --git a/src/rasterize.cu b/src/rasterize.cu index 41abe5f..c273135 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -24,7 +24,7 @@ #define MAX_DEPTH 10000.0f #define DEPTH_QUANTUM (float)(INT_MAX / MAX_DEPTH) #define getIndex(x, y, width) ((x) + (y) * (width)) -#define SAMPLES_PER_PIXEL 4 +#define SAMPLES_PER_PIXEL 32 #define AMBIENT_LIGHT 0.1 #define TUNE_SHADE 0 #define DEFAULT_COLOR (glm::vec3(0.5)) @@ -646,14 +646,14 @@ void _vertexTransformAndAssembly( // Finally transform x and y to viewport space // TODO: Apply vertex transformation here glm::vec4 modelPos = glm::vec4(vertexParts.pos[IDx], 1); // this is in model space - vertex.viewPos = glm::vec3(MV * modelPos); vertex.viewNorm = glm::vec3(MV_normal * vertexParts.normal[IDx]); + vertex.texcoord0 = vertexParts.texcoord0[IDx]; + vertex.viewPos = glm::vec3(MV * modelPos); glm::vec4 clipPos(MVP * modelPos); glm::vec4 screenDims(width, height, 1, 1); vertex.screenPos = screenDims * (clipPos / clipPos.w + glm::vec4(1, 1, 1, 0)) / 2.0f; // Assemble all attribute arrays into the primitive array - vertex.texcoord0 = vertexParts.texcoord0[IDx]; } @@ -735,7 +735,7 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { thrust::default_random_engine seed(getIndex(x, y, width)); range(offset, 0, SAMPLES_PER_PIXEL) { int index = SAMPLES_PER_PIXEL * getIndex(width - x, height - y, width) + offset; - int id = index; + int id = index; glm::vec2 screenPos = glm::vec2(x + u01(seed), y + u01(seed)); // determine if screenPos is inside polygon @@ -765,45 +765,43 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { // determine if screenPos is inside polygon glm::vec3 barycentricCoord = calculateBarycentricCoordinate(tri, screenPos); - if (isBarycentricCoordInBounds(barycentricCoord)) { + unsigned int depth = getFragmentDepth(barycentricCoord, tri); - unsigned int depth = getFragmentDepth(barycentricCoord, tri); - //debug0("depth = %u, min depth = %u, index = %d\n", depth, depths[index], index); - //debug("%f/%f \n", depth, INT_MAX); + bool condition = isBarycentricCoordInBounds(barycentricCoord) && depth == depths[index]; + if (condition) { // if the sample is not occluded - if (depth == depths[index]) { - Fragment &fragment = fragments[index]; + Fragment &fragment = fragments[index]; - // interpolate texcoord and viewPos and texnorm - fragment.viewPos = glm::vec3(0); - fragment.viewNorm = glm::vec3(0); - glm::vec2 texcoord(0); - float texWeightNorm = 0; - range(i, 0, 3) { - float weight = barycentricCoord[i]; - Vertex v = primitive.v[i]; + // interpolate texcoord and viewPos and texnorm + fragment.viewPos = glm::vec3(0); + fragment.viewNorm = glm::vec3(0); + glm::vec2 texcoord(0); + float texWeightNorm = 0; + range(i, 0, 3) { + float weight = barycentricCoord[i]; + Vertex v = primitive.v[i]; - fragment.viewNorm += weight * v.viewNorm; - fragment.viewPos += weight * v.viewPos; + fragment.viewNorm += weight * v.viewNorm; + fragment.viewPos += weight * v.viewPos; - float texWeight = weight / (v.viewPos.z + EPSILON); - texcoord += texWeight * v.texcoord0; - texWeightNorm += texWeight; - } + float texWeight = weight / (v.viewPos.z + EPSILON); + texcoord += texWeight * v.texcoord0; + texWeightNorm += texWeight; + } - // get the color using texcoord - texcoord /= (texWeightNorm + EPSILON); - glm::vec2 texRes = primitive.texRes; - glm::vec2 scaledCoord = texcoord * glm::vec2(texRes.x, texRes.y); - int tid = 3 * getIndex((int)scaledCoord.x, (int)scaledCoord.y, texRes.x); - TextureData *tex = primitive.diffuseTex; - if (tex) { - fragment.color = glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]) / 255.0f; - } else { - fragment.color = DEFAULT_COLOR; - } + // get the color using texcoord + texcoord /= (texWeightNorm + EPSILON); + glm::vec2 texRes = primitive.texRes; + glm::vec2 scaledCoord = texcoord * glm::vec2(texRes.x, texRes.y); + int tid = 3 * getIndex((int)scaledCoord.x, (int)scaledCoord.y, texRes.x); + TextureData *tex = primitive.diffuseTex; + if (tex) { + fragment.color = glm::vec3(tex[tid + 0], tex[tid + 1], tex[tid + 2]) / 255.0f; + } + else { + fragment.color = DEFAULT_COLOR; } } } @@ -854,7 +852,6 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g dim3 numThreadsPerBlock(128); curPrimitiveBeginId = 0; { - auto it = mesh2vertexParts.begin(); auto itEnd = mesh2vertexParts.end(); From 7eef3f9b813bf3787797796e45321ee38f80bcb0 Mon Sep 17 00:00:00 2001 From: Ethan Date: Fri, 28 Oct 2016 23:04:10 -0400 Subject: [PATCH 32/37] README --- CMakeLists.txt | 1 + README.md | 79 +++++++++++++++++++++--- external/include/glm/CMakeLists.txt | 1 + src/CMakeLists.txt | 1 + src/rasterize.cu | 94 ++++++++++++++--------------- util/CMakeLists.txt | 1 + 6 files changed, 122 insertions(+), 55 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8e3eb28..5cbf9a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,3 +1,4 @@ +message("ROOT") cmake_minimum_required(VERSION 3.0) project(cis565_rasterizer) diff --git a/README.md b/README.md index cad1abd..5f7bb5b 100644 --- a/README.md +++ b/README.md @@ -5,16 +5,79 @@ CUDA Rasterizer **University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 4** -* (TODO) YOUR NAME HERE -* Tested on: (TODO) Windows 22, i7-2222 @ 2.22GHz 22GB, GTX 222 222MB (Moore 2222 Lab) +* Ethan Brooks +* Tested on: Windows 7, Intel(R) Xeon(R), GeForce GTX 1070 8GB (SIG Lab) -### (TODO: Your README) +### Summary +For this project we implemented a graphics rasterizer. Like path-tracing, rasterization is a method for converting a specification of points in 3d space into a 2d image. Whereas a path-tracer simulates the movement of light rays through space, a rasterizer uses matrix transforms to project 3d objectives onto the screen. Also, instead of representing objects as Platonic solids as in the path tracer, a rasterizer decomposes objects into smaller "primitives", usually triangles. -*DO NOT* leave the README to the last minute! It is a crucial part of the -project, and we will not be able to grade you without a good README. +Our basic pipeline is as follows: + Vertex Assembly -> Vertex Transform -> Primitive Assembly -> Rasterization -> Fragment Shading +It's worth noting that while most rasterizer pipelines look something like this, there are variations from one to the next. -### Credits +## Vertex Assembly +The objects that a rasterizer uses require assembly. Initially, a GLTF loader iterates through various "meshes" or collections of associated points and fill buffers with -* [tinygltfloader](https://github.com/syoyo/tinygltfloader) by [@soyoyo](https://github.com/syoyo) -* [glTF Sample Models](https://github.com/KhronosGroup/glTF/blob/master/sampleModels/README.md) +- positions (in model space) of vertices +- normals (also in model space) +- pointers to shared texture images +- coordinates into these shared texture images +- vertices (associated with triangles in the next step) +- indices for associating vertices with primitives + +Vertex assembly uses common indices to fill all the values associated with each vertex struct. These include: +- positions +- normals +- texture coordinates + +## Vertex Transform +Our rasterizer essentially combines this step with the previous, since we transform vertex positions while assigning them to vertex structs. Transformation is actually not a single step. + +Positions start in world space, in which the origin is at an arbitrary global position. + +Next they are transformed into view space, where the origin is at the camera. This space is primarily used during vertex shading, when positions relative to the viewer and relative to light sources are taken into account. + +Next they are transformed into "clip" space, in which object are projected onto the 2d plane of the screen, but parts that extend past the edge of the screen have not yet been clipped. This space is sometimes also called NDC space for "Normalized Device Coordinate" space. Finally, we scale this space so that the origin is at the lower left corner of the screen and a unit corresponds to a pixel. + +## Primitive Assembly +This step simple associates vertices with triangles (or whatever primitive is being used). The indices mentioned earlier map each vertex to its parent primitive. + +## Rasterization +This step actually accounts for the bulk of the code, although the tasks it performs are seemingly trivial: rasterization takes on two challenges: coverage and occlusion. + +# Coverage +Coverage is mapping the vertices of a primitive to pixels that fall within the area of the primitive. We use the AABB method, where we search within the smallest possible bounding box that surrounds a primitive. Specifically, we scan from the upper left of the box and stop at the lower right, testing each pixel to see if it falls within the primitive and assigning a fragment to it if it does. + +# Occlusion +Points in space should only be rendered if other objects don't obstruct them. To check for occlusion we use "depth testing." We use a "Z Buffer" with size proportional to the number of pixels (we scale up in the case of supersampling). For each sample of the screen, we update the Z buffer with an integer that corresponds to the depth of the closest point with larger values corresponding to greater distances. Usually we measure these depths from 0 to INT_MAX. Once all the depths have been updated, we iterate back through the sampled points and only assign fragments where the depth of the fragment corresponds to the depth in the Z buffer -- this indicates that the fragment was closer than any other at that sample point. + +# Fragment Shading +During this part, we shade the base color of pixels to reflect material properties or lighting. We used a standard technique: Blinn-Phong shading, in which the intensity of the lighting is proportional to the angle between the surface normal and the mean of light angle and view angle. Thus light is brightest when a viewer views an object head on with a light source at the camera. Surfaces are dark, essentially when an object is lit from behind. + +## Additional Features +# Texture Mapping. +In order to apply more complex color patterns, our rasterizer gives each primitive a pointer to a texture image. A texture image looks a bit like a smashed version of the object. Each vertex is assigned a "texture coordinate" that points to the spot in the texture image where the object gets its base color. In order to assign colors to fragments which are usually between vertices (not exactly at them) we simply interpolate the texture coordinates of all three vertices using barycentric coordinates. + +Barycentric coordinates associated with a triangle (as in our case) have values that are proportional to a points nearness to each vertex of the triangle. For example, if a point is colocated with the third vertex, its barycentric coordinate would be (0, 0, 1). Moreover, a point falls inside a triangle only if all three of its barycentric coordinates are in the range [0, 1]. + +Interpolation over barycentric coordinates simply involves weighting the contribution of each vertex by the value of the barycentric coordinate associated with it. + +Here is an image of textures applied to a duck and to a milk truck: + +IMAGES + +The main performance cost of texture mapping is the requirement to repeatedly access global memory, both for texture coordinates and the texture image itself. However, an arbitrarily complex texture can be used with only minor additional cost in memory. + +Since the texture coordinates of the three vertices are repeatedly accessed by the pixels that fall within them, this is a feature that would strongly benefit from the use of shared memory. + +# Antialiasing +Unlike previous efforts, we this time used randomization to perform antialiasing. Antialiasing is a process wherein the value assigned to a pixel is actually the average of several colors calculated from points within the pixel. These points are called "samples" and the technique of taking multiple samples per pixel is known as "supersampling." The result may be seen below: + +IMAGES + +Like texture mapping, antialiasing comes with a performance cost -- probably an even more significant one, actually. In general runtime scales with the number of samples taken per pixel as demonstrated by this chart: + +Two major memory optimizations include: +1. Only sampling at edges, this the effects of aliasing are really only observable there. +2. Directly averaging colors in place in the fragment buffer, instead of increasing the size of the fragment buffer, assigning separate samples to separate indices and subsequently averaging. This proved tricky, since multiple threads would have to access the same index in the fragment buffer simultaneously leading to race conditions. diff --git a/external/include/glm/CMakeLists.txt b/external/include/glm/CMakeLists.txt index aaeae62..b8d652a 100755 --- a/external/include/glm/CMakeLists.txt +++ b/external/include/glm/CMakeLists.txt @@ -1,3 +1,4 @@ +message("GLM") set(NAME glm_dummy) file(GLOB ROOT_SOURCE *.cpp) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a57f69f..cb7b974 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,3 +1,4 @@ +message("src") set(SOURCE_FILES "rasterize.cu" "rasterize.h" diff --git a/src/rasterize.cu b/src/rasterize.cu index c273135..6816659 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -64,7 +64,7 @@ namespace { glm::vec4 screenPos; // TODO: add new attributes to your VertexOut - // The attributes listed below might be useful, + // The attributes listed below might be useful, // but always feel free to modify on your own glm::vec3 viewPos; // eye space position used for shading @@ -85,7 +85,7 @@ namespace { glm::vec3 color; // TODO: add new attributes to your Fragment - // The attributes listed below might be useful, + // The attributes listed below might be useful, // but always feel free to modify on your own glm::vec3 viewPos; // eye space position used for shading @@ -138,7 +138,7 @@ static unsigned int *dev_depth = NULL; // you might need this buffer when doing /** * Kernel that writes the image to the OpenGL PBO directly. */ -__global__ +__global__ void _sendImageToPBO(uchar4 *pbo, int w, int h, glm::vec3 *image) { int x = IDx; int y = IDy; @@ -172,7 +172,7 @@ void rasterizeInit(int w, int h) { cudaFree(dev_framebuffer); cudaMalloc(&dev_framebuffer, width * height * sizeof(glm::vec3)); cudaMemset(dev_framebuffer, 0, width * height * sizeof(glm::vec3)); - + cudaFree(dev_depth); cudaMalloc(&dev_depth, numSamples * sizeof(unsigned int)); @@ -194,11 +194,11 @@ void _initDepth(int length, int *depth) * One thread is responsible for copying one component */ -__global__ +__global__ void _deviceBufferCopy( -int N, BufferByte* dev_dst, const BufferByte* dev_src, +int N, BufferByte* dev_dst, const BufferByte* dev_src, int n, int byteStride, int byteOffset, int componentTypeByteSize) { - + // Attribute (vec3 position) // component (3 * float) // byte (4 * byte) @@ -209,20 +209,20 @@ int n, int byteStride, int byteOffset, int componentTypeByteSize) { int offset = IDx - count * n; // which component of the attribute for (int j = 0; j < componentTypeByteSize; j++) { - - dev_dst[count * componentTypeByteSize * n - + offset * componentTypeByteSize + + dev_dst[count * componentTypeByteSize * n + + offset * componentTypeByteSize + j] - = + = - dev_src[byteOffset - + count * (byteStride == 0 ? componentTypeByteSize * n : byteStride) - + offset * componentTypeByteSize + dev_src[byteOffset + + count * (byteStride == 0 ? componentTypeByteSize * n : byteStride) + + offset * componentTypeByteSize + j]; } } - + } @@ -241,7 +241,7 @@ void _nodeMatrixTransform( } glm::mat4 getMatrixFromNodeMatrixVector(const tinygltf::Node & n) { - + glm::mat4 curMatrix(1.0); const std::vector &m = n.matrix; @@ -255,7 +255,7 @@ glm::mat4 getMatrixFromNodeMatrixVector(const tinygltf::Node & n) { } } else { // no matrix, use rotation, scale, translation - + if (n.translation.size() > 0) { curMatrix[3][0] = n.translation[0]; curMatrix[3][1] = n.translation[1]; @@ -286,7 +286,7 @@ void traverseNode ( const tinygltf::Scene & scene, const std::string & nodeString, const glm::mat4 & parentMatrix - ) + ) { const tinygltf::Node & n = scene.nodes.at(nodeString); glm::mat4 M = parentMatrix * getMatrixFromNodeMatrixVector(n); @@ -336,8 +336,8 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { - // 2. for each mesh: - // for each primitive: + // 2. for each mesh: + // for each primitive: // build device buffer of indices, materail, and each attributes // and store these pointers in a map { @@ -525,7 +525,7 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { // ----------Materials------------- - // You can only worry about this part once you started to + // You can only worry about this part once you started to // implement textures for your rasterizer TextureData* dev_diffuseTex = NULL; glm::vec2 texRes; @@ -543,7 +543,7 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { size_t s = image.image.size() * sizeof(TextureData); cudaMalloc(&dev_diffuseTex, s); cudaMemcpy(dev_diffuseTex, &image.image.at(0), s, cudaMemcpyHostToDevice); - + // TODO: store the image size to your PrimitiveDevBufPointers texRes = glm::vec2(image.width, image.height); @@ -554,13 +554,13 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { // TODO: write your code for other materials // You may have to take a look at tinygltfloader - // You can also use the above code loading diffuse material as a start point + // You can also use the above code loading diffuse material as a start point } // ---------Node hierarchy transform-------- cudaDeviceSynchronize(); - + dim3 numBlocksNodeTransform((numVertices + numThreadsPerBlock.x - 1) / numThreadsPerBlock.x); _nodeMatrixTransform << > > ( numVertices, @@ -600,20 +600,20 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { } // for each node } - + // 3. Malloc for dev_primitives { cudaMalloc(&dev_primitives, totalNumPrimitives * sizeof(Primitive)); } - + // Finally, cudaFree raw dev_bufferViews { std::map::const_iterator it(bufferViewDevPointers.begin()); std::map::const_iterator itEnd(bufferViewDevPointers.end()); - + //bufferViewDevPointers for (; it != itEnd; it++) { @@ -629,11 +629,11 @@ void rasterizeSetBuffers(const tinygltf::Scene & scene) { //////////////// PIPELINE CODE //////////////// -__global__ +__global__ void _vertexTransformAndAssembly( - const int numVertices, - VertexParts vertexParts, - const glm::mat4 MVP, const glm::mat4 MV, const glm::mat3 MV_normal, + const int numVertices, + VertexParts vertexParts, + const glm::mat4 MVP, const glm::mat4 MV, const glm::mat3 MV_normal, const int width, const int height) { // vertex id @@ -717,7 +717,7 @@ __device__ __global__ void _rasterize(int n_primitives, int height, int width, const Primitive *primitives, unsigned int *depths, Fragment *fragments) { - if (IDx >= n_primitives) return; + if (IDx >= n_primitives) return; int id = IDx; @@ -744,8 +744,8 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { if (isBarycentricCoordInBounds(barycentricCoord)) { unsigned int depth = getFragmentDepth(barycentricCoord, tri); - // assign fragEyePos.z to dev_depth[i] iff it is smaller - // (fragment is closer to camera) + // assign fragEyePos.z to dev_depth[i] iff it is smaller + // (fragment is closer to camera) atomicMin(depths + index, depth); } } @@ -809,7 +809,7 @@ const Primitive *primitives, unsigned int *depths, Fragment *fragments) { } } -/** +/** * Writes fragment colors to the framebuffer */ __global__ @@ -848,7 +848,7 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g // (See README for rasterization pipeline outline.) // Vertex Process & primitive assembly - + dim3 numThreadsPerBlock(128); curPrimitiveBeginId = 0; { @@ -863,17 +863,17 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g dim3 numBlocksForIndices((parts->numIndices + numThreadsPerBlock.x - 1) / numThreadsPerBlock.x); _vertexTransformAndAssembly << < numBlocksForVertices, numThreadsPerBlock >> > - (parts->numVertices, - *parts, - MVP, MV, MV_normal, + (parts->numVertices, + *parts, + MVP, MV, MV_normal, width, height); checkCUDAError("Vertex Transform and Assembly"); cudaDeviceSynchronize(); _primitiveAssembly << < numBlocksForIndices, numThreadsPerBlock >> > - (parts->numIndices, - curPrimitiveBeginId, - dev_primitives, + (parts->numIndices, + curPrimitiveBeginId, + dev_primitives, *parts); checkCUDAError("Primitive Assembly"); @@ -883,15 +883,15 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g checkCUDAError("Vertex Processing and Primitive Assembly"); } - + //_initDepth << > >(numSamples, dev_depth); cudaMemset(dev_depth, 0xff, SAMPLES_PER_PIXEL * width * height * sizeof(dev_depth[0])); cudaMemset(dev_framebuffer, 0, width * height * sizeof(dev_framebuffer[0])); - + // TODO: rasterize dim3 blockSize = totalNumPrimitives / numThreadsPerBlock.x + 1; - _rasterize<< > > - (totalNumPrimitives, height, width, + _rasterize<< > > + (totalNumPrimitives, height, width, dev_primitives, dev_depth, dev_fragmentBuffer); checkCUDAError("rasterizer"); @@ -921,7 +921,7 @@ void rasterizeFree() { cudaFree(p->diffuseTex); cudaFree(p->vertices); - + //TODO: release other attributes and materials } } diff --git a/util/CMakeLists.txt b/util/CMakeLists.txt index c995fae..b53ad72 100644 --- a/util/CMakeLists.txt +++ b/util/CMakeLists.txt @@ -1,3 +1,4 @@ +message("util") set(SOURCE_FILES "utilityCore.hpp" "utilityCore.cpp" From 192c34c5317856cff8566f71cddb544d8518dac6 Mon Sep 17 00:00:00 2001 From: Ethan Date: Fri, 28 Oct 2016 23:11:12 -0400 Subject: [PATCH 33/37] images --- README.md | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 5f7bb5b..3e32e00 100644 --- a/README.md +++ b/README.md @@ -63,9 +63,12 @@ Barycentric coordinates associated with a triangle (as in our case) have values Interpolation over barycentric coordinates simply involves weighting the contribution of each vertex by the value of the barycentric coordinate associated with it. -Here is an image of textures applied to a duck and to a milk truck: +Here is an image of textures applied to a duck: +![alt text] (https://github.com/lobachevzky/Project4-CUDA-Rasterizer/blob/master/duckAA32.PNG) -IMAGES + +and to a milk truck: +![alt text] (https://github.com/lobachevzky/Project4-CUDA-Rasterizer/blob/master/milktruckAA32.PNG) The main performance cost of texture mapping is the requirement to repeatedly access global memory, both for texture coordinates and the texture image itself. However, an arbitrarily complex texture can be used with only minor additional cost in memory. @@ -74,7 +77,19 @@ Since the texture coordinates of the three vertices are repeatedly accessed by t # Antialiasing Unlike previous efforts, we this time used randomization to perform antialiasing. Antialiasing is a process wherein the value assigned to a pixel is actually the average of several colors calculated from points within the pixel. These points are called "samples" and the technique of taking multiple samples per pixel is known as "supersampling." The result may be seen below: -IMAGES +This is the duck with antialiasing (x32): +![alt text] (https://github.com/lobachevzky/Project4-CUDA-Rasterizer/blob/master/duckAA32-2.PNG) + +And this is the duck without: +![alt text] (https://github.com/lobachevzky/Project4-CUDA-Rasterizer/blob/master/duckAA1.PNG) + +In many ways the contrast is clearest in the case of geometric objects, especially when viewed at an oblique angle: + +With antialiasing: +![alt text](https://github.com/lobachevzky/Project4-CUDA-Rasterizer/blob/master/checkerboardAA32.PNG) + +Without: +![alt text](https://github.com/lobachevzky/Project4-CUDA-Rasterizer/blob/master/checkerboardAA1.PNG) Like texture mapping, antialiasing comes with a performance cost -- probably an even more significant one, actually. In general runtime scales with the number of samples taken per pixel as demonstrated by this chart: From 1170dee69fbd3a3174e51a07fbd5794fdf576d6a Mon Sep 17 00:00:00 2001 From: Ethan Date: Fri, 28 Oct 2016 23:12:33 -0400 Subject: [PATCH 34/37] images --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3e32e00..b80fd77 100644 --- a/README.md +++ b/README.md @@ -64,8 +64,8 @@ Barycentric coordinates associated with a triangle (as in our case) have values Interpolation over barycentric coordinates simply involves weighting the contribution of each vertex by the value of the barycentric coordinate associated with it. Here is an image of textures applied to a duck: -![alt text] (https://github.com/lobachevzky/Project4-CUDA-Rasterizer/blob/master/duckAA32.PNG) +![alt text] (https://github.com/lobachevzky/Project4-CUDA-Rasterizer/blob/master/duckAA32-2.PNG) and to a milk truck: ![alt text] (https://github.com/lobachevzky/Project4-CUDA-Rasterizer/blob/master/milktruckAA32.PNG) @@ -78,17 +78,21 @@ Since the texture coordinates of the three vertices are repeatedly accessed by t Unlike previous efforts, we this time used randomization to perform antialiasing. Antialiasing is a process wherein the value assigned to a pixel is actually the average of several colors calculated from points within the pixel. These points are called "samples" and the technique of taking multiple samples per pixel is known as "supersampling." The result may be seen below: This is the duck with antialiasing (x32): -![alt text] (https://github.com/lobachevzky/Project4-CUDA-Rasterizer/blob/master/duckAA32-2.PNG) + +![alt text] (https://github.com/lobachevzky/Project4-CUDA-Rasterizer/blob/master/duckAA32.PNG) And this is the duck without: + ![alt text] (https://github.com/lobachevzky/Project4-CUDA-Rasterizer/blob/master/duckAA1.PNG) In many ways the contrast is clearest in the case of geometric objects, especially when viewed at an oblique angle: With antialiasing: + ![alt text](https://github.com/lobachevzky/Project4-CUDA-Rasterizer/blob/master/checkerboardAA32.PNG) Without: + ![alt text](https://github.com/lobachevzky/Project4-CUDA-Rasterizer/blob/master/checkerboardAA1.PNG) Like texture mapping, antialiasing comes with a performance cost -- probably an even more significant one, actually. In general runtime scales with the number of samples taken per pixel as demonstrated by this chart: From 90fcfa7f81acb90c4ee6b18c74596453a3b72e2e Mon Sep 17 00:00:00 2001 From: ETHAN BROOKS Date: Fri, 28 Oct 2016 23:33:24 -0400 Subject: [PATCH 35/37] profiled --- antialiasing-profile.PNG | Bin 0 -> 22956 bytes performance.xlsx | Bin 0 -> 16312 bytes src/main.cpp | 7 +++++++ src/rasterize.cu | 2 ++ 4 files changed, 9 insertions(+) create mode 100644 antialiasing-profile.PNG create mode 100644 performance.xlsx diff --git a/antialiasing-profile.PNG b/antialiasing-profile.PNG new file mode 100644 index 0000000000000000000000000000000000000000..b4b04c81bde2e3c2b20362e3f517b3c8bbbc1644 GIT binary patch literal 22956 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≤ij|m`$c}vxuCk56M8)9B1D3yVVTaC%+k!KFDWP~ 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 #define STB_IMAGE_IMPLEMENTATION #define TINYGLTF_LOADER_IMPLEMENTATION @@ -120,7 +121,13 @@ void runCuda() { glm::mat4 MVP = P * MV; cudaGLMapBufferObject((void **)&dptr, pbo); + + using micro = std::chrono::microseconds; + auto start = std::chrono::high_resolution_clock::now(); rasterize(dptr, MVP, MV, MV_normal); + auto finish = std::chrono::high_resolution_clock::now(); + std::cout + << std::chrono::duration_cast(finish - start).count() << endl; cudaGLUnmapBufferObject(pbo); frame++; diff --git a/src/rasterize.cu b/src/rasterize.cu index c273135..e1654e2 100644 --- a/src/rasterize.cu +++ b/src/rasterize.cu @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -889,6 +890,7 @@ void rasterize(uchar4 *pbo, const glm::mat4 & MVP, const glm::mat4 & MV, const g cudaMemset(dev_framebuffer, 0, width * height * sizeof(dev_framebuffer[0])); // TODO: rasterize + dim3 blockSize = totalNumPrimitives / numThreadsPerBlock.x + 1; _rasterize<< > > (totalNumPrimitives, height, width, From 5b8e17ed4f5e43eae22b5daa8e368c5bb17ca673 Mon Sep 17 00:00:00 2001 From: Ethan Date: Fri, 28 Oct 2016 23:34:32 -0400 Subject: [PATCH 36/37] profile --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index b80fd77..d48929a 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ CUDA Rasterizer For this project we implemented a graphics rasterizer. Like path-tracing, rasterization is a method for converting a specification of points in 3d space into a 2d image. Whereas a path-tracer simulates the movement of light rays through space, a rasterizer uses matrix transforms to project 3d objectives onto the screen. Also, instead of representing objects as Platonic solids as in the path tracer, a rasterizer decomposes objects into smaller "primitives", usually triangles. Our basic pipeline is as follows: + Vertex Assembly -> Vertex Transform -> Primitive Assembly -> Rasterization -> Fragment Shading It's worth noting that while most rasterizer pipelines look something like this, there are variations from one to the next. @@ -97,6 +98,8 @@ Without: Like texture mapping, antialiasing comes with a performance cost -- probably an even more significant one, actually. In general runtime scales with the number of samples taken per pixel as demonstrated by this chart: +![alt text] (https://github.com/lobachevzky/Project4-CUDA-Rasterizer/blob/master/antialiasing-profile.PNG) + Two major memory optimizations include: 1. Only sampling at edges, this the effects of aliasing are really only observable there. 2. Directly averaging colors in place in the fragment buffer, instead of increasing the size of the fragment buffer, assigning separate samples to separate indices and subsequently averaging. This proved tricky, since multiple threads would have to access the same index in the fragment buffer simultaneously leading to race conditions. From 2a0667e40f561ad87cc99b38ad23cc2a26647d98 Mon Sep 17 00:00:00 2001 From: Ethan Date: Fri, 28 Oct 2016 23:35:46 -0400 Subject: [PATCH 37/37] readme --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index d48929a..26c8be3 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ CUDA Rasterizer =============== -[CLICK ME FOR INSTRUCTION OF THIS PROJECT](./INSTRUCTION.md) - **University of Pennsylvania, CIS 565: GPU Programming and Architecture, Project 4** * Ethan Brooks

#=`Ab6EYD80m%fN|44d4TB4OKk&#cqMine?~f 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 O3=E#GelF{r5}E*h)v^Hq literal 0 HcmV?d00001 diff --git a/checkerboardAA1.PNG b/checkerboardAA1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..def7c53091f5048e3b16a51b386805ad50ae9ea5 GIT binary patch literal 10630 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%0AO z{1z$cRaEf)wU4UxRz7K;Ay^`@3?-)t%K85`0FciAilWt+5~K9i&)_d{0Z5te-1oH< zu(rd{_J6|i*{~K_d?l!u`f72aWF_mfJuPAZ@R+1+&-&L)0FCp4uf%I&a=x+P7E-Lrzx@jQPFW?kvhPNeq`*@97E+^i2s_cw*O#@ zpK&R5eC(fg6BG*0xD=P;fh_qENm1Yi}Ta zBDYQik^ek6p5GVzOL1Og1t_jNV-(i9fElntlIk zSsFW|XCa35lZMgo1BiLgA1%w*bzTFqVSCVn@<8+hTXcHJNS5;Q)7cwI3@6 zGn1&h;|m0Mijg|2dGz9|pJs2QzF49A>56$NQYk-fjoWX;q^Lt@SL>n72D2$uMhT>t z4H8x|`6oD&&PCjl7t-sJnnz-tEC1d!NS7w2KTgG+OJ6wA*7uWULW-pFHe&F0M4C zw^NjIN!eH4L?mU*BJ&CO{ z^rUW!FDRNJFd}>O9{6PUB^IuFI+zL4U#6!1bn^r_^4_B}5$$US^Y5h;?s(MD99|$Bt#p*FP3qe>F@t z{C<0H&T)^!M>apwLeGKo8g6=6Jg>6V`fzRs6s75{7`qk4VsSWnVvQ{f`l-0G!0^Tl z6L?np7L&^Eo-EincC)UMnjXJZQuM)O9h0(Um(wqXCY*B=*DytD(hYsS2j`)oIYHJE ze#~PO17T{TdNx{hu6(#Q zCB*FHH8VqGO@1p8yWi14Nhl=4*Fl|kK~b07eV?tzUjMbHN93g9yUq;Rx!4=&{v~WT z+|b32KjohClTpHfN@!swS&}{l&bun{l5);zP^>)Ux*tupGKJ4*L1BC4khjU_PI&k$ zNC5P7PQ)sY{t+g4LidK5oZO81?XG_0XzN(#FioR}S+ax^mUD)t!=Ap48OnxC-3 z*z5TT5xvJ6qcInVb%vU9~0F452>^+=PVY7s91u!7ZTtZBWqW?G8T#uDKn$Z`FZ=?^*P8Qw>vFoMEmML(aeS+}+%UHaJY2f}4cpD8=ZtU;~w@2m7sI|Ih` zHxzTIwr27D5keatCFtC)ZrTUi$N>#&?XH5Yy3eeNL93BhA{SS4VJxz&I5=F+ZIZ!22_iP28|U z##E?1LZ8_pAM?^8NCPLZ=Ks zmIJ%wA$I84o zF1iY{>2%=g)nWZ!!eBUPGoY$fpu6=3_wCQt3!k{f+k-9w`O~u_3OT*A*8{&{B4YjP zWl!G%-z8qyB_~FMFnfSTafOG_V>Kuw6KEng9~lPKL%wyB-+Jq+Z-)opj#7?n{T2$o zg@SLP0Q4;s{BJ@*%nT|w7dW#YdXGzv+_`uXZt&j^qhq!~CxCxy>)cGeh174xgGaD_QVPL^Zx(`joi=x literal 0 HcmV?d00001 diff --git a/checkerboardAA32.PNG b/checkerboardAA32.PNG new file mode 100644 index 0000000000000000000000000000000000000000..575a50bb050237095c14bb3e1ae6bcc5b68c87db GIT binary patch literal 20653 zcmeHvXH=707iO?t8`uz#b`=o?6a)by5L8qY5D=+~1SvtKX@b-gE2tnvY9J7?AzeVg z(1M~uLQGJENC^=kpp*m>A%wJfgZI1ht(o~Z^Jms_Eg-xl=j`*m`|SPfefD|pIXT#@ zTfKEP2n1Sp^2AYR5NN3(@O%8P6~LM8h@dv$Lk{6=a|BdQRr?7XEDJn*>M#gYnY>1H zVL5QT>dFaE1PCPGD*Kgd3wz-Y0y!NydGxSLl=l>4Wp+paN*cm-q#u3q$YW#Yi+3K* zCdbp1AMD$@$#6^Ja+9sT`uDVb?d&JR-`wBz;;xVN>BJXzAO9NMkn;TR^Tl@`pB$WJ zb8@N`gr$O0;4Z2$+=_lJaCEXaU<$jfoMsVZ8T5o|xVCli$1h{8oS$;s1=-JsVwEKy z{<)CoYP>9Q@hotm1ooHm@7r4q-9D~2{C#`eh0>gDKL51S>S1Et@=rT)m6zkL@B2>& z-G4gx2fP1=5dByRtNv(ut}XLi=qeDX^R|_!HNLFIp=BiDTu6;;ozQ%+H!r-8z|hWu zDu6&Q592VOA{%Jx;ZDq5!zrGshJ+z7Ejlz(L}E@hqqzb=Cr=&VixPxxC#y@>WxJfx zG$`}}PIjgrwa*oxh{C)x2dwmP)`=*rxTMfZutm!ib%Rr!upIzw#;Xy4U zn(_FE4It2=wCBqy8=k1jfk0>X@9{~p5ckVE$k}3OlQ*Ldw6OEkn(QaEMr9BvG_4s< z>1D)1kXQJb3`nIfHzxXg|4X(h#lLCk=&3Nq)x(gOmN(*b$5|X8&du|4^TClnP6vh; z;xWDVNfWGVA+7cOhH01N5ERcW%J|n|M_l)e4(?0dmCq!`j86W5y4eB}8M}QnNGJas zLjrGA{~ICy*U>t z^^aVL&bk(#7cN=s(Y@6aIra2(aN@uM#{_C#*@+1WXG(Z8Z6?Xs*NzhP){tz{tLtF) zq+Q@FQ7R-d+=&q}b+Z`tPO&)Gs@Kvl-Z7jOBa|=@gH2(P?^#)qR?RG%iTN%iP8Y_$ zMJ?hxfrW4YKkNUA$M;#nN=zhzR)*5funDPUJ+md`3NT&Ix# zWFcA(w7-~nmH6#Gd!o?mwG4d5EF-RNYVHktw`1%Z9Go~llLi}zOEXXgV?MT>d@`?$ zLiUHoDtHHR*b_PrLNUVn{+_VbACmY7&8BFiRBafO43V$9u(NB)=saR?Znv~-Rd!Z0 ze+@$qGRw@!(p- zbABaz3i@^U*^|Eq3WZ0SO}l78qA<|)4~dA0z14NSeesFLTrc{4&}Z)!$ljZ_FD~!jXQ9N3}FwkXqO4 zuwT3LZ|5<)Lj*~T2A!$Oj=t*zZS=2J2~VdfEUQKiF;5y(q(xt@>sW*D3*lpjru?An zTGgq)Iq-Ksc(lo{mZNus;ZU`~Lgwkg%KpGBLP!|$a@|Lv!}+n=!L@uS{oO>SG{52w zBoyp_4i>{igpAokH3uOx94y)!1bQ$YIbhIOWe$IJhUiS)+T`sWnHQowMbV7zi-cwD zdT}#g7r#Wq>Sw9Rj3HrN;Q8=?$oY#xc`Fn57ASA#3sUVEZEHVAQXmmXIZ{bj**KE` z#b}FX{A_4utjC{-g`u>GQ@_W4a_s!RlH8tUl;JvzBi}3x6UcuT$?36-rsXx1S-nDO z8rBWK?KJiM3>LoI(N|D56y{rr!O06JG&gCg3^w;{d!qh5>so`Fi3GV>J2tOk%=U=?7W%eaOhdyY;xlFi=xKl=;3Wa8peu#b@5oHG@53{`0DXze+u)Gl_k_721`RJDT+TkvKs#B>q27^6^8!Vw}bdWN?I zbkT)4j2;@8d6`c2svd5pnkI&tkN-*tG*K}WATM%*x`%ZhXkA_~O{~3oL}GcZ|9wzc z|B$*S8#=6GB_Qo5SVHmjoU&xXY;>rJeD(}rqt3SAkdln*`k$kkvvSoeHs^{`^K`<8d%c|TAMA>OaU_^hF+pi@)pIWfQHfqC6f ze(&}a#5|g~8_JHHiyWUj&wCv*XW>5{glAm(IAzShF!~FilDie^(})5$ZmhB@IrqggSOe^ty! zC6!{~+nRBi_1TqI@SgB3d7g@LWs2y}$LHViVfT8-?$ff0t1BjrW#kxkM zB&!b$TCs~5B@naMs3~!LviTEcYQ8{HJ>VTOJht)ZaGro9eDHlp9QcKnhN&RX%97Qi zyWF2ME54SanENZmJaqm^L7zQyqE|!77-d=K7}~a$W;IM(1A3(1djldg=Ox4o5~JU@ z{+Q*~r}d}wC#j%9OrzO$dkIgoXz@FVZkFiJ2Q+$m<35G7;Y@0{^nHQn>yJb53;asK zfrUN?4(>i-X5tiiO0ZDLRI@ZKxyustSd`N-klDt6T)^zxl0ZOH3Q_YR3}b%m8UCbW zV{`0apm%>rY-a?j1sC=GUJ!%(MDv>2V3c)a>nwd%4)H}r2{0Eh{+!Z-h+u`SgOG@e z#9`5#Um<2HMWHeHRTuilx49Vrk&X!$nsFDeA~x20qF3_(Vmzn~{VI0uq78~DL3iQn znB|kDe9on5(S$|B=PTwbq>zi7?bA5d25H8kv$NSVbXbfR<<~4hBeG;+Y&obiX^Q@? z_0tpe@m~Kn(akk`v(K>IEz!<5cUPDb))A(9F1{$EnYtw7)A<&Jb;B|T*HQ0h!@c_X zOGsAI_YtkG+9wNq2hKwKt1;!RD=AT`Frz&_4h=tItLp{vb>TwvuNH`JT$~(&r-1G} zAIZ4JxJLKxUr7N}uK`KzlJ6rhhcL5;H`S^0KZVvwnDG%68i19I@M4?Q@6i+raotm< ztMP%DZ>8rnjjNcs`F)n7$26y!jU>odtpk`c%!9lJ@lLjRqjY3yqLDq#j4q$?JKist zyv87l0m`-{i0&5Y`1Z>iu)|CrFCwc?aiV_=~ME7K5EX4}VM84M36-{E6tOjz=B zPbbsy2r3vs78kcUk^!!9ZXj-$*5o_FWdpvA zDX$ehTd66Yj%S=QLlGN>KBz9JWalQaI<+_aBSO@+3FiJ7f#%}FRr&HTGn*M zP7sL)`#kes({hOiV{$ZB1@^i2EiX!DkCs+ z*5_6s>ZCbsQ_@kBy4im7`jB~VVSju@` z8hfZuFk?Zj{XEV95tD?_!E@aHnHt09bn5u2u-<~?RBSM@tDGTk&KYcqz9L)+;gZ<% z)kJ`->9K;IJo@@f=pirxfvT3G1|us}r<|ZQi#%mZ-Oy8BdCryDZ_G0e`4O>_rqNnn zp#%k&3UZRQ1P7W!M6ZW_o9O77Yt;u?H}z~XB1kdjLpVF3Z*hKF2Hb<6v&>%Bb_9|i zSkE(PxbTW5Y*I|4cTCj2UZ-_w;D0P! zk2almW?}->f@~CR1%WsV-`+6x6?%U~3CX!`GLjLb+QW#$+ONqD^M)@4fd+P}OFwor zM6yv=tTw%L{-1mo@Fik~j5Fu#xAfVojspIBbQqvfI6ERh;X9w!$W?zjE{xdLZyTgeZ<$B?mOUzwrO36WLn~p(^jmDc6C4x;ZNvZ1VvkgHe~6ja^Ge z6HmWd`xg)%_-MP%Y+M3_)fXN9>xTcF*tf?=UVVATzb%|zM&Uo-03gz0Tl`&n*;)WK zoUXTTObZTtKT}SIQ0Y_P_-qUE+GhPU+4Yy7i=*y=m+oBr|KWeZC=*Wgznb1>=|kOm ztmFFsF6@%gm#1H@UG*PfkF|IiKlsmGfPl@Ck3li<*djBgl5b(SM(;c*Apk=tcx09ju2)x)P z7`|EG`rkf&T?a>Q-m~=IV<0lQ{NLAsBv8i4FdO zmOoEAj^~R;bRv_Z-f1mJ%i8^9?bXG$TWfq~NF{uZbx7JN)7{XOpe@Ch9|EC=-Hst{ z|<|@TRSqVWAa(t)+>rX%L0-OC%$)`B zvYODCdl^4#ykQkCdt$oEg5NA;pF7@uWQTI|{Ck6lbHSCzfRSWyXoZm3A|q!QceVn9 za_b!wGB{|~L|Mhv&K)Z@+2QBk=`3)9L}M69U>$!jmcKz2`*R@+BgkUoB|q^CSCFH| z_+Cr))#M4xbL@qfmZch2m z3O#Ccr(6o+9Cx4bhTcl_^exSS4tWIZK)zHo#=r6FRiR~>kPbW+wrfRj$So zBPWKp#pkSR^+&A@w3Q57NuKma4L|6hd)=j2_@6WGn(n2cYwMC19OJOgKt+eFp<&v@m>|HCM1-3*)lQv4Tu`etFVOjE!`ETfkO($Iw z_1~d5u}p50{_(*xirU61A8fU6WMXRo@%YfWi69fEj+OrkDNvv z!Mxp7QV{S#H~zAAHh16PLQmaXwZp2nl%rx6RKn`B=5xLH&HSbYs2~IC`K35Cnyu^d z_>!Tw66Kot23CW&$5Be#rrmmXdC>L zNI24Fe8`FPk(4rEz7WS1%*cXu*nsw==tSDN=uZjWE^#FLVy7bi+{}ZuRZScKhYpbE z-I=u~A&!YI6$ItpL9ck73x@lX9+a-g!e5fVCmhkS>TMEFg>eP}IcLZIW^J`tRiNgZ zg%5eWJN~uyTH}Uaqh>?`^ya}gzn+^l6~)qG2fJ2w37JxfB&A^{w$wMkSzbLM*pYgz zc(B7)zpWq%$Zsv0pz0I16KPTpO;@BnS^v1CFF%_wtj_sLTOHgi7!_}GU6oIqPayt) znj5bLL$xoYx4wZJML}S9$|k*tB9;M1p_fdZv$0zE6iO7&O;o6)9U?;qv$z$U-jn#X zDYGW>nFSP>OGTXrwuv<1HdN)bDrwpG^K5t)*F+C{(l%SfHITxk)zs*{SUK|Jwb)bS zp^E|mY|BsC#FQF;e7nvOv(P2%eInu@sOQPw*LhBEBkHB@YGzD@(hWwPn%Fz44O=d| zn4J7e`TCKF1H7y`T?bv)r<5JEb4{bZth4%_ARnZMd&H~i+X$G_Mtkg@_Qa#UI&!~0 zm^D}SNA!mX6Wn0fAsvgMRg9ihQyJKTAlNTJH zzc}9857>_%{%|`LWU`Mg2`WwD{P{@^?ULW zZCEjV=|#`qmY{v;te|7o(B<*!hqIL(dmF-YgR4#o>Jw7cMazyyAWIC3TvCnFSfUOT zRg0ug8QJEY#zoPo!63!I6Eg6zkIQ4uUw3mo1>`1Qf3#aR zGM%^VxO^6wpyT=7Oy~QUUxWuD{|I$YH2F;aXO8}u+8ta)N-F}+607B8Ae@Xk9_Ecu z;&$j(S?6pLmC(nDNt{^)p?nIpQ7!d~)*2he}C$Ie&JY#g}z&WF=+tlEG z%X~}n_qEtr0=;-Bu!#RCCgDXVt58 z6<*m%QDa5!*5vU#nJQ03gD!Gao8ycxfyx$rz?IxuFTMQ%E5SNGIzClra)=V0@G7`# zdB#J}TczF^n`#kvUCY1bZz5D9M1c2i6iyH&6X>=BI==$j4#v9%j2+a$*hDlUn9o*c zo?Mks`nuL@=3)2OjnQ@+^sKSlqI)~M-J03XCti)1>{Q_8kfJ{9w303hl^?bp8I9bw zX1l-X?gS(MfNBwB$9<@P>^}Df$9ov@^+LSFBA>FI6^m$*Tls6OF3~l0qm3pie0RwU zSI(+OuD@Nf@2bSfqhsq|kkqNRihm*ClGcR89h1E#C|%n))^M{fw+`U1SrY$N3wr1Ml=i<0bE*oKb(EK z)_g3&mA108crhDU2ktPbUf+9_QgdjhR={V&<2~;ALNp&R=Y4kD>`VhAc9eL^IMIZb zj;66+3c{x9X75~o7?Y;Pdi#(d9R{Yk#E_sCn$=p$rTr-Nj@_-_M!p2F%M^Y|? z6XpY9Nk(VVtc&4MuCP0B2Zzk7gFzKd3#~;)h;+`GeDe*dDiycS%noM0oeIMUC4pz( zw>h6^v6#G|pa+dDx~uGCvY40!Du?2`N1Spd2PAJaMTapDBOo+_GI*Jek`krhRJY%l z7A;MWtFY7`weD7czWFE^>I;s9Am%;Y>`IRKL*gop(wDD;dppkdC1j}7P}n0!g-4ys zU*KKa;2Ms;Izw4Jd-(i70#x)}l4I(K=B5ezjkNYRAM%H#!>Omy(2X91L;g3fTKHul zQjI#!EDE_}Fpd+pd)5CGQ4h0^#(m$a{XpkIpe`?w)-eO? zE~2a$Nh#6+sC5(WTnfSg?i`_!_6%J;j8p$X@!w$!%e_NVn&!CEsXipykR5cvS<@PP)R0-Rr}pb(sbH+$#Pjr? zDzf`_-T1GpB@e;4J;@{@Vk2ftcsp+-ayzqaS;teqB=B>E;&JgFMY*M=I~QjMS~uYR zv&l}k$||R{nN-hIks>i>N}00@7NKKjJa$yrz!bB^t7bj(!RACT=^!ojSq$RlHHT6f z+23<(bh72#kGa8Ej-*)J3#RG%V>h&KyMo=|QEWYAq?N%pN=&cRJ>FxpH&QPQnGo{Hy;=7tT@K&*OGFlW~%96y~I|1KPs%oT3*B%A9E zXg`NTT--|RoU}{1D2)>DGcBN!lQJuR9j{B+Vspf&=vKhzc*w5;i2rkqMc!n;RoDiHL`36ZP25xPwk5z`!{pvkp?AnsI4G+Z6Hh+TZTPZ zYo@8gj73AamSlS;`NC3f)kh}(VCx^}i+ugn@aSmC{fv{~WUU)7aV6OSFm23vyag7$ zH*IDgG};Or87QhBCiaaP2*3ppov(qqx=J6t$~WR*-|aA~2z$FYejHi5QCsPnxb)K(O-m2|tT74{36MfX?K7ndhEp%EXvx-I&1kB_%7G-kTmTI<1^{Z z2Nzzh4Ll6rj-G{Not2+0e(YC}WI6Zs5*H1x>>i($JL|j%S2qdD{nmcSdH>`RYwU_#=LU83U^kY z@pJ$at?$uAgCipg6lGSVHqp92xcZc|iE=sIQ{!NQ@rbB|^4GB?dubU?9{A--+*tQJ z?MRnOXA;V|)wKz7$Zjz;P^#NI%>GeqX*uRP_=#vUd*X48fOd$H=&ksYN~)zD)A&p&{*gXw1qw`!&4&6Z}H zPu4a=PPcoox_jX$FRpbI8F{!W+W3O#NuU{3o+$%rkBHkK)E=a zU%K^Acv5$H1G|rzFATiLwt!ivDocYSqXY&)}NV*H?xs0Ay7-AN|2N|C98ZRs2Jife^e*_v&VF*bbej zv9l%wm>pykyiw=goeM7$!;%{%a40YcAYkn+|NhkZ4hgwK-tDrEg%v({!vAUF1HXXX zJM_6{yG`F67%*-{#G4NkKr_w9RtD7Wq8E@JuOYadehl7_$9#f2lm1?DV~^*vy+i4L zlbso@V=Mnr=uuY1!URH@dc=~OnmpP1x49_cUPd-vdTN-E`a3BfT)FN0(JI`)nz`OZ43qrxr{M#H*tFx9#Mo$j}!E zs-2=1@ANTS?P>#qXp)_q|4O5M+E&^NeO<4L|(R%N0V;A&spn z(9gxO(zT@hsUCf@Kp3Dc*6G&x55}j4>E+w~3pQ@ThP)W$Id||4jg?)m=zo|_DX%Q6 z8>}BldRFU<*$nbXT;w&U&K42ZkKxjB2tySuMA2J+NR>6-GbO_#$;^BZjJwEns?zny zv|UnowpX`56|i_20^FB;y|zH?2t__XFmcog0PC0;!r`=hNk@T$ARBSZNNety0jenL zSvF5&V@`DWP|%)u3U^0)@n6^qT^C*K4HExZUlQx(#(4iF`p16*GUA)wTlCQZOY9g`p6I#wL?^ry)`Sjc=^j9iboZ!L$AO8%XeX zU}UKbbwz5`4!F1R;cVW`57kGpz2s<3&x7E2R7f2oLcGlrths}p9xcnOXu`5O$sG6Z z*UDQvtG0VSE?S*ttGJVwalIFa);gv<3z1v?I7o7Aem%YI*`Ol`O#i{B~9lu?fL!0lhFzS6;>eL z^<&j%FZo*?cT5m$C$xcaZ2I4np(xM8`ox$1{H z^xPYA|B;;x{jh2Ku!l`9Xp1}ouNxg{*xpwwr2ajT-fsZARJ;?`eU?)0u+~x{1S?Ro3tabNBCiWwF(hnV$ zi72>9xp-gsQNW^AF}+KvZya~6ID6&Q+E)L)0C9*wS0g+_XbWU}2iP@Jz`mk&OpLmW zn{|c>xZjs+5NZ#E9Aq$2b2=WF(KXjdP^-c#v_7zs>gGS%X;qo~^uo*sWE>>lYP zP&Qi5+;g04HQ$zRJ<2uD^dajau+bEP&AkE<^;C0yYy0)g#rVxojTmACpkbQ zi#{rkUt~P8WKjUdWL9mvl0Xj=0q5ab52+OU`lAAlU#<l>?e z&*{fgPWX=oDC_c0zyE+7IXWlH-ijvzkLx6C8_C%_OhYtfiA*4Hu`C~n`B||b>8We3 zQFw~XCytL5a|COoQDdew%fViCGKt&DZ^jwLrXU{0$yGs$Phd|`>&_OdGziE7XFC;r z#7PVHe!0$@i{_?dZ@eALmh1ZB9l*MRl=ai9wDPS9#Z#VplVb;ld-l$nYqqZUysPGx zo>2pweX$IBb5}fxwVr@8NT;_8J4)?fM~uwViGzVNw<&8`xFoNYJL&sKgrnfP-Nx3r zVa?H){P(`r-+-+V)EM=HZp%pvTfy@xUqgCo=9^{seJ^9|-n+ z#ubfO5k(sMg{8OMmbW8aQ;o7@>14gSe}&P9m)lX7_R7LB>*A`e9CeZYja=1e1}Li}q_*~R7X;om zuz2`BO6m5jAi)Sv6z1XJPusp~Rq~i6Ct7^R0&$p<7tvP)W$DEmj2gc3QZpv{MYFG# zu2twK)55gflU0S^R$6()k(?B_1Nm&nnmr)Zvx^2>J0s&&Rn;eZy~_bB_s8!FFnLOO zI5PcI-z>K^&09R~&X3<7U{Z#AkspwV$ac=G`bZ5d|C9>aYU6O^B61@Vb{^hrGn><) z&C%-5rbF32*mT|*_O*)G3}6^s9>pY*yU?Mc=XdY^%$O`Z?+7`YD4P7hjZI^=>fcY{ z-Qk*NBMPf-N1&zN5^fehzU_fKpKOa*Rp>PWZydP#J#@F*!+sQ>k+sJ~S0_KpR|*v7 zV`?lxs?NW~uU2#Kz@Ln;K*+tHjAA(zmk!kQhc?W1bigwIHphE5>BUE|ME7R6@4;qT zdJkDnFZ6Gzb@OQ2=H-N_3ySJ%Ox9-Dy6JWlxOSWFDfGI_`*usgyT_+!B&AwZS`u>B z0bCk#KyOpp)qSRtv)>PH6Baq5ilvP93vj}8KqlA$7kFt(%_!^6X82dPCA)~N_nrgn z3lYa{$Q>*7^()x8yPAZ;tz7!*#bVU|Sli3=-RzF4)+}t+j6S7v-l-frg1kSoe1G-A znTX74u1my$Iwo3(epZHS&kG{>7aE)AU{!2EtQ~VSASogCYl}~IJ#Cbw>kND7S?HzM zyx^^0_|BVpxah6lHXuv9W3}7DLH*Rfm{;4>3-6Gfl|Q`yIv)g{++&=UiY@fIXi}L5 zqTO7Ts`7Z*=|;(H1?S1Gnf%saZY+*-^$3D1D7k`7Mx zFz;}n)bV9$h3*0P-eYb(IRlw91t&af4=7brjxE)cOvm%%)dN=Sa`&bsUCK0|ZaZ@C zF-|ExVf|>uEZA(qMc?vi4c4OLE96zQ@*pd@u_uxyn? zU0awlV3KTGcI+$;IU9;SRu;PQYs&9vAWL)%ZGGF$LO^n4yQdU?_bVuNQXz}0{0Qk6 z458rkUGb|QIA-HJ=20wUh5>peLHvCsSV>DSI^fL>wJlk#Dexl_KVYFuGX2yGX*`1f zhEvz?o3N*+nWpx3|CvUYPnF8Uyb~Xcj5Cx~(N=Cp&^@kCk1A>;m_+Y#r=}IvULu6N zz`9)TUGyE4m{5c@0QnB#_=Sav60#)`r}% zlRJ+Ks@^}2VWwPv3C#cM?Sb^Hj}3K&8R<3nQZjVQ+cQ| z85L}$mEJl6S@@JZM?XX&9L9?$1BGe)>Zn7oM{e-ZiKNIzKMebn;@>=1ApF3Ee?BQ5 zkM52ryS;99{sPY|UHaJnHAd_uLCkJ*cDNe%dHk_vn`G?kJjWV0Z1Fy2%sG zvt?mZ*1m*W0Ty~jyX8^?(n>9urpE|#9JMzF?L>6pM$U}L&n7kOc5^}Zj%NrxWYBd+C zj*kf1zc2T^8iJ&fj;!<3ihs_Uu6=iM@3I`;E%?`dA+P|1c7469v%`C?3Vq>r>E^68 z9%#|9CMQq|5&v|oIKO{8t$Op!Lysa09+sw0G|;-;w0+aDoQjZKr6E*0I?p)XpOKMHC6zvPq#gN%v5XyW%cH@1?>#)33th z+eeoa++f2x1S%RS(E-hAoCENoGGahPY)f%x~VD|Kocvp{5yBN~b@LR0(61yQk6 zHST-?4bzAb)$ou6*}`E@zK;f>`Pg?I z^V@=K>!gi`tKZv2m@35tNS?i%s_oxhpP&#q&zE5h4kSS8t0oTbN+)Q=P=>oW$GKU z6cQLcJKd!xY2iL#@Lf3Ml+EzlcE59$Cqcix!i8m#Z8sF#7%+_<{Cwk-X21k88zVaP|$ z;qT`0uUWdH)Lwk4R~GM9)uAI>?AxWyV|??&>B*iNvB=bp3(Hn1{}a=DJSDv(wOs|B zLWk5M)>Nf|`zdyc8f*3?WfUOylt4q;^XR3{nFwex2#DZpdu+<{s<$Z_+@*l>;N;x_ zuk6XFE#qI#I8IrOMsuragu~z+2&tIQalg^;q{oq4yGW9KmXc2jJxwO=IU;>AkYkd| zlE+F-FJgz*K)>R>@~!W0S9(I>HiNN9BU{*+_qHrC2P0i!$|?$>b0@!73<+Vt37S!(322ipmIlAXqL zDxNxb(i76KI(hc=G15YN0kXSRuJqL+l^r6(rjNSx}XAJoj!Zm!I{gd}BMR6?d zO{J47j$(83=i*v8(1Za-&>@r!ZR*&td-xF6j-8wFsd#EBP<$>cRPni`98Y`)SA;8^DQeQl2Ma>4epKK6~&ap zOMVb&s8Gya8wUz)xi$ihbOYP9`v=rr=p1>Q);&@B3RqeqdaG`zRyp40i$gE`>}muS zl@00?fQ}L`tF+ zl@6rqJwi2ss{6%4aQ)5${@knZpU>_z6o$uIXBzI z0r)IciTh}+xzNc5nAc^@)h;CE&K|%c@*`x{f;e(b|JZBX)ekBNGWyMxSh;_O?W0JJ zK9t(Zgzx)eV>x~r^=pJz3Y(J^&%}0@cy~9+s82w_O-I!D8OCWF^=<>z^T#@#dRf!} zONkkaX-UxQbwJ{V-Hl(FZv9?k=B`b+LUg-zeOYZ^aevH2nJ{B$qjmQ%=pQL%nz~rn8`={Bft?SGp=s-z%`z%9NunAx6V5){5@rnghRzUf;G%Lyaxb&@oPv1_Tt@{-X&92eUV_I{hkD6C@ zma4_fB-1cxeky8ix0Q4t(5fHfZMo%a5R+CJs==#XQAh`?g!x0>^4A2zy&3Kix$raauj~&Y;o@0(5`EN+-CUYz!>)-AxrlDNhF*y|QI z4{udvNWa*b0|cSl=gFsbDKNP%GV@HEgCYx0nNG3QA_?chh8qS^BN~jIxr0v{Iv8v) zcLLbzAyI8Q#i{hH`)O%5!H%GPY-kWKG}Sk>g$*<`w84nI3`DgsoIfCHW>hfs*z}MH zyf9KhbSpkGS(00LjUU^>0segBM4n5u_{P`h5tICCCpD^BU9rhAZ+jSFlAc@j&<5W5 zdT7&dUe-HxbV%^(KnV*lF4T^@@ahmo7Na(`VNXDr;dx2yRqehE9plmhXtYjv7(Gc^XBy|2l zWcTcu^2SiIVvrYl>LcS=7L?h9VJ@xDV^%vx&UBkyV-m)nv)^`vO*Y3&Vi~HD=&;DQ zb>-})k&Ft?VB;{Gp-3P2!a#ON!>zn-Tc9UbTIKvoV?UoCa;)c6Tpj*6Gd$?UycLbn z9Gz*JZf@fAe+IO~!&Ws9L7HWl88nxhPnZMmr9%t**uN5<<6?$P7`v6cx`4NA@#{Cy za_f0BW8Mt)NVY4Za?Bn)I;q$2ga~G}SC@NC+%+zQ;0&rQ2sBaV7ht?`5D9A zvFR02{Nj^Xda0rAnx^!_@}`y2A$)isMp%q4ymUG6$7qfDv8xkFpFfHnK7S3k`tc*< z8C~?K;aBXLW^*{H`|25kPn(&|Tp{C_JCfKieP6W!cq>GuIj2gsKJ0vqbtF5of-}0H zfwNf9pzwt$d{a9At#Gb6%#Nc9^4T4-pJ0vn(0)njd^J`6W2w2ZR&S~bhoV*qvw`W? zvB3C+#;jR6qiyS7 UkDm_$lpb{Qn8VTXBR)6(2fX{54FCWD literal 0 HcmV?d00001 diff --git a/debug.txt.txt b/debug.txt.txt new file mode 100644 index 0000000..d60c3ee --- /dev/null +++ b/debug.txt.txt @@ -0,0 +1,16 @@ + +bcCoord=0.007811,0.009287,0.982902 +texCoord[0]=0.000100,0.999900 +texCoord[1]=0.999900,0.999900 +texCoord[2]=0.999900,0.000100 +weighted texCoord=0.992090,0.017195 +rescaled coord=535.728760,9.285239 +color=0.905882,0.905882,0.905882 + +bcCoord=0.006082,0.009879,0.984039 +texCoord[0]=0.000100,0.999900 +texCoord[1]=0.999900,0.999900 +texCoord[2]=0.999900,0.000100 +weighted texCoord=0.993819,0.016058 +rescaled coord=536.662292,8.671115 +color=0.000000,0.000000,0.000000 diff --git a/duck2.PNG b/duck2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..8576cae4317539ec32ed96de6cc0a9b8b5930421 GIT binary patch literal 62717 zcmeEu_dAG zw6&?tW7aG&-n7r-dB5+U@E*taha8Uk&ONT{yw2-$e$LN%Mx3#s_F3kO%%@JBI;*Rr zX?p6^85!zFi;V%kSq|*zsK-p6I&hy; zr_Qzh{+#agc!xN3YAab+Q~i#=_3|r*YS7(pe#8lIY#bXMou+ZJ*lT;JCR$9Lof{>f z$8N%{-VBxy7Tw1+f zw~`ok#PIuT>NPc1)su5M75u7e^)q4xcu=@qyL;WrxV7Kx_R8&h?l zcPc6!Bx7NaoaQn9@Z=jh&gUON;Vp=Sn^Oxru>I$M9xL0SFUWuJLqVJ+g*G}nP1?pc z<>Wl5X@AA0kTzQ0rg7it-%((73YkdvD*FBmn%6-j$%V$}XI1EbZ|}MmUNe)yfAOEo zNtzG?+s43^#D9hW2k$KpG>&Ea|Gl?zDe?FR>t5%beB)1*Ag>-CUV`LqN9wvBLaY zw9(_7f6Ss!(^Po;z2A_ z9e;I%DAj~JthMe81kJIeg;muW{WB1e(~#5mLe}2KKWJ)d{^5UlU|uHh+;qB#Oq%s^ z3Sf_-daP^&3g7E^`WNNepEo;k`u8*OyEbhf=6tfLpNgiV@0_k?X;lcGWbTSi56n6C z3y9j1f1GLE2?;A4jNX+|`e#UCl(%vlImZWY4-a@6zpbth`wTlbO=_$dYKNAE^msXc zs%tnz?(nD{2T;giqma-0(n^w&9O=^5M`M4h+-e-+`$XPZF{|oX_Hm^Yd0PdRuJkB- zyJmh!berg`mChMfd24ge?bfKucXCAtnQkR~_Qq7RPt3?@biU7Mlk(rh)TVB^;J3lu zTD%QA{f*AG(bGMS`@Vrax0>K^)nCCYDt}gHv?ss$u*0T;CuFnm&&+&+&c*N_kMCf~ z!$ApURx6vr4&+I~rS`J{aKXLajrHjXxtrgEhF_HQ?oVrxC0{+SJbrU@A;*XkyLb?Hq3Hz)kBYlg{b*Y4BglKW2<78M60(?#w!eRw!?2%#%!PrD~^wzJ*xtr1lS6 zapU>?R~KsY`Y9~u8P_KG4pRqL@jG89Z?tZ=Pdtqy8$PfZ3XPnqt~WZpo26prP?j@t zzNcX0O3ydn%M|5O*Tm4nqwS@1-rYm3fv~?{QDEFgk5ttKvJ$^fz&n>TC4^&32 z->dCky?1OI-tzP2>S*>Edo^!6!$0$z?wN!oXNtS8+Jq@IIZe!l)vF4=xVy){_IAh2 z+5aEk2-}^P+n8@UQf4A8_3Z1{b!Qs6RNdTvykhR5kUO^Xs&k8GldXDoZE?GDO|g(C zUD{^vkf1^xTtLgtiaI}_giXqg%~T+mbZ={4$iqEnKcauwh^5gQ&q{H)SBYs=rx&D%Gm*)wazi^-@cqag5|EB z*dp%O(`~cFFFjF8xaED0c}}`{y1#Y*&R6XVcvh1x)C#)Eq@-`knlFRW;egK zxRw6IphtDxBZ(eWw-y)tVs@`2(a!N7|I+5f*iIO&O|X#emDJkpt4J#-ceO3HZY$@Q z{GcT7q{F5@<8_>1gs>Lf;>>}=GN~UPa#oL8R48j*y8z|1 z#T>wH)#Uz$a_QCGFTdev&QFAHRlXa}HzztU*Bml)xnechCGj~=X)!#U6GThv%}Mu`uq{-rDw=AM?K(to((pgp@iUCD1XaYcScP3NN4v9)^| zInhCX#NGes`R+bRN;KqZspz|T-xZ&7sUF`-inzF{OEwAW~jGQ-aCdz(Xv zmZhPi4;_O()zP^x!m_F(?T`V|eUHAs-Bta*y9^RZ0CYNrR7vJ6?wFaDT*_{}Nkx5m zkArW>$Y$e_wH&uqLDwHnh;k_3v?%Fo`_HTt)ON0a8@s+IYxlz1n zCSeRq{qvO`Hb*~O_CqO?^Ch~cH-D`-TiD#{Occ`Os7M>pz?dSsQ7HaxIM$%%Ty})LldUI?#Q_x=PfCGFA=pFIb7-6t*Vm{P?dWuAJVi~ z&q(NhdT}{y=A&@yCU3o}(dRp%1MoHHUsc1-t^>)BVW-1~Lp!f{6mIesgz~@q9keef zX(IxD{YCRPRzRldXUC=aKUfeU<2AZ**+O3Utnb|1WvVGAZ>7z%(`;^g92Ym-DFZKl zKfL4Zy(nEFMoO?M>pD?4?R7x#&w|A>L-|pr-Vlx*AJ{TA>T(T&9T=FO}?bmYP zhOb!;hja4n!QI0Z=jl&0(_2+fka;6=FCNE?q%CPD+zKW)PRS{ft+Xqbez|e-^?azz zS)5m%{@J%QSwr?yZEZ4Wq8FNYOUT-RQ$|>Gung<%8!0S5H+QHJs{T;x{@)G1qQAGUU-l2%8o5;jC^@Fj`KDqK`us4iVxqoj z@(%_EFEKQ|N>V-8!&Dxwsg6`0-lOD%9T}7!=MEejtR3&JHNE}P>Apvq7->3~C9m)w zZ*`)>_lP;iXxh0)RII8cw+)cdjBV0~I_=n%`OsdvDzi1!(%034b7yk~oL@ZNU$JkR zov{AvbwIUybqG^uJo!oRDmu-)XK7*QN64lhyiGB|olMBNwRASXO3~)SrO<(jQ2+X( z-NX6kH|OCiZzG!wUft{b5r{aaQab8nNGU#iY?vdSz%$VP4;Ieht6pW!PR`3gwZdNq z8$Q9t?5ofubb5*YyexG*F3oTtxJlf(G?iYJBkNt9x1HT|c3?AmrC+7-!Kz36KSr?J zY@O)F+j%HKy6`s>ZvH*EgU>U1I3Z&Zwz0_XDoxojqOv8Hcxj!>2`=Q4qwYVPkXpvmc@VDI|lgoo7UYJ^k;AKm3uDIdPP<6P~sf%kIawBeM3W!#g| z^-R{%GYw5Y2Ug@A8g@9Aw5py@I%~&;u>QkLYWa^_z&K0l(wzC$1o#s~s~UC>b{^du z`+D>vEe!tuu*#*dgFk_mx}9KBbw~3n4<>v<3AA9bn|z(y3dn!3uqtdr^dDx4q%vX_ zlF{}FO~iUHKe)lFWn}!nfP#)HUE1gl8}+|jP4(z%q!>hHH#K3^UqOwT;3eWHvELh zU%oDS`oC9A{qL*(*MPsBOaFh};(zzmZ%6oFwD@1R{U@aS{~AP`q^eu5Wb7myd&CQ` zj#t3O^IX5mZr#&XXl%Jo$nP z|Yk(loTQ2ulK<W-S28-k#w7D09L(;16xDmEZStcVZa&OL)zssj`Dt&gJAb z5k3e5g56cU1{q7!s73M_B>voEcJ6QQV|8=!RRJ-H|M zaP;1>X8Ef-f-cVM26bpmCqr|8nm$l)K|gbZjjhTJS<_JTFWVY*H!hhm=@8+$c(4{) zwcj8|l~*!OMz%uZQzwJ;ko3HfazIXyiN#hag(9*d(_>LA2$01J(4bDSc(k0Jco6#XZtbp|>_!c6nC#kK zE-)j)WGH?E?ml%8RMQ2eJ{~DdU5^JRE>Y86{XtF|2ySI1%6#O+qETp&C>#WpKqX(7 zV+(uOd7mxwK1PYgTymVJ)LC$c#jDuV^Jb~38?@MTj-i|h>dB0a%gz|la8ep7ke#bM z@m!xw&j(#FP7DeYU&cPDL3`9t7He&a(~Ptb5J=>9skz@dTo%}=*m5y-U{=w@Jx7I~ zBB9fX@4Q4fJ8w?tzSh!(hG*ixdtP}%0&6tj*j4h_NQep2BICEo_z(CcX^*dJQ8$BsZNcUR~Fq@@8ceSfZfZN=fawxJ}yJgm<-Vo-Ze zaV>M2*6Sc+6p8TCBn-3CF%)s=I??uBz+!Pbqeg9VS z8Vj&puNfqJPBfS2a=&ITGIfji#fOL&^hr_k#0`3$#rNjpK4xK0m)wm#t7&Awj?HA} zLx|3Z==E_1zSQ4Pq>U-I7?mT?E2~oRDD=cxupXpDj!t|vyFem3c2?~cL=tgPkeHl* zyX6)DyB%;p)*FP(%rMyn$scjctWORJj#~qf+?c*r-$bw>-hlL|Re5Sn$8c2D z*^as#FaBGO@X04I4(x-z(mhU|Xk|lnT!dqU1B4z)x{bPmy&zT~jN?McP@{u|;7B+~ z;B0}VTeWqI!>w$HZC>Zg#&I!>oa`^lmm7l(?6W@8N*X0lHv-r&`Lfuo2+KLB99aDY zq~b{fEwS3~r(z_-m$(+%2=*NOg67T(-}?EF;2LKy=~q$z&pyq#HRf_hYmUAx3dzEC zJ=rU69D}b!0b|`@wBuiX8!9}AfD=m>eJA<{98k|uQS6Mg(?yAE{`b4M6mOi%z8O-( zRLasvncTq+PB89Scpad!b4Mcww<3fDgSaM2(OK+ScM@)p`nWayBrrgwq!xAWzUyapjhJ|D)eOj`seP&$>jM`b$F_fCLy&RhqsM49O%W|M`e2;od%vdjms`a6xZO^9jH$xds#BY_4f>@|)*9bc@6pGNG z*WU6ri#3o;G2@)#!e)W4)mEy<8rB=W5vt~4Wa*q9tsH+xIk%h`gje1vBXp!c_>VJW zV@H4~d6wYcOL)k2EoIly{<@b*uRi-L>gwIVMrTxL`U&ec8=JG!w*f)Z;s$l+#eRvL zk{+5X`Zy0*uW*M`C^rJaS{?EooVD^rbDWdkgXQB6tf216KO#pFExMmEY07)G`VZLl zAK=*raO4>s!#A2A_-E8$M;8E>E9WhLxs%7=xI7&!zV&pKXE%)!5_9Wo&Lt`woIQyz z0ru`O`U&2$(He#10#dbrG*C*YK~iA^+I#u*HSBY*J}4>&aT^4{+q1u6-%#rvdl56} zH=VE&VNmElr|+it$)ILgd4L=ZFx^Gfuow8;?H5{`LU8AF*00RO!nmg+27BuhCWq79l zSZTkq?Sr1f0J7Wg;nT;%huQrNT6jF#t0_Rsl}sg}r05gCuxyoHx()|K)b}oZ4hE8D zp`|Rd_9hZqa=&DzO)+s_h%M4bu`KF7i2Lkmxn-Kh<3zm+six-8%TNd^=}OhY;Ns%> zN-!qEO=C~xd%C`qb zkJkJi#nG`}Oq3Wit~ZhB03nmS;tCJ&)dG^u)Um>7dkZQw!*rQ@&!f0{wVQ1S%-+wa zNC)Hq@{xyJ|;P4fN2tGt#{GKgD zU4E_;m#ncjEO7Yp&ggqoZcX6EnPXmzfnutACrsmETNe2po9dMXq>9K2cF#0* zMfCvA3v>fXv#}%{@pC|)Se+?=6 zTYV`-Oh!3hICR~&#xw?}6ww0_j&7d2Xpu*#T2?nyeG;krc0ReU()y!PDO@KvRTtXMxX1xxk zn-OO2=>n0?20J16BMwF49imQc<60HY&!0y!nqXe%vi=;Kx^<3Dw4o>RlrSKE<;(|u zjyK?I&7Wo!W13MfCqviwdmA!$Xu62IQf|X*FRrTeRpj_Pi^^Wx5_&c24DtG7T6uP_b84wh+xA(AHNt_w;s z*P1m;F?I;OFiA~?N}?yzW-T2|TsEZ}i06xsG5(fF(%#S829#~K>nmLz z%RN{KWcBzArbN|@n#=vSMHRev>%PqjXKW{>rH@2SCN28v=DlbKp-rSjyy7NN{l@jT zJEAr~5i{&*=*IzpqEbRwj2*FvJk5dmd|m+5ELr_c{(dlbZYtqv z@6Xl23fR~um$Yi1{_(}*Z&lYj^lzNt4!vFieqgxwqRT!{!m2-ww(dm;V07Qg08KE3zLbg z1LxO>kAq@zcl0o&o*VVWIt@>%UfO1xnZ+xE!S= z0mT`aM;ThIP05R#W8REQYl68&E1kS@HUI6P8SC9U>=r3JS{JX16tV``MV7n3dE#K` z7qXWj-FroM+@`-k%I$1e9QAcrG+ivv%Bg*vpE=b77}b(f+2g?%89UXJIsErF-`Wax z1mun~v^74by4-SGK-7;d;)Vy-8WkV%b*FRw`L82HtX^FFN?+qyRwr&>SAn?pKg%?z$FsOsU$f?o{4)o=tdK?+~<+xjKBbiYq+qqXO96nYthY z^VRXd1j4+lwYnwLVlLVdB#Ur#rM3v^i=3=jxeU{!u{G~wB(D5gp9O};=_^|RV9~d0 z);=T$#&-_j1>`lHO1`u~8OP|w4a)RG#qVJ4VvBDxlYBh0BM!hEKpxinc4K+@)gDa)pByhad2_Q!ev_EO`yV_Z?SY7xozGd>{AGv-0e>x9hLQSYnE3_ zt_%SXs7IvhZx{LFX2wzH9X`WWXSw+5Tq*Cgl_ealqRFJc*lJ)wE23*+wP4oWC_XXz z0ABZ7@}q}_$%}P<5J;(jETi$`j8X6HR^kEk;DnvoSs~o2l!w+NMA%@hT*5cyg zc3+Ese53Rv4Bk-LCA=Q=Nai;o7)mRsV^9L)yJ7sstB)=oyjqc3_W&lGh zjY^~=ES&66daLKB;?OFy;zlkxzuH92a{v}$V}%WSn+B8`v&@~dl&9p=1<{+3tEy8G z{$C>z*0wgErm6Z;;tB9s5XO0C9HVA&_1r=)fzn%bZS_*Ky?7I;3mSqczIK}L8#@c| z)mvxxYV^UnEJGKlAIyCh-U2fOJJdqZR#YZ&SvNTj3@CVAKNkgsIi(ma%eOCCgDlSJ zgk7~3-Ei(dqHinL`?BaL+GDT<&#p)M&fX{xNTvMsWlhz3ep^O~M>BdU`T!VVIV~nU zt>S5ff<fRqZomChzzocmAX!yDY z%NE^1Dfkp(0CktdP$kQAC+YOv=pi1bLFbC{g@CxE4trBQy$<`x@+4~>oK&X1G|#1Y zm;~1)rw8%b7}NU%FicvKQSIE3ka0{#K1iLTl+AjyBE}KVi@t15jrZpkchi_SE+)MK z%TLq3wPeT&8&<*49X^ep{bAv9sevzBBRKoer=dEOx-yax`0Lu2Yj_xi0gzSxU7z>e zd|#-oh?U=*=`j}eabE|UD3wnaGxs=zG=n>q-?GZl)Me zTkst&3XzD_8JQ<{hH5xfJ6UR%xS*3)a$sHTx`bbNj2C}RX{LLHUfurR@9*UR)NC;i z+-r7@kJgTdOT(%&KO7HgD3&|koV_(xbX4;rGm2iUV3ASAejj;6I}P(??0V4)z35rTtJ{V^{K7W0ej@ zM}(cx>z5-3t`BN=W#-=0GVrGE8amM&pRm=_Bkd3_$~zPHd-0@e*e=f2 z>n}|qB|+%qq$qWWhV6}k5NnUI+2Nq^&FpXU^!VoDnz@XX4Wjgfd*$R|a&uPb9nmt@ zU!G*Wx#vkO9o>_h;HO4iPn>?qe^>rBZcsPXP-s!)fBd?jFpNH3!^vNY3U&W!#xE)2 zzcg$Yf+p|zWb6!BKX$DsH?{tCmoI=yle{C#?Y-8}1c^vu$ zC|nxEEOB^WGjzh+Hs}phyDcPwS@V)icC`7q8VnwldJRyU&~Vh|;7`=n;QN$k3`(yL z*B@l;kQ|;!`||U@b)G*4al^(7h}C71J|9WC))A<521n=}^O{5uCDfpccSZM)Po@ z^HiD!JD2xJ!ccy?a8IPf4asTKcos+d+m%s2GQjHMR60HbKBFE8m`TJln!jh#lHprfv_r(>pMf&}sD#K8$vvplmC=iDriV4Cu5SV>mA}v+2h7d%pFO{=WT<%KipbO0v?^hxn!X z86V~LBl}~Zn%6nuf>CsYTs~E?zT6ikl5ap{2bA1{Tbsx06F$$FLS~XE>cKWrV<~v|efXGzcb6*i1|MrT3%<^0ve5)}3(G39^gc)D* z>?}v1c~WZUQb5Q?e4q;dXvL+6d!R1)CH4$o&@@|Go02}KMiE?GmPGApJV&i-$Ma) zM(gPTFTvS@j}LbJ$-e4;3tmdmEJS0$vX+~7^t3dN$IWP34>hzn?&POB+gS>Qc3oNX z@7&=?^w$hL%;l=3w0%^U{)R(~T`+}Ip>*MA18Tz390MXW>AZ%XIKG;eFsQ>~j8cL< z(r?dsCG%FoIP=IReiuSycWWLT9#Bgeswc6AFBG1*4Es9>-r&MdiFJ4KopGENMPgpw zrlK=|_;Q~*ZMoV+Dk`@LU)rfrVx)R9pgoTbzHrWZ-Gm zlR+_L#`dcGlPnVCdwZZHWo6@0>>*w2^meitS0*Y0>aG>*JL~tPMWFfF;}ba-x46p1kH zJ?F^9L^My%du+afiDiXuR;1Q82`Loi>yw}Auu?WW2_5=U|6`8Mg9xXQw@;9^sgucA zyCyUbp(A=D87EbPD8~5yNsjPvOGXUk2%~^_z}QRyzlbH#wJ5fPVc|?BjJgU;%#&iX zGc)pjS%Tx6B9e5(q2|h9cb#Dm6)kCns6kDUx7-=lt`P?zg-Hc(!>mf)H-DN`^y-G% z3tsAXMm%XSyAW*(=>qM>P@a(O;oKNmxzdhuX!Catkk7lo3O7QG(Lfbr8d-F5 zP52SdzV$-DkZn|9$X_5wVvOEj+awxJIc@+>*2uDvLK^1e&p5ni@zyB_Q(4CV%Vy0oJyMaopQ1BSLLK+11)R>FJLcl z6qryYYO-d_p0Rl$6ATl}&ds>zzc!gyzZRQd_FU*{+kX8DV|!y@i+Dn&W)UjG?t39m zMm?DBZSX7J#+=h790T!79osNrN4Why4$`tcZ!Lfx6+(RE=3SNF&5460jSg?hozuhL zRH4{!)yB+f9R)-!ciksGQIe>{-3uCx_Ll`lR zOL{Ou1?sM`8sC&D*9A~6IyLvT8e^9WwtqtD$Gbx1Jeno#-paSBGlv*cxs*Xxx$C;F z8&8>P;z-?|3J;*6)qa+(AlcdyJTRFzFZ;GQ;EX8h3QKrgjqQS$eKvn2rY78#OupHp zQo?06gW>xtb$c%(okXAUizD%qu)q>5@z8@Xy!dTE8q|^ik=?(a zTruOuQefPlPiMyw;wMa07Y8TFE(+i7m*SgfS+N zz#;xP=#SCIsGVr@yG#R)@_R6Ob~U zKF_|E2#HrGYQEXId=|cBH+JasMn9VicQf&8ZAKP}2`5dOhi>8N{5?}?&=$q?lB`AdReppR7E;RX6WqHt^ET1I}@Tv>$@tK^2qD(z=x|hV-y}EWvlp4@RauBs`j)> z6Ha@AMJPcw(jEP>fJ8i(w~>5t`}}gDHIH7$g0FbSR-Ss(nhyYBsTKHu;0D7`D`o5` zZR4DXut;GR_2g8jMRGBsh;dR)v!@H{-SePsz(u_0?D&l{?Ug@kY{e8C1`#gt#oaPy zT#gSz3PoVuS+Sg-_-Ms2bU-!nTX{>o4cA*6c@do9x%G)|fFZg3=gDfT*Hcp5tA3)J zi_1or33&g6^jUt6sUdY+)J(=}5^ai6atKvNVj?~Ta6`lqcTrpjI`*_z?LM|2Op?O! zco|m!=My#~gvfTu=5%cn>a%;)&fevi zcT`;ri-k>0o1)`W9qkb;(EHRWGmrbcHtL;Vfng$1(WqDs^`vLPpcjn9#QKKmJPkv) z;l!8WO~Uaj4yxsArcXNbUNYt`%3Y883IY=CA;NQyTAejLeYfF%18O&*5>iW_UebSI(TGF?kAznGa2@~#Hrl1p(LhQbl zCI1UddFd!Ee+32n-E;8yX zI`W6Ukj;w<(uUddB@9Sw;A0xE)gx-2ladrQsp3U81z=YlGkU!f-Jj9ZyS+xTmxuJ_ zf$G^-E^awX2tAl{rAT@Y%EIn&^zfW|y)Qq`nM!AaNb&MpRw^AJ9> zbGFgKhwggQ*2T@Mn08t{n9rV67J$UEojLurXXJlaVA%1v)P=u50JY5Wl7db!k=k1B zt{aa*@r2$M-Q-L$>-e3J^EQog9c)|;&G9ucR_dFNsIIT1Z0DS+btABO#d*K`t0ESU zi!2jhOu7po=rL+ZgVr*pQat;(b1rVIe%YO^T>QAVIjf@KsaGCX+^zH5#c$>Uv@cq` z2HB(lTUm{gd9BDO-V%jAoi4uFpwY}E2u_KgHG-h5Z7U``YJWyqG|_$7mx{a$vhf3~ za9&M+m@@2^+jnJcB_pK=k3JMTOR=!N+#^aCgfMA3ib)^58s~8$Yu`-Yb^Lg@kkBc{ zpka&R%y--ci?0VW?Ts(pSW)4W!UV-Be@bv;oocm|`Ls#ZCFoD~{SJ`$G~}#N$mql0 z6nRTUDU4FW8f!Bpv>8!<`96X8VxwN_c`=MM%XxMmDCJmWAug5l7@)_}vL9O^0H%=@ zyDf|mrV@;J)H%>hux{5iL-%2$w5+}g9&Y3TwKB;=VOkUyek*YeUJ+g3T+mC3uI2-( zUWW!k?b$U-t`EFg%E8IhiXz(CyX^n~8jVse0Qyz-I1{7L*QDEUM>^f;ncdaYq8M#222UyrO{MsCQxa2}jd$9O@#tr_k6C6N zbeQ^}g;B*UZz9U-)i!WBJ$9Opsu!-k*B5T{9IZjj*=& z*3-HO>)sDQm!qh}rO46^<(s?q2ID18Y-6nGx)@oZW^n(_WmfT65(6L!AHVe`nJy2F zB7deRs>siLO&}-cj^5Zw+PSx^N=s$bR7=1#T$7)ijVwfG01pLdUN4z&&iXW*TC7cV zbhR{VD_e{CvaKzcqzj^NnaTD##=i#UkJ@MnPLHqEXxyXMQs5;sVN-pD*{(_r#4#UA zePQ#7xiy;G(3Jmt`+ezXs<3;FooFX3joKmrkd7}C5I@}@rTeggFWon1nV1JsHnI%; z>o|%&l+ej*2PSmxpqiJ31BOJ2#22{w`eiT9^3JDa31HI2;raE62w5lGzs}(#>l|12 zl~luNC|7f(qIk6`f|?<)t)=wKsmpvLDIs>Dz>H%KUI-Y^+$zL?e(}MSvHP#xN5h{m zi*upsw)kevGhyN~=%^$(a1;7H%8ht>su?UDv+ye>{>)Z()4-7=Rb)PC;kn?m`YE4= zr2Vu-n5xK*Bmz?wgY4R5XJ(u2E6RCAYTUkSTbp)SB>CoAy50ZoC??hUGM*?iV(N7N z%{6eOFqPqAblW+ESXJ#@?V1NU4>Tm4@q3+C)WbkvBvN{o;z4i^4Ca zR~7Z~H4kqr*p5Xf|25o1N0n3l?V%#s_cWZ>bbt3OahWAt{CDhFvAVV*hn6bPba^*3 zy2-hboUy$r=75JuE=AO@zfhfmGMRn2Q%qG9)c9uYz8FDY^M_p3y$_<%fQv^7I~s$| z3z>R5^@kSxnELp)rS}f^&(P}bdje}Qhv$SvBcqplj2}W>p-#W73wqJ$=d5j?#N^~P zutjmKvk1#2m$Qd8JR;F|w4nVD5e$Ap1lcM!tULj4FU7N;hqA&+B&OVyVQjk@2Zx6} zaNc&`(3?wyADdXw(}x4km@%_%K)WnBc|WYt72>I-$yr*=R#X0ltS+Yk1s$8@6;O~r z`z?86K=1y!5#x#5Wr!<~JCrJ0Bo_Q1Sil|IOQgeb0yybwtNm+gWf}X{xO#ScbbUUq zoYw`MvCZ(iZj$~C5=WE`xKj?b+(*LB)iQl%A~5x8+}DCgo_C?f&R9M1t3WDd+C;JG z&p%pkVczo)8krAiQ-O5>;tddwpe4~zIZ}^)p5V;}5|V@J0t5oV6sN+Ha%n$FKl-Dg zBchZ_2gier2N+tFMK`sMxmv}|^t7TARK%lo3YFX*chMHuUysY3h|)C$6lQjWfkYnP zL!*F_Nde-pE-~N>R#q;H5*z9n86+sW*;qwuQ)P%}-wIz_f7GQI#zdS{>=e4uw<%$< zQ8nB|%~@yubBA*+!n0~yji`{gKH2CVW!v4+3h4kloiUI!v#Zc1^!26geLRe`lpJW~ zopL0z1U)t8Y{_l0TVT&zPec-9E5xcx^;oEF365eCz^gz&LAoU~|HauQ4V6(Zxcc7i z(Z_ZbhhyN)0&2g^a}sN0p@^KUjGBz#4UMEOh}?%9t;jZX0m4xu3}Hvz0vrWMB!w6v z!lFUuBA*_*8Tba@`-O#z+IJlpU}xUbD!~T7+xPQf96gPO0-TdKj-^$&|D7s#T5hup z4fS{>hn0lkOivHbnM~o}y|`&ppWU;`WQCc1$(bgvdUrx&-ha8nAP9-6_uFigWnuf5 zIDqHCO>XkH6h9WrIVd)j$ssmi=Zm%aRW>$imB_?v0Rh`z#T-KNLRWo(YIA9!p+6J7 zW%aPp%2MLff?7C9=0WGHl0arh^8%jp_&yT?-f{lgihPHsLe{Np?*}_(tMYM1D%Ltw z^0fF-?hUzz8^Q%O(=#CSv1&RM7VA?>>zCrF6;6n*7HbQLh075!n~y2N9zQF=Hi3m5 zEFR-z(3c^dEQe-DJ*^@Oq@Fph@3~^QT^XZZmnqk=DJRyR8~1fHxuAeM{oCq5#Us_% zT@SJ59YRrv`dD& zzik+peYEE zNO~+F1q&ePb7G-Ru7X@=Xar=13J|w1(6@lhqWude(VGtuMc6Qze2CBSy5%}@y;$b{ z6;6%4$qUK!7q^pmA+nAN04{4&Xk|9yOcGqZ?=nqmmh@JOz*S+O%vMM7D>)e>35X0( z=GvMz6&1TMNf?6;${)M$|MZa;(K$Q89RS5-wO-&V^!@u;*6SU^MVzL%UxqMkd||F(n4V;gWe+bfe@gaOGyS8 zGL3^2;00upqI9W~W;7S4!SFXibwp)YbM=p@zJOG` zKo!qtd0!DnK+>YhR^&p^65^--m5)0ImmEaW{xd{+bFxVRuT}gwPlQ>t{@j2cjX4z} zS2kfvO?V?>y^giLJI_qiv+8AE@yx9}OXTZ}AA!^^4mX&%B<%qz|F$4|pD95Ps|$$N z<3w#{>^wMAvKJX!P<=ys+LwLFwmLCmhBeAbOfJMvB&-w#Xq4LmV8M_A5*m(G_#GOk zet@uh;=xW@h*DSK_>#^Q9dubJImuUu(($ob=Lv&S)m6Ef0K4c=`q0;+bJ)x$c|)>q z*+XO>!64>oo&s`smL;k^fM=dJ_cCYz0GwP~oI(#*-!jaVvylM2D~Tp}UKMPBjo1~3 zhX}1pFL2b5Kc<+ot4lB%Da_o$?JQHRL2bKkF8%$(%#Z#WYcx%7xMKUNjdp~i^_?1d z2rWXvM9g{XNPy$U;J^jBlzB2E)1l7xo>&qh7a%IPNSQ6x z$LkaDGj955OcZHLFvYPDlN#5DTZoH`K7z1lh{GkQ4uV`2ho|2c2MAJzdHl!>WF|7p zX6tg1v#3Z7C^M$5ceJS`uMWxL=qSs>O0(I^0JB`ZB`kwZ0?M*ss%cHksdYspbqmot zona!0aPmeQ6|O}M?O@ZB1O9YJ$m+FI+x?`R7qij_aXX__!<-Z(F8E|O+U>F^c2o54 zcV$VJ4%S^#NyFtn92P|t6pK;Kn$1HqA%{v6+~j<@PfMijPV&{AdhLM&CdMXoeIBSF^Hnk{DUx!+hG1fDuwjA(|iLUZYVKep;(=VC^{az32HMW)Y@?DK6%P-EEe&}d7Ss7C$&)34FBUNysgI7 z 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