From 736dae0c816b974538a01fc3e20313d47c4c7494 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 25 Sep 2013 15:26:29 -0700 Subject: [PATCH] Use shaders for eyes (like the ones for the iris). --- interface/resources/shaders/eye.vert | 28 ++++++++++++++++++++++++++++ interface/src/avatar/BlendFace.cpp | 19 ++++++++++++++++--- interface/src/avatar/BlendFace.h | 2 ++ 3 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 interface/resources/shaders/eye.vert diff --git a/interface/resources/shaders/eye.vert b/interface/resources/shaders/eye.vert new file mode 100644 index 0000000000..aa26b1326f --- /dev/null +++ b/interface/resources/shaders/eye.vert @@ -0,0 +1,28 @@ +#version 120 + +// +// eye.vert +// vertex shader +// +// Created by Andrzej Kapolka on 9/25/13. +// Copyright (c) 2013 High Fidelity, Inc. All rights reserved. +// + +// the interpolated normal +varying vec4 normal; + +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; + + // use standard pipeline transform + gl_Position = ftransform(); +} diff --git a/interface/src/avatar/BlendFace.cpp b/interface/src/avatar/BlendFace.cpp index 4b0be2c051..bb31437a1d 100644 --- a/interface/src/avatar/BlendFace.cpp +++ b/interface/src/avatar/BlendFace.cpp @@ -27,10 +27,20 @@ BlendFace::~BlendFace() { deleteGeometry(); } -GLuint BlendFace::_eyeTextureID = 0; +ProgramObject BlendFace::_eyeProgram; +GLuint BlendFace::_eyeTextureID; void BlendFace::init() { - if (_eyeTextureID == 0) { + if (!_eyeProgram.isLinked()) { + switchToResourcesParentIfRequired(); + _eyeProgram.addShaderFromSourceFile(QGLShader::Vertex, "resources/shaders/eye.vert"); + _eyeProgram.addShaderFromSourceFile(QGLShader::Fragment, "resources/shaders/iris.frag"); + _eyeProgram.link(); + + _eyeProgram.bind(); + _eyeProgram.setUniformValue("texture", 0); + _eyeProgram.release(); + _eyeTextureID = Application::getInstance()->getTextureCache()->getFileTextureID("resources/images/eye.png"); } } @@ -84,6 +94,8 @@ bool BlendFace::render(float alpha) { glBindTexture(GL_TEXTURE_2D, _eyeTextureID); glEnable(GL_TEXTURE_2D); + + _eyeProgram.bind(); } // all meshes after the first are white @@ -128,9 +140,10 @@ bool BlendFace::render(float alpha) { GL_UNSIGNED_INT, (void*)(mesh.quadIndices.size() * sizeof(int))); if (mesh.isEye) { - glDisableClientState(GL_TEXTURE_COORD_ARRAY); + _eyeProgram.release(); glBindTexture(GL_TEXTURE_2D, 0); glDisable(GL_TEXTURE_2D); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); glPopMatrix(); } } diff --git a/interface/src/avatar/BlendFace.h b/interface/src/avatar/BlendFace.h index 0f1f82bbe2..8e7302a729 100644 --- a/interface/src/avatar/BlendFace.h +++ b/interface/src/avatar/BlendFace.h @@ -14,6 +14,7 @@ #include "InterfaceConfig.h" #include "renderer/FBXReader.h" +#include "renderer/ProgramObject.h" class QNetworkReply; @@ -61,6 +62,7 @@ private: QVector _blendedVertices; QVector _blendedNormals; + static ProgramObject _eyeProgram; static GLuint _eyeTextureID; };