summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDennis Peeten <dpeeten@onsneteindhoven.nl>2008-04-17 10:46:52 (GMT)
committerDennis Peeten <dpeeten@onsneteindhoven.nl>2008-04-17 10:46:52 (GMT)
commite3108220e8c9e1a66731d42f1769343d49728efd (patch)
tree7de84c0024d0cdbed9e5761d719f996a71c5c5ad
parent7e5ef59c21af27e98f2a50b076d3b73882929768 (diff)
download2iv55-e3108220e8c9e1a66731d42f1769343d49728efd.zip
2iv55-e3108220e8c9e1a66731d42f1769343d49728efd.tar.gz
2iv55-e3108220e8c9e1a66731d42f1769343d49728efd.tar.bz2
poep
-rw-r--r--headtrack_stereo_demo/shaders/greyscale.frag71
-rw-r--r--headtrack_stereo_demo/shaders/greyscale.vert40
-rw-r--r--headtrack_stereo_demo/src/glutcallbacks.cpp78
-rw-r--r--headtrack_stereo_demo/src/main.cpp18
-rw-r--r--headtrack_stereo_demo/src/scenerenderer.cpp10
-rw-r--r--headtrack_stereo_demo/src/typedefs.h4
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 <wiimote.h>
#include <GL\glew.h>
#include <GL\glut.h>
+#include <stdlib.h>
#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<len; i++)
+ glutBitmapCharacter(GLUT_BITMAP_9_BY_15, string[i]);
+
+ glPopMatrix();
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+
+ glPopAttrib();
+
+ glutSwapBuffers();
} // Display
diff --git a/headtrack_stereo_demo/src/main.cpp b/headtrack_stereo_demo/src/main.cpp
index 40e726f..f7f037a 100644
--- a/headtrack_stereo_demo/src/main.cpp
+++ b/headtrack_stereo_demo/src/main.cpp
@@ -33,7 +33,6 @@ void InitGL(void)
glClearDepth(1000.0);
glDisable(GL_DITHER);
glShadeModel(GL_SMOOTH);
- //glEnable(GL_NORMALIZE); //why??
glEnable(GL_CULL_FACE);
}
@@ -104,6 +103,10 @@ bool LoadGreyScaleShader()
glLinkProgram(g_GameState.m_GreyScaleShaderProgram);
+ g_GameState.m_GSConvScaleLoc = glGetUniformLocation(g_GameState.m_GreyScaleShaderProgram, "g_ConversionWeights");
+
+
+
return true;
}
@@ -149,12 +152,15 @@ int main(int argc, char **argv)
g_GameState.m_FrustumParms.m_dCameraYCenter = 768.0/2.0;
g_GameState.m_FrustumParms.m_dYAngleCorrection = 0.0; //to be initialised correctly
g_GameState.m_FrustumParms.m_dScreenHeightWorld = 20.0;
- g_GameState.m_FrustumParms.m_dCameraYOffset = 130.0;
+ /*g_GameState.m_FrustumParms.m_dCameraYOffset = 130.0;
g_GameState.m_FrustumParms.m_dScreenHeightMM = 210.0;
- g_GameState.m_FrustumParms.m_dScreenAspect = 4.0/3.0;
- //g_GameState.m_FrustumParms.m_dCameraYOffset = 205.0;
- //g_GameState.m_FrustumParms.m_dScreenHeightMM = 320.0;
- //g_GameState.m_FrustumParms.m_dScreenAspect = 16.0/10.0;
+ g_GameState.m_FrustumParms.m_dScreenAspect = 4.0/3.0;*/
+ g_GameState.m_GSConvScale[0] = 0.299;
+ g_GameState.m_GSConvScale[1] = 0.587;
+ g_GameState.m_GSConvScale[2] = 0.114;
+ g_GameState.m_FrustumParms.m_dCameraYOffset = 205.0;
+ g_GameState.m_FrustumParms.m_dScreenHeightMM = 320.0;
+ g_GameState.m_FrustumParms.m_dScreenAspect = 16.0/10.0;
g_GameState.m_bHeadTrackingEnabled = false;
g_GameState.m_bStereoEnabled = false;
diff --git a/headtrack_stereo_demo/src/scenerenderer.cpp b/headtrack_stereo_demo/src/scenerenderer.cpp
index 15c0a73..2fc7042 100644
--- a/headtrack_stereo_demo/src/scenerenderer.cpp
+++ b/headtrack_stereo_demo/src/scenerenderer.cpp
@@ -1,6 +1,9 @@
#include <GL\glut.h>
#include "typedefs.h"
+#define _USE_MATH_DEFINES
+#include <math.h>
+
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