// // Copyright 2013 Pixar // // Licensed under the Apache License, Version 2.0 (the "Apache License") // with the following modification; you may not use this file except in // compliance with the Apache License and the following modification to it: // Section 6. Trademarks. is deleted and replaced with: // // 6. Trademarks. This License does not grant permission to use the trade // names, trademarks, service marks, or product names of the Licensor // and its affiliates, except as required to comply with Section 4(c) of // the License and to reproduce the content of the NOTICE file. // // You may obtain a copy of the Apache License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the Apache License with the above modification is // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the Apache License for the specific // language governing permissions and limitations under the Apache License. // #if defined(SHADING_VARYING_COLOR) || defined(SHADING_FACEVARYING_COLOR) #undef OSD_USER_VARYING_DECLARE #define OSD_USER_VARYING_DECLARE \ vec3 color; #undef OSD_USER_VARYING_ATTRIBUTE_DECLARE #define OSD_USER_VARYING_ATTRIBUTE_DECLARE \ layout(location = 1) in vec3 color; #undef OSD_USER_VARYING_PER_VERTEX #define OSD_USER_VARYING_PER_VERTEX() \ outpt.color = color #undef OSD_USER_VARYING_PER_CONTROL_POINT #define OSD_USER_VARYING_PER_CONTROL_POINT(ID_OUT, ID_IN) \ outpt[ID_OUT].color = inpt[ID_IN].color #undef OSD_USER_VARYING_PER_EVAL_POINT #define OSD_USER_VARYING_PER_EVAL_POINT(UV, a, b, c, d) \ outpt.color = \ mix(mix(inpt[a].color, inpt[b].color, UV.x), \ mix(inpt[c].color, inpt[d].color, UV.x), UV.y) #undef OSD_USER_VARYING_PER_EVAL_POINT_TRIANGLE #define OSD_USER_VARYING_PER_EVAL_POINT_TRIANGLE(UV, a, b, c) \ outpt.color = \ inpt[a].color * (1.0f - UV.x - UV.y) + \ inpt[b].color * UV.x + \ inpt[c].color * UV.y; #else #define OSD_USER_VARYING_DECLARE #define OSD_USER_VARYING_ATTRIBUTE_DECLARE #define OSD_USER_VARYING_PER_VERTEX() #define OSD_USER_VARYING_PER_CONTROL_POINT(ID_OUT, ID_IN) #define OSD_USER_VARYING_PER_EVAL_POINT(UV, a, b, c, d) #define OSD_USER_VARYING_PER_EVAL_POINT_TRIANGLE(UV, a, b, c) #endif //-------------------------------------------------------------- // Uniforms / Uniform Blocks //-------------------------------------------------------------- layout(std140) uniform Transform { mat4 ModelViewMatrix; mat4 ProjectionMatrix; mat4 ModelViewProjectionMatrix; mat4 ModelViewInverseMatrix; }; layout(std140) uniform Tessellation { float TessLevel; }; uniform int GregoryQuadOffsetBase; uniform int PrimitiveIdBase; //-------------------------------------------------------------- // Osd external functions //-------------------------------------------------------------- mat4 OsdModelViewMatrix() { return ModelViewMatrix; } mat4 OsdProjectionMatrix() { return ProjectionMatrix; } mat4 OsdModelViewProjectionMatrix() { return ModelViewProjectionMatrix; } float OsdTessLevel() { return TessLevel; } int OsdGregoryQuadOffsetBase() { return GregoryQuadOffsetBase; } int OsdPrimitiveIdBase() { return PrimitiveIdBase; } int OsdBaseVertex() { return 0; } //-------------------------------------------------------------- // Vertex Shader //-------------------------------------------------------------- #ifdef VERTEX_SHADER layout (location=0) in vec4 position; OSD_USER_VARYING_ATTRIBUTE_DECLARE out block { OutputVertex v; #ifdef OSD_PATCH_ENABLE_SINGLE_CREASE vec2 vSegments; #endif OSD_USER_VARYING_DECLARE } outpt; void main() { outpt.v.position = ModelViewMatrix * position; outpt.v.patchCoord = vec4(0); #ifdef OSD_PATCH_ENABLE_SINGLE_CREASE outpt.vSegments = vec2(0); #endif OSD_USER_VARYING_PER_VERTEX(); } #endif //-------------------------------------------------------------- // Geometry Shader //-------------------------------------------------------------- #ifdef GEOMETRY_SHADER #ifdef PRIM_QUAD layout(lines_adjacency) in; #define EDGE_VERTS 4 #endif // PRIM_QUAD #ifdef PRIM_TRI layout(triangles) in; #define EDGE_VERTS 3 #endif // PRIM_TRI layout(triangle_strip, max_vertices = EDGE_VERTS) out; in block { OutputVertex v; #ifdef OSD_PATCH_ENABLE_SINGLE_CREASE vec2 vSegments; #endif OSD_USER_VARYING_DECLARE } inpt[EDGE_VERTS]; out block { OutputVertex v; noperspective out vec4 edgeDistance; #ifdef OSD_PATCH_ENABLE_SINGLE_CREASE vec2 vSegments; #endif OSD_USER_VARYING_DECLARE } outpt; uniform isamplerBuffer OsdFVarParamBuffer; layout(std140) uniform OsdFVarArrayData { OsdPatchArray fvarPatchArray[2]; }; vec2 interpolateFaceVarying(vec2 uv, int fvarOffset) { int patchIndex = OsdGetPatchIndex(gl_PrimitiveID); OsdPatchArray array = fvarPatchArray[0]; ivec3 fvarPatchParam = texelFetch(OsdFVarParamBuffer, patchIndex).xyz; OsdPatchParam param = OsdPatchParamInit(fvarPatchParam.x, fvarPatchParam.y, fvarPatchParam.z); int patchType = OsdPatchParamIsRegular(param) ? array.regDesc : array.desc; float wP[20], wDu[20], wDv[20], wDuu[20], wDuv[20], wDvv[20]; int numPoints = OsdEvaluatePatchBasisNormalized(patchType, param, uv.s, uv.t, wP, wDu, wDv, wDuu, wDuv, wDvv); int patchArrayStride = numPoints; int primOffset = patchIndex * patchArrayStride; vec2 result = vec2(0); for (int i=0; i 1) { patchType = 3; // CORNER (not correct for patches that are not isolated) } #if defined OSD_PATCH_ENABLE_SINGLE_CREASE // check this after boundary/corner since single crease patch also has edgeCount. if (inpt.vSegments.y > 0) { patchType = 1; } #elif defined OSD_PATCH_GREGORY patchType = 4; #elif defined OSD_PATCH_GREGORY_BOUNDARY patchType = 5; #elif defined OSD_PATCH_GREGORY_BASIS patchType = 6; #elif defined OSD_PATCH_GREGORY_TRIANGLE patchType = 6; #endif int pattern = bitCount(OsdGetPatchTransitionMask(patchParam)); return patchColors[6*patchType + pattern]; } vec4 getAdaptiveDepthColor(ivec3 patchParam) { // Represent depth with repeating cycle of four colors: const vec4 depthColors[4] = vec4[4]( vec4(0.0f, 0.5f, 0.5f, 1.0f), vec4(1.0f, 1.0f, 1.0f, 1.0f), vec4(0.0f, 1.0f, 1.0f, 1.0f), vec4(0.5f, 1.0f, 0.5f, 1.0f) ); return depthColors[OsdGetPatchRefinementLevel(patchParam) & 3]; } #if defined(PRIM_QUAD) || defined(PRIM_TRI) void main() { vec3 N = (gl_FrontFacing ? inpt.v.normal : -inpt.v.normal); #if defined(SHADING_VARYING_COLOR) vec4 color = vec4(inpt.color, 1); #elif defined(SHADING_FACEVARYING_COLOR) // generating a checkerboard pattern vec4 color = vec4(inpt.color.rg, int(floor(20*inpt.color.r)+floor(20*inpt.color.g))&1, 1); #elif defined(SHADING_PATCH_TYPE) vec4 color = getAdaptivePatchColor(OsdGetPatchParam(OsdGetPatchIndex(gl_PrimitiveID))); #elif defined(SHADING_PATCH_DEPTH) vec4 color = getAdaptiveDepthColor(OsdGetPatchParam(OsdGetPatchIndex(gl_PrimitiveID))); #elif defined(SHADING_PATCH_COORD) vec4 color = vec4(inpt.v.patchCoord.xy, 0, 1); #elif defined(SHADING_MATERIAL) vec4 color = diffuseColor; #else vec4 color = vec4(1, 1, 1, 1); #endif vec4 Cf = lighting(color, inpt.v.position.xyz, N); #if defined(SHADING_NORMAL) Cf.rgb = N; #endif #if defined(GEOMETRY_OUT_WIRE) || defined(GEOMETRY_OUT_LINE) Cf = edgeColor(Cf, inpt.edgeDistance); #endif outColor = Cf; } #endif #endif