mirror of
https://github.com/PixarAnimationStudios/OpenSubdiv
synced 2024-11-28 06:11:07 +00:00
Merge pull request #591 from takahito-tejima/dev
Fix gregory patch shader: wrong tangents on corner corners
This commit is contained in:
commit
43cc693c7d
@ -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];
|
||||||
|
@ -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];
|
||||||
|
Loading…
Reference in New Issue
Block a user