/* ========================================================================================== Cg Acceleration Research Edgar Velazquez-Armendariz (edgar [at] graphics [dot] cornell [dot] edu) ------------------------------------------------------------------------------------------ EdgeSilh.cg Calculates which edges are part of the object silhouette ========================================================================================== */ // # 25 instructions, 3 R-regs, 2 H-regs half3 main(half2 uv : WPOS, uniform float3 eye, uniform float crease, // Index of the first crease edge uniform float border, // Index of the first border edge uniform float totalCount, // Total number of edges to be tested uniform float texLen, // Len of the texture uniform samplerRECT sV0, //uniform samplerRECT sV1, uniform samplerRECT sN0, uniform samplerRECT sN1) : COLOR { // For each edge, recovers its vertex and normals from floating point textures float3 v0 = texRECT(sV0, uv).rgb; //float3 v1 = texRECT(sV1, uv).rgb; float3 n0 = texRECT(sN0, uv).rgb; float3 n1 = texRECT(sN1, uv).rgb; // Calculate the index of the current fragment given its position. // The values of WPOS are {0.5, 1.5, 2.5, ...}, so this computes // a linearization of the position half2 uvAux = uv - half2(0.5, 0.5); float index = (uvAux.x + uvAux.y*texLen); // The result color to be written half3 res = half3(0, 0, 0); // Calculates the vector from the eye to V0 float3 p = eye - v0; // I will only calculate the appropiate edges if (index < totalCount) { float2 dot01; // x-dot0, y-dot1 dot01.x = dot(p, n0); dot01.y = dot(p, n1); const float2 sign01 = sign(dot01); // Regular and Crease edges require dot1 calculation if (index < border) { res = ((index < crease) ? (sign01.x != sign01.y) : // Regular edge test (sign01.x > 0 || sign01.y > 0)).rrr; // Crease edge test } else { res = (sign01.x > 0).rrr; // Border edge test } } // Finally, return the color return res; }