Merge pull request #591 from takahito-tejima/dev

Fix gregory patch shader: wrong tangents on corner corners
This commit is contained in:
David G Yu 2015-06-02 18:55:21 -07:00
commit 43cc693c7d
2 changed files with 58 additions and 16 deletions

View File

@ -1176,17 +1176,38 @@ OsdEvalPatchGregory(ivec3 patchParam, vec2 UV, vec3 cv[20],
float u = UV.x, v = UV.y; float u = UV.x, v = UV.y;
float U = 1-u, V = 1-v; float U = 1-u, V = 1-v;
float d11 = u+v; if(u+v==0.0f) d11 = 1.0f; //(0,1) (1,1)
float d12 = U+v; if(U+v==0.0f) d12 = 1.0f; // P3 e3- e2+ E2
float d21 = u+V; if(u+V==0.0f) d21 = 1.0f; // 15------17-------11-------10
float d22 = U+V; if(U+V==0.0f) d22 = 1.0f; // | | | |
// | | | |
// | | f3- | f2+ |
// | 19 13 |
// e3+ 16-----18 14-----12 e2-
// | f3+ f2- |
// | |
// | |
// | f0- f1+ |
// e0- 2------4 8------6 e1+
// | 3 f0+ 9 |
// | | | f1- |
// | | | |
// | | | |
// 0--------1--------7--------5
// P0 e0+ e1- E1
//(0,0) (1,0)
float d11 = u+v;
float d12 = U+v;
float d21 = u+V;
float d22 = U+V;
vec3 q[16]; vec3 q[16];
q[ 5] = (u*cv[3] + v*cv[4])/d11; q[ 5] = (d11 == 0.0) ? cv[3] : (u*cv[3] + v*cv[4])/d11;
q[ 6] = (U*cv[9] + v*cv[8])/d12; q[ 6] = (d12 == 0.0) ? cv[8] : (U*cv[9] + v*cv[8])/d12;
q[ 9] = (u*cv[19] + V*cv[18])/d21; q[ 9] = (d21 == 0.0) ? cv[18] : (u*cv[19] + V*cv[18])/d21;
q[10] = (U*cv[13] + V*cv[14])/d22; q[10] = (d22 == 0.0) ? cv[13] : (U*cv[13] + V*cv[14])/d22;
q[ 0] = cv[0]; q[ 0] = cv[0];
q[ 1] = cv[1]; q[ 1] = cv[1];

View File

@ -1052,17 +1052,38 @@ OsdEvalPatchGregory(int3 patchParam, float2 UV, float3 cv[20],
float u = UV.x, v = UV.y; float u = UV.x, v = UV.y;
float U = 1-u, V = 1-v; float U = 1-u, V = 1-v;
float d11 = u+v; if(u+v==0.0f) d11 = 1.0f; //(0,1) (1,1)
float d12 = U+v; if(U+v==0.0f) d12 = 1.0f; // P3 e3- e2+ E2
float d21 = u+V; if(u+V==0.0f) d21 = 1.0f; // 15------17-------11-------10
float d22 = U+V; if(U+V==0.0f) d22 = 1.0f; // | | | |
// | | | |
// | | f3- | f2+ |
// | 19 13 |
// e3+ 16-----18 14-----12 e2-
// | f3+ f2- |
// | |
// | |
// | f0- f1+ |
// e0- 2------4 8------6 e1+
// | 3 f0+ 9 |
// | | | f1- |
// | | | |
// | | | |
// 0--------1--------7--------5
// P0 e0+ e1- E1
//(0,0) (1,0)
float d11 = u+v;
float d12 = U+v;
float d21 = u+V;
float d22 = U+V;
float3 q[16]; float3 q[16];
q[ 5] = (u*cv[3] + v*cv[4])/d11; q[ 5] = (d11 == 0.0) ? cv[3] : (u*cv[3] + v*cv[4])/d11;
q[ 6] = (U*cv[9] + v*cv[8])/d12; q[ 6] = (d12 == 0.0) ? cv[8] : (U*cv[9] + v*cv[8])/d12;
q[ 9] = (u*cv[19] + V*cv[18])/d21; q[ 9] = (d21 == 0.0) ? cv[18] : (u*cv[19] + V*cv[18])/d21;
q[10] = (U*cv[13] + V*cv[14])/d22; q[10] = (d22 == 0.0) ? cv[13] : (U*cv[13] + V*cv[14])/d22;
q[ 0] = cv[0]; q[ 0] = cv[0];
q[ 1] = cv[1]; q[ 1] = cv[1];