From e3108220e8c9e1a66731d42f1769343d49728efd Mon Sep 17 00:00:00 2001 From: Dennis Peeten Date: Thu, 17 Apr 2008 10:46:52 +0000 Subject: poep --- headtrack_stereo_demo/shaders/greyscale.frag | 71 +++++++++++++++---------- headtrack_stereo_demo/shaders/greyscale.vert | 40 ++++++-------- headtrack_stereo_demo/src/glutcallbacks.cpp | 78 +++++++++++++++++++++++----- headtrack_stereo_demo/src/main.cpp | 18 ++++--- headtrack_stereo_demo/src/scenerenderer.cpp | 10 ++++ headtrack_stereo_demo/src/typedefs.h | 4 +- 6 files changed, 152 insertions(+), 69 deletions(-) diff --git a/headtrack_stereo_demo/shaders/greyscale.frag b/headtrack_stereo_demo/shaders/greyscale.frag index 6ed03e3..d4b77cd 100644 --- a/headtrack_stereo_demo/shaders/greyscale.frag +++ b/headtrack_stereo_demo/shaders/greyscale.frag @@ -1,31 +1,50 @@ -varying vec4 diffuse,ambient; - varying vec3 normal,lightDir,halfVector; +uniform vec3 g_ConversionWeights; + + +varying vec4 ambient, diffuse; +varying vec3 normal, lightdir, halfvector; + +//uniform sampler2D tex, hello; + +void main() +{ + float NdotL, NdotHV, gray; + vec3 n = normalize(normal); + vec4 // texcolor = texture2D(tex, gl_TexCoord[0].st), + fragcolor = ambient, + color; + //compute the dot pruduct of the normalized normal and light direction + NdotL = max(dot(n, lightdir), 0.0); - void main() + if (NdotL > 0.0) { - vec3 n,halfV; - float NdotL,NdotHV; + //add diffuse light component + fragcolor += diffuse * NdotL; - /* The ambient term will always be present */ - vec4 color = ambient; + //compute the dot product of the normal and half vector (of the lightdir and eye position) + NdotHV = max(dot(n, halfvector), 0.0); - /* a fragment shader can't write a varying variable, hence we need - a new variable to store the normalized interpolated normal */ - n = normalize(normal); - - /* compute the dot product between normal and ldir */ - NdotL = max(dot(n,lightDir),0.0); - if (NdotL > 0.0) { - color += diffuse * NdotL; - halfV = normalize(halfVector); - NdotHV = max(dot(n,halfV),0.0); - color += gl_FrontMaterial.specular * - gl_LightSource[0].specular * - pow(NdotHV, gl_FrontMaterial.shininess); - } - - float gray = dot(color, vec3(0.299, 0.587, 0.114)); - - gl_FragColor = vec4(gray, gray, gray, color[3]);; -} \ No newline at end of file + fragcolor += gl_FrontMaterial.specular * gl_LightSource[0].specular * + pow(NdotHV, gl_FrontMaterial.shininess); + } + + + + //modulate the fragment color with the texel color for the final color +// color = texcolor * fragcolor; + color = fragcolor; + + //smoothstep not available on ati motbility 8600 + //color += smoothstep(1.0,0.2,NdotL) * texture2D(hello, gl_TexCoord[0].st); + + //convert to grayscale using NTSC conversion weights + //gray = dot(color.rgb, vec3(0.299, 0.587, 0.114)); + gray = dot(color.rgb, g_ConversionWeights); + + //copy grayscale to rgb components and use the alpha from the final color + gl_FragColor = vec4(gray, gray, gray, color.a); + + // convert grayscale to sepia + //gl_FragColor = vec4(gray * vec3(1.2, 1.0, 0.8), color.a); +} diff --git a/headtrack_stereo_demo/shaders/greyscale.vert b/headtrack_stereo_demo/shaders/greyscale.vert index 59c9d80..0eec6f5 100644 --- a/headtrack_stereo_demo/shaders/greyscale.vert +++ b/headtrack_stereo_demo/shaders/greyscale.vert @@ -1,25 +1,19 @@ -varying vec4 diffuse,ambient; - varying vec3 normal,lightDir,halfVector; +varying vec4 ambient, diffuse; +varying vec3 normal, lightdir, halfvector; + +void main() +{ + //transform the normal + normal = gl_NormalMatrix * gl_Normal; + + //determine the light direction + lightdir = normalize(gl_LightSource[0].position.xyz); + halfvector = normalize(gl_LightSource[0].halfVector.xyz); - void main() - { - /* first transform the normal into eye space and - normalize the result */ - normal = normalize(gl_NormalMatrix * gl_Normal); - - /* now normalize the light's direction. Note that - according to the OpenGL specification, the light - is stored in eye space. Also since we're talking about - a directional light, the position field is actually direction */ - lightDir = normalize(vec3(gl_LightSource[0].position)); + //compute diffuse and ambient terms + diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse; + ambient = gl_FrontMaterial.ambient * (gl_LightSource[0].ambient + gl_LightModel.ambient); - /* Normalize the halfVector to pass it to the fragment shader */ - halfVector = normalize(gl_LightSource[0].halfVector.xyz); - - /* Compute the diffuse, ambient and globalAmbient terms */ - diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse; - ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient; - ambient += gl_LightModel.ambient * gl_FrontMaterial.ambient; - - gl_Position = ftransform(); - } \ No newline at end of file + gl_Position = ftransform(); + //gl_TexCoord[0] = gl_MultiTexCoord0; +} diff --git a/headtrack_stereo_demo/src/glutcallbacks.cpp b/headtrack_stereo_demo/src/glutcallbacks.cpp index 9b582f8..6002a85 100644 --- a/headtrack_stereo_demo/src/glutcallbacks.cpp +++ b/headtrack_stereo_demo/src/glutcallbacks.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "typedefs.h" #include "stereoheadtrackfrustum.h" @@ -23,6 +24,13 @@ void ExitProgram() exit(0); } +inline void GSConvScaleChange(int index, GLfloat delta) +{ + g_GameState.m_GSConvScale[index] += delta; + if (g_GameState.m_bStereoEnabled) + glUniform3fv(g_GameState.m_GSConvScaleLoc, 1, g_GameState.m_GSConvScale); +} + void Keyboard(unsigned char f_cKey, int f_iX, int f_iY) { switch(f_cKey) @@ -36,17 +44,6 @@ void Keyboard(unsigned char f_cKey, int f_iX, int f_iY) case 's': case 'S': //enable /disable stereo vision g_GameState.m_bStereoEnabled = !g_GameState.m_bStereoEnabled; - - if (g_GameState.m_bStereoEnabled) - { - //enable greyscale shader - glUseProgram(g_GameState.m_GreyScaleShaderProgram); - } - else - { - //disable greyscale shader - glUseProgram(0); - } break; case 'h': @@ -74,6 +71,15 @@ void Keyboard(unsigned char f_cKey, int f_iX, int f_iY) // } //} break; + + case 'u': GSConvScaleChange(0, 0.05); break; + case 'j': GSConvScaleChange(0, -0.05); break; + + case 'i': GSConvScaleChange(1, 0.05); break; + case 'k': GSConvScaleChange(1, -0.05); break; + + case 'o': GSConvScaleChange(2, 0.05); break; + case 'l': GSConvScaleChange(2, -0.05); break; } } @@ -86,6 +92,11 @@ void Display(void) if (g_GameState.m_bStereoEnabled) { + //enable grayscale shader + glUseProgram(g_GameState.m_GreyScaleShaderProgram); + //set the conversion scale + glUniform3fv(g_GameState.m_GSConvScaleLoc, 1, g_GameState.m_GSConvScale); + for (int CurrentEye=0; CurrentEye<2; CurrentEye++) //STEREO_LEFT_EYE = 0, STEREO_RIGHT_EYE = 1 { l_bEyeLocated = false; @@ -123,6 +134,8 @@ void Display(void) RenderScene(); } glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + //disable greyscale shader + glUseProgram(0); } else // !g_GameState.m_bStereoEnabled { @@ -150,9 +163,48 @@ void Display(void) RenderScene(); } - - glutSwapBuffers(); + GLdouble width = (GLdouble)glutGet(GLUT_SCREEN_WIDTH), + height = (GLdouble)glutGet(GLUT_SCREEN_HEIGHT); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0.0, width, 0.0, height, -1.0, 1.0); + glScaled(1.0, -1.0, 1.0); + glTranslatef(0.0, -height, 0.0); + + glMatrixMode(GL_MODELVIEW); + glPushAttrib(GL_LIGHTING_BIT); + glShadeModel(GL_FLAT); + glDisable(GL_LIGHTING); + glPushMatrix(); + glLoadIdentity(); + glBegin(GL_QUADS); + glColor3f(0.2f, 0.2f, 0.2f); + glVertex3f(0.0f, 0.0f, -0.5f); + glVertex3f(0.0f, 30.0f, -0.5f); + glVertex3f(325.0f, 30.0f, -0.5f); + glVertex3f(325.0f, 0.0f, -0.5f); + glEnd(); + + glColor3f(1.0, 1.0, 1.0); + glRasterPos3f(5.0, 22.0, 0.5); + char string[256]; + sprintf(string, "RGB conv scale: %4.3f, %4.3f, %4.3f", + g_GameState.m_GSConvScale[0], + g_GameState.m_GSConvScale[1], + g_GameState.m_GSConvScale[2]); + int len = strlen(string); + for (int i=0; i #include "typedefs.h" +#define _USE_MATH_DEFINES +#include + extern GameState_t g_GameState; void DrawRasterBox() @@ -160,5 +163,12 @@ void RenderScene(void) //glScaled(1.0, 1.0, 10.0); glutSolidSphere(2.0, 8, 16); glPopMatrix(); + + glPushMatrix(); + double angle = double(glutGet(GLUT_ELAPSED_TIME)%4000)/1000.0; + glTranslatef(0.0, 0.0, -10.0); + glRotatef(angle * 90.0, 0.0, 1.0, 0.0); + glutSolidTorus(3.0, 5.0, 16, 64); + glPopMatrix(); } \ No newline at end of file diff --git a/headtrack_stereo_demo/src/typedefs.h b/headtrack_stereo_demo/src/typedefs.h index 55e2da5..5fe521e 100644 --- a/headtrack_stereo_demo/src/typedefs.h +++ b/headtrack_stereo_demo/src/typedefs.h @@ -31,6 +31,8 @@ typedef struct GameState bool m_bHeadTrackingEnabled; bool m_bStereoEnabled; wiimote *m_pTrackingWiimote; - GLuint m_GreyScaleShaderProgram; + GLuint m_GreyScaleShaderProgram; //handle to the grayscale shader program + GLint m_GSConvScaleLoc; //handle to the g_ConversionScale variable in the shader + GLfloat m_GSConvScale[3]; //grayscale conversion scale (default 0.299, 0.587, 0.114) } GameState_t; #endif //TYPEDEFS_HEADER_FILE \ No newline at end of file -- cgit v0.12