X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-scene-loader%2Finternal%2Fgraphics%2Fshaders%2Fdefault-physically-based-shader.vert;h=ea4fd32fa83dd5f7b965bda399e1d09c3aa9aeed;hp=e9381c5ecf4f4dd18fc2c1832f25f9c2f4977a63;hb=7875069ceecfd24c2a8cf3a28564f7d115296e93;hpb=3699bd6bb292750152ea1a19f702a641f50c9867 diff --git a/dali-scene-loader/internal/graphics/shaders/default-physically-based-shader.vert b/dali-scene-loader/internal/graphics/shaders/default-physically-based-shader.vert index e9381c5..ea4fd32 100644 --- a/dali-scene-loader/internal/graphics/shaders/default-physically-based-shader.vert +++ b/dali-scene-loader/internal/graphics/shaders/default-physically-based-shader.vert @@ -1,5 +1,9 @@ #version 300 es +// Original Code +// https://github.com/KhronosGroup/glTF-Sample-Viewer/blob/glTF-WebGL-PBR/shaders/pbr-vert.glsl +// Commit dc84b5e374fb3d23153d2248a338ef88173f9eb6 + #ifdef HIGHP precision highp float; #else @@ -9,23 +13,29 @@ in vec3 aPosition; in vec2 aTexCoord; in vec3 aNormal; + +#ifdef VEC4_TANGENT +in vec4 aTangent; +#else in vec3 aTangent; +#endif + +in vec4 aVertexColor; #ifdef MORPH - uniform sampler2D sBlendShapeGeometry; + uniform highp sampler2D sBlendShapeGeometry; #endif out vec2 vUV; -out vec3 vNormal; -out vec3 vTangent; -out vec3 vViewVec; +out lowp mat3 vTBN; +out lowp vec4 vColor; +out highp vec3 vPositionToCamera; -uniform highp mat4 uMvpMatrix; uniform highp mat4 uViewMatrix; uniform mat3 uNormalMatrix; uniform mat4 uModelMatrix; -uniform mat4 uModelView; uniform mat4 uProjection; +uniform lowp float uHasVertexColor; #ifdef SKINNING in vec4 aJoints; @@ -36,35 +46,39 @@ uniform mat4 uProjection; #ifdef MORPH #define MAX_BLEND_SHAPE_NUMBER 128 -uniform int uNumberOfBlendShapes; ///< Total number of blend shapes loaded. -uniform float uBlendShapeWeight[MAX_BLEND_SHAPE_NUMBER]; ///< The weight of each blend shape. +uniform float uNumberOfBlendShapes; ///< Total number of blend shapes loaded. +uniform highp float uBlendShapeWeight[MAX_BLEND_SHAPE_NUMBER]; ///< The weight of each blend shape. #ifdef MORPH_VERSION_2_0 uniform float uBlendShapeUnnormalizeFactor; ///< Factor used to unnormalize the geometry of the blend shape. #else uniform float uBlendShapeUnnormalizeFactor[MAX_BLEND_SHAPE_NUMBER]; ///< Factor used to unnormalize the geometry of the blend shape. #endif -uniform int uBlendShapeComponentSize; ///< The size in the texture of either the vertices, normals or tangents. Used to calculate the offset to address them. +uniform float uBlendShapeComponentSize; ///< The size in the texture of either the vertices, normals or tangents. Used to calculate the offset to address them. #endif void main() { - vec4 position = vec4(aPosition, 1.0); - vec3 normal = aNormal; - vec3 tangent = aTangent; + highp vec4 position = vec4(aPosition, 1.0); + highp vec3 normal = aNormal; + highp vec3 tangent = aTangent.xyz; #ifdef MORPH int width = textureSize( sBlendShapeGeometry, 0 ).x; int blendShapeBufferOffset = 0; - for( int index = 0; index < uNumberOfBlendShapes; ++index ) + int blendShapeComponentSize = int(uBlendShapeComponentSize); + int numberOfBlendShapes = int(uNumberOfBlendShapes); + + for( int index = 0; index < numberOfBlendShapes; ++index ) { + highp vec3 diff = vec3(0.0); + #ifdef MORPH_POSITION // Calculate the index to retrieve the geometry from the texture. int vertexId = gl_VertexID + blendShapeBufferOffset; int x = vertexId % width; int y = vertexId / width; - vec3 diff = vec3(0.0); // Retrieves the blend shape geometry from the texture, unnormalizes it and multiply by the weight. if( 0.0 != uBlendShapeWeight[index] ) { @@ -79,12 +93,12 @@ void main() position.xyz += diff; - blendShapeBufferOffset += uBlendShapeComponentSize; + blendShapeBufferOffset += blendShapeComponentSize; #endif #ifdef MORPH_NORMAL // Calculate the index to retrieve the normal from the texture. - vertexId = gl_VertexID + blendShapeBufferOffset; + vertexId = gl_VertexID + int(blendShapeBufferOffset); x = vertexId % width; y = vertexId / width; @@ -96,7 +110,7 @@ void main() normal += diff.xyz; - blendShapeBufferOffset += uBlendShapeComponentSize; + blendShapeBufferOffset += blendShapeComponentSize; #endif #ifdef MORPH_TANGENT @@ -113,14 +127,14 @@ void main() tangent += diff.xyz; - blendShapeBufferOffset += uBlendShapeComponentSize; + blendShapeBufferOffset += blendShapeComponentSize; #endif } #endif #ifdef SKINNING - mat4 bone = uBone[int(aJoints.x)] * aWeights.x + + highp mat4 bone = uBone[int(aJoints.x)] * aWeights.x + uBone[int(aJoints.y)] * aWeights.y + uBone[int(aJoints.z)] * aWeights.z + uBone[int(aJoints.w)] * aWeights.w; @@ -129,15 +143,16 @@ void main() tangent = (bone * vec4(tangent, 0.0)).xyz; #endif - vec4 vPosition = uModelMatrix * position; - - vNormal = normalize(uNormalMatrix * normal); + highp vec4 positionW = uModelMatrix * position; + highp vec4 positionV = uViewMatrix * positionW; - vTangent = normalize(uNormalMatrix * tangent); + vPositionToCamera = transpose(mat3(uViewMatrix)) * -vec3(positionV.xyz / positionV.w); - - vec4 viewPosition = uViewMatrix * vPosition; - gl_Position = uProjection * viewPosition; + vec3 bitangent = cross(normal, tangent); +#ifdef VEC4_TANGENT + bitangent *= aTangent.w; +#endif + vTBN = mat3(uModelMatrix) * mat3(tangent, bitangent, normal); #ifdef FLIP_V vUV = vec2(aTexCoord.x, 1.0 - aTexCoord.y); @@ -145,5 +160,7 @@ void main() vUV = aTexCoord; #endif - vViewVec = viewPosition.xyz; + vColor = mix(vec4(1.0f), aVertexColor, uHasVertexColor); + + gl_Position = uProjection * positionV; }