From d06acdd1695e36e6f49738778d35710b1be54fd1 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Tue, 15 Oct 2013 11:50:29 -0700 Subject: [PATCH] Per-pixel shading, material tweaks. --- interface/resources/shaders/blendface.frag | 13 ++++++--- interface/resources/shaders/blendface.vert | 4 --- .../resources/shaders/skin_blendface.vert | 4 --- interface/src/avatar/BlendFace.cpp | 11 +------- interface/src/renderer/FBXReader.cpp | 28 ++++++++++--------- interface/src/renderer/FBXReader.h | 4 +-- 6 files changed, 26 insertions(+), 38 deletions(-) diff --git a/interface/resources/shaders/blendface.frag b/interface/resources/shaders/blendface.frag index ad37e514b9..7358c7dba9 100644 --- a/interface/resources/shaders/blendface.frag +++ b/interface/resources/shaders/blendface.frag @@ -15,10 +15,15 @@ uniform sampler2D texture; varying vec4 normal; void main(void) { - // compute the specular component (sans exponent) based on the normal OpenGL lighting model - float specular = max(0.0, dot(normalize(gl_LightSource[0].position + vec4(0.0, 0.0, 1.0, 0.0)), normalize(normal))); + // compute the base color based on OpenGL lighting model + vec4 normalizedNormal = normalize(normal); + vec4 base = gl_FrontLightModelProduct.sceneColor + gl_FrontLightProduct[0].ambient + + gl_FrontLightProduct[0].diffuse * max(0.0, dot(normalizedNormal, gl_LightSource[0].position)); + + // compute the specular component (sans exponent) + float specular = max(0.0, dot(normalize(gl_LightSource[0].position + vec4(0.0, 0.0, 1.0, 0.0)), normalizedNormal)); - // modulate texture by diffuse color and add specular contribution - gl_FragColor = gl_Color * texture2D(texture, gl_TexCoord[0].st) + + // modulate texture by base color and add specular contribution + gl_FragColor = base * texture2D(texture, gl_TexCoord[0].st) + pow(specular, gl_FrontMaterial.shininess) * gl_FrontLightProduct[0].specular; } diff --git a/interface/resources/shaders/blendface.vert b/interface/resources/shaders/blendface.vert index 5556000b0e..16893dfc0b 100644 --- a/interface/resources/shaders/blendface.vert +++ b/interface/resources/shaders/blendface.vert @@ -16,10 +16,6 @@ void main(void) { // transform and store the normal for interpolation normal = normalize(gl_ModelViewMatrix * vec4(gl_Normal, 0.0)); - // compute standard diffuse lighting per-vertex - gl_FrontColor = vec4(gl_Color.rgb * (gl_LightModel.ambient.rgb + gl_LightSource[0].ambient.rgb + - gl_LightSource[0].diffuse.rgb * max(0.0, dot(normal, gl_LightSource[0].position))), gl_Color.a); - // pass along the texture coordinate gl_TexCoord[0] = gl_MultiTexCoord0; diff --git a/interface/resources/shaders/skin_blendface.vert b/interface/resources/shaders/skin_blendface.vert index 2bd1e35525..af2d0103a9 100644 --- a/interface/resources/shaders/skin_blendface.vert +++ b/interface/resources/shaders/skin_blendface.vert @@ -31,10 +31,6 @@ void main(void) { position = gl_ModelViewProjectionMatrix * position; normal = normalize(gl_ModelViewMatrix * normal); - // standard diffuse lighting - gl_FrontColor = (gl_LightModel.ambient + gl_LightSource[0].ambient + - gl_LightSource[0].diffuse * max(0.0, dot(normal, gl_LightSource[0].position))); - // pass along the texture coordinate gl_TexCoord[0] = gl_MultiTexCoord0; diff --git a/interface/src/avatar/BlendFace.cpp b/interface/src/avatar/BlendFace.cpp index b0992488d5..3ecb3caf75 100644 --- a/interface/src/avatar/BlendFace.cpp +++ b/interface/src/avatar/BlendFace.cpp @@ -94,7 +94,7 @@ void BlendFace::simulate(float deltaTime) { glm::quat orientation = static_cast(_owningHead->_owningAvatar)->getOrientation(); glm::vec3 scale = glm::vec3(-1.0f, 1.0f, -1.0f) * _owningHead->getScale() * MODEL_SCALE; - glm::vec3 offset = MODEL_TRANSLATION - _geometry->getFBXGeometry().neckPivot; + glm::vec3 offset = MODEL_TRANSLATION - geometry.neckPivot; glm::mat4 baseTransform = glm::translate(_owningHead->getPosition()) * glm::mat4_cast(orientation) * glm::scale(scale) * glm::translate(offset); @@ -239,14 +239,8 @@ bool BlendFace::render(float alpha) { glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); - // enable normalization under the expectation that the GPU can do it faster - glEnable(GL_NORMALIZE); - glEnable(GL_TEXTURE_2D); glDisable(GL_COLOR_MATERIAL); - // the eye shader uses the color state even though color material is disabled - glColor4f(1.0f, 1.0f, 1.0f, alpha); - for (int i = 0; i < networkMeshes.size(); i++) { const NetworkMesh& networkMesh = networkMeshes.at(i); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, networkMesh.indexBufferID); @@ -361,9 +355,6 @@ bool BlendFace::render(float alpha) { } } - glDisable(GL_NORMALIZE); - glDisable(GL_TEXTURE_2D); - // deactivate vertex arrays after drawing glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); diff --git a/interface/src/renderer/FBXReader.cpp b/interface/src/renderer/FBXReader.cpp index c20a965a24..56961ec41e 100644 --- a/interface/src/renderer/FBXReader.cpp +++ b/interface/src/renderer/FBXReader.cpp @@ -722,6 +722,13 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) joint.preRotation = model.preRotation; joint.rotation = model.rotation; joint.postRotation = model.postRotation; + if (joint.parentIndex == -1) { + joint.transform = geometry.offset * model.preRotation * glm::mat4_cast(model.rotation) * model.postRotation; + + } else { + joint.transform = geometry.joints.at(joint.parentIndex).transform * + model.preRotation * glm::mat4_cast(model.rotation) * model.postRotation; + } geometry.joints.append(joint); } @@ -730,6 +737,12 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) geometry.rightEyeJointIndex = modelIDs.indexOf(jointEyeRightID); geometry.neckJointIndex = modelIDs.indexOf(jointNeckID); + // extract the translation component of the neck transform + if (geometry.neckJointIndex != -1) { + const glm::mat4& transform = geometry.joints.at(geometry.neckJointIndex).transform; + geometry.neckPivot = glm::vec3(transform[3][0], transform[3][1], transform[3][2]); + } + QVariantHash springs = mapping.value("spring").toHash(); QVariant defaultSpring = springs.value("default"); for (QHash::iterator it = meshes.begin(); it != meshes.end(); it++) { @@ -775,18 +788,11 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) if (jointID == jointEyeLeftID || jointID == jointEyeRightID) { mesh.isEye = true; } + // see http://stackoverflow.com/questions/13566608/loading-skinning-information-from-fbx for a discussion + // of skinning information in FBX fbxCluster.jointIndex = modelIDs.indexOf(jointID); fbxCluster.inverseBindMatrix = glm::inverse(cluster.transformLink) * modelTransform; mesh.clusters.append(fbxCluster); - - // see http://stackoverflow.com/questions/13566608/loading-skinning-information-from-fbx for a discussion - // of skinning information in FBX - glm::mat4 jointTransform = geometry.offset * getGlobalTransform(parentMap, models, jointID); - mesh.transform = jointTransform * glm::inverse(cluster.transformLink) * modelTransform; - - // extract translation component for pivot - glm::mat4 jointTransformScaled = geometry.offset * getGlobalTransform(parentMap, models, jointID); - mesh.pivot = glm::vec3(jointTransformScaled[3][0], jointTransformScaled[3][1], jointTransformScaled[3][2]); } } @@ -865,10 +871,6 @@ FBXGeometry extractFBXGeometry(const FBXNode& node, const QVariantHash& mapping) geometry.meshes.append(mesh); } - // extract translation component for neck pivot - glm::mat4 neckTransform = geometry.offset * getGlobalTransform(parentMap, models, jointNeckID); - geometry.neckPivot = glm::vec3(neckTransform[3][0], neckTransform[3][1], neckTransform[3][2]); - return geometry; } diff --git a/interface/src/renderer/FBXReader.h b/interface/src/renderer/FBXReader.h index 72033813fa..f983715d60 100644 --- a/interface/src/renderer/FBXReader.h +++ b/interface/src/renderer/FBXReader.h @@ -45,6 +45,7 @@ public: glm::mat4 preRotation; glm::quat rotation; glm::mat4 postRotation; + glm::mat4 transform; }; /// A single binding to a joint in an FBX document. @@ -69,9 +70,6 @@ public: QVector clusters; - glm::vec3 pivot; - glm::mat4 transform; - bool isEye; glm::vec3 diffuseColor;