diff --git a/data/kitchens/1.sdf b/data/kitchens/1.sdf index 0bf6112e9..33e914375 100644 --- a/data/kitchens/1.sdf +++ b/data/kitchens/1.sdf @@ -4291,45 +4291,7 @@ - - 1 - -12.0 -13.9 0 0 0 0 - - - 0 - - 0.166667 - 0 - 0 - 0.166667 - 0 - 0.166667 - - - - - - .1 .1 .1 - fatihrmutfak/part110.obj - - - - - - - .1 .1 .1 - fatihrmutfak/part110.obj - - - - 1 0 0 1 - 1.000000 1.000000 1.000000 1 - 0.1 0.1 0.1 1 - 0 0 0 0 - - - - + 1 -12.0 -13.9 0 0 0 0 diff --git a/data/kuka_iiwa/model.urdf b/data/kuka_iiwa/model.urdf index a6e53d3ab..98e54cb37 100644 --- a/data/kuka_iiwa/model.urdf +++ b/data/kuka_iiwa/model.urdf @@ -70,7 +70,7 @@ - + @@ -99,7 +99,7 @@ - + @@ -128,7 +128,7 @@ - + @@ -157,7 +157,7 @@ - + @@ -186,7 +186,7 @@ - + @@ -215,7 +215,7 @@ - + @@ -244,7 +244,7 @@ - + @@ -273,7 +273,7 @@ - + diff --git a/examples/OpenGLWindow/GLInstancingRenderer.cpp b/examples/OpenGLWindow/GLInstancingRenderer.cpp index 3d6c4d793..296f53a72 100644 --- a/examples/OpenGLWindow/GLInstancingRenderer.cpp +++ b/examples/OpenGLWindow/GLInstancingRenderer.cpp @@ -129,6 +129,8 @@ struct b3GraphicsInstance int m_instanceOffset; int m_vertexArrayOffset; int m_primitiveType; + float m_materialShinyNess; + b3Vector3 m_materialSpecularColor; b3GraphicsInstance() :m_cube_vao(-1), @@ -139,7 +141,9 @@ struct b3GraphicsInstance m_numGraphicsInstances(0), m_instanceOffset(0), m_vertexArrayOffset(0), - m_primitiveType(B3_GL_TRIANGLES) + m_primitiveType(B3_GL_TRIANGLES), + m_materialShinyNess(81), + m_materialSpecularColor(b3MakeVector3(1,1,1)) { } @@ -204,8 +208,10 @@ struct InternalDataRenderer : public GLInstanceRendererInternalData GLfloat m_projectionMatrix[16]; GLfloat m_viewMatrix[16]; + GLfloat m_viewMatrixInverse[16]; b3Vector3 m_lightPos; + b3Vector3 m_lightSpecularIntensity; GLuint m_defaultTexturehandle; b3AlignedObjectArray m_textureHandles; @@ -226,12 +232,14 @@ struct InternalDataRenderer : public GLInstanceRendererInternalData m_renderFrameBuffer(0) { m_lightPos=b3MakeVector3(-50,30,40); + m_lightSpecularIntensity.setValue(1,1,1); //clear to zero to make it obvious if the matrix is used uninitialized for (int i=0;i<16;i++) { m_projectionMatrix[i]=0; m_viewMatrix[i]=0; + m_viewMatrixInverse[i]=0; } } @@ -280,9 +288,14 @@ GLuint linesVertexArrayObject=0; GLuint linesIndexVbo = 0; +static GLint useShadow_ViewMatrixInverse=0; static GLint useShadow_ModelViewMatrix=0; +static GLint useShadow_lightSpecularIntensity = 0; +static GLint useShadow_materialSpecularColor = 0; static GLint useShadow_MVP=0; -static GLint useShadow_lightDirIn=0; +static GLint useShadow_lightPosIn=0; +static GLint useShadow_cameraPositionIn = 0; +static GLint useShadow_materialShininessIn = 0; static GLint useShadow_ProjectionMatrix=0; static GLint useShadow_DepthBiasModelViewMatrix=0; @@ -296,7 +309,7 @@ static GLint ProjectionMatrix=0; static GLint regularLightDirIn=0; -static GLint uniform_texture_diffuse = 0; +static GLint uniform_texture_diffuse = 0; static GLint screenWidthPointSprite=0; static GLint ModelViewMatrixPointSprite=0; @@ -1103,13 +1116,18 @@ void GLInstancingRenderer::InitShaders() glLinkProgram(useShadowMapInstancingShader); glUseProgram(useShadowMapInstancingShader); + useShadow_ViewMatrixInverse = glGetUniformLocation(useShadowMapInstancingShader, "ViewMatrixInverse"); useShadow_ModelViewMatrix = glGetUniformLocation(useShadowMapInstancingShader, "ModelViewMatrix"); + useShadow_lightSpecularIntensity = glGetUniformLocation(useShadowMapInstancingShader, "lightSpecularIntensityIn"); + useShadow_materialSpecularColor = glGetUniformLocation(useShadowMapInstancingShader, "materialSpecularColorIn"); useShadow_MVP = glGetUniformLocation(useShadowMapInstancingShader, "MVP"); useShadow_ProjectionMatrix = glGetUniformLocation(useShadowMapInstancingShader, "ProjectionMatrix"); useShadow_DepthBiasModelViewMatrix = glGetUniformLocation(useShadowMapInstancingShader, "DepthBiasModelViewProjectionMatrix"); useShadow_uniform_texture_diffuse = glGetUniformLocation(useShadowMapInstancingShader, "Diffuse"); useShadow_shadowMap = glGetUniformLocation(useShadowMapInstancingShader,"shadowMap"); - useShadow_lightDirIn = glGetUniformLocation(useShadowMapInstancingShader,"lightDirIn"); + useShadow_lightPosIn = glGetUniformLocation(useShadowMapInstancingShader,"lightPosIn"); + useShadow_cameraPositionIn = glGetUniformLocation(useShadowMapInstancingShader,"cameraPositionIn"); + useShadow_materialShininessIn = glGetUniformLocation(useShadowMapInstancingShader,"materialShininessIn"); createShadowMapInstancingShader = gltLoadShaderPair(createShadowMapInstancingVertexShader,createShadowMapInstancingFragmentShader); glLinkProgram(createShadowMapInstancingShader); @@ -1276,6 +1294,15 @@ void GLInstancingRenderer::setActiveCamera(CommonCameraInterface* cam) m_data->m_activeCamera = cam; } +void GLInstancingRenderer::setLightSpecularIntensity(const float lightSpecularIntensity[3]) +{ + m_data->m_lightSpecularIntensity[0] = lightSpecularIntensity[0]; + m_data->m_lightSpecularIntensity[1] = lightSpecularIntensity[1]; + m_data->m_lightSpecularIntensity[2] = lightSpecularIntensity[2]; +} + + + void GLInstancingRenderer::setLightPosition(const float lightPos[3]) { m_data->m_lightPos[0] = lightPos[0]; @@ -1302,6 +1329,21 @@ void GLInstancingRenderer::updateCamera(int upAxis) m_data->m_defaultCamera1.update(); m_data->m_activeCamera->getCameraProjectionMatrix(m_data->m_projectionMatrix); m_data->m_activeCamera->getCameraViewMatrix(m_data->m_viewMatrix); + b3Scalar viewMat[16]; + b3Scalar viewMatInverse[16]; + + for (int i=0;i<16;i++) + { + viewMat[i] = m_data->m_viewMatrix[i]; + } + b3Transform tr; + tr.setFromOpenGLMatrix(viewMat); + tr = tr.inverse(); + tr.getOpenGLMatrix(viewMatInverse); + for (int i=0;i<16;i++) + { + m_data->m_viewMatrixInverse[i]=viewMatInverse[i]; + } } @@ -2131,12 +2173,24 @@ b3Assert(glGetError() ==GL_NO_ERROR); glUseProgram(useShadowMapInstancingShader); glUniformMatrix4fv(useShadow_ProjectionMatrix, 1, false, &m_data->m_projectionMatrix[0]); glUniformMatrix4fv(useShadow_ModelViewMatrix, 1, false, &m_data->m_viewMatrix[0]); + glUniformMatrix4fv(useShadow_ViewMatrixInverse, 1, false, &m_data->m_viewMatrixInverse[0]); + glUniformMatrix4fv(useShadow_ModelViewMatrix, 1, false, &m_data->m_viewMatrix[0]); + + glUniform3f(useShadow_lightSpecularIntensity, m_data->m_lightSpecularIntensity[0],m_data->m_lightSpecularIntensity[1],m_data->m_lightSpecularIntensity[2]); + glUniform3f(useShadow_materialSpecularColor, gfxObj->m_materialSpecularColor[0],gfxObj->m_materialSpecularColor[1],gfxObj->m_materialSpecularColor[2]); + + + float MVP[16]; b3Matrix4x4Mul16(m_data->m_projectionMatrix,m_data->m_viewMatrix,MVP); glUniformMatrix4fv(useShadow_MVP, 1, false, &MVP[0]); - b3Vector3 gLightDir = m_data->m_lightPos; - gLightDir.normalize(); - glUniform3f(useShadow_lightDirIn,gLightDir[0],gLightDir[1],gLightDir[2]); + //gLightDir.normalize(); + glUniform3f(useShadow_lightPosIn,m_data->m_lightPos[0],m_data->m_lightPos[1],m_data->m_lightPos[2]); + float camPos[3]; + m_data->m_activeCamera->getCameraPosition(camPos); + glUniform3f(useShadow_cameraPositionIn,camPos[0],camPos[1],camPos[2]); + glUniform1f(useShadow_materialShininessIn,gfxObj->m_materialShinyNess); + glUniformMatrix4fv(useShadow_DepthBiasModelViewMatrix, 1, false, &depthBiasMVP[0][0]); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, m_data->m_shadowTexture); diff --git a/examples/OpenGLWindow/GLInstancingRenderer.h b/examples/OpenGLWindow/GLInstancingRenderer.h index 62ca92dcf..7f1526ece 100644 --- a/examples/OpenGLWindow/GLInstancingRenderer.h +++ b/examples/OpenGLWindow/GLInstancingRenderer.h @@ -124,6 +124,7 @@ public: virtual void setLightPosition(const float lightPos[3]); virtual void setLightPosition(const double lightPos[3]); + void setLightSpecularIntensity(const float lightSpecularIntensity[3]); virtual void resize(int width, int height); virtual int getScreenWidth() diff --git a/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.glsl b/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.glsl index ad12e3b0c..809494902 100644 --- a/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.glsl +++ b/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.glsl @@ -13,9 +13,14 @@ in Vert uniform sampler2D Diffuse; uniform sampler2DShadow shadowMap; +uniform mat4 ViewMatrixInverse; -in vec3 lightDir,normal,ambient; +in vec3 lightPos,cameraPosition, normal,ambient; in vec4 ShadowCoord; +in vec4 vertexPos; +in float materialShininess; +in vec3 lightSpecularIntensity; +in vec3 materialSpecularColor; out vec4 color; @@ -28,8 +33,11 @@ void main(void) float intensity,at,af; if (fragment.color.w==0) discard; - - intensity = 0.5+0.5*clamp( dot( normalize(normal),lightDir ), -1,1 ); + vec3 lightDir = normalize(lightPos); + + vec3 normalDir = normalize(normal); + + intensity = 0.5+0.5*clamp( dot( normalDir,lightDir ), -1,1 ); af = 1.0; @@ -38,7 +46,24 @@ void main(void) //float bias = 0.005f; + vec3 specularReflection; + if (dot(normalDir, lightDir) < 0.0) + { + specularReflection = vec3(0.0, 0.0, 0.0); + } + else // light source on the right side + { + vec3 surfaceToLight = normalize(lightPos - vertexPos.xyz); + vec3 surfaceToCamera = normalize(cameraPosition - vertexPos.xyz); + + + float specularCoefficient = 0.0; + specularCoefficient = pow(max(0.0, dot(surfaceToCamera, reflect(-surfaceToLight, normalDir))), materialShininess); + specularReflection = specularCoefficient * materialSpecularColor * lightSpecularIntensity; + + } + float visibility = texture(shadowMap, vec3(ShadowCoord.xy,(ShadowCoord.z)/ShadowCoord.w)); if (intensity<0.5) @@ -46,6 +71,6 @@ void main(void) intensity = 0.7*intensity + 0.3*intensity*visibility; - cf = intensity*(vec3(1.0,1.0,1.0)-ambient)+ambient; + cf = intensity*(vec3(1.0,1.0,1.0)-ambient)+ambient+specularReflection*visibility; color = vec4(ct * cf, fragment.color.w); } diff --git a/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.h b/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.h index c2a6a306f..e34883d85 100644 --- a/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.h +++ b/examples/OpenGLWindow/Shaders/useShadowMapInstancingPS.h @@ -12,8 +12,13 @@ static const char* useShadowMapInstancingFragmentShader= \ "} vert;\n" "uniform sampler2D Diffuse;\n" "uniform sampler2DShadow shadowMap;\n" -"in vec3 lightDir,normal,ambient;\n" +"uniform mat4 ViewMatrixInverse;\n" +"in vec3 lightPos,cameraPosition, normal,ambient;\n" "in vec4 ShadowCoord;\n" +"in vec4 vertexPos;\n" +"in float materialShininess;\n" +"in vec3 lightSpecularIntensity;\n" +"in vec3 materialSpecularColor;\n" "out vec4 color;\n" "void main(void)\n" "{\n" @@ -22,7 +27,11 @@ static const char* useShadowMapInstancingFragmentShader= \ " float intensity,at,af;\n" " if (fragment.color.w==0)\n" " discard;\n" -" intensity = 0.5+0.5*clamp( dot( normalize(normal),lightDir ), -1,1 );\n" +" vec3 lightDir = normalize(lightPos);\n" +" \n" +" vec3 normalDir = normalize(normal);\n" +" \n" +" intensity = 0.5+0.5*clamp( dot( normalDir,lightDir ), -1,1 );\n" " \n" " af = 1.0;\n" " \n" @@ -31,13 +40,30 @@ static const char* useShadowMapInstancingFragmentShader= \ " \n" " //float bias = 0.005f;\n" " \n" +" vec3 specularReflection;\n" " \n" +" if (dot(normalDir, lightDir) < 0.0) \n" +" {\n" +" specularReflection = vec3(0.0, 0.0, 0.0);\n" +" }\n" +" else // light source on the right side\n" +" {\n" +" vec3 surfaceToLight = normalize(lightPos - vertexPos.xyz);\n" +" vec3 surfaceToCamera = normalize(cameraPosition - vertexPos.xyz);\n" +" \n" +" \n" +" float specularCoefficient = 0.0;\n" +" specularCoefficient = pow(max(0.0, dot(surfaceToCamera, reflect(-surfaceToLight, normalDir))), materialShininess);\n" +" specularReflection = specularCoefficient * materialSpecularColor * lightSpecularIntensity;\n" +" \n" +" }\n" +" \n" " float visibility = texture(shadowMap, vec3(ShadowCoord.xy,(ShadowCoord.z)/ShadowCoord.w));\n" " if (intensity<0.5)\n" " visibility = 0;\n" " intensity = 0.7*intensity + 0.3*intensity*visibility;\n" " \n" -" cf = intensity*(vec3(1.0,1.0,1.0)-ambient)+ambient;\n" +" cf = intensity*(vec3(1.0,1.0,1.0)-ambient)+ambient+specularReflection*visibility;\n" " color = vec4(ct * cf, fragment.color.w);\n" "}\n" ; diff --git a/examples/OpenGLWindow/Shaders/useShadowMapInstancingVS.glsl b/examples/OpenGLWindow/Shaders/useShadowMapInstancingVS.glsl index 222e73cfd..3f9601f44 100644 --- a/examples/OpenGLWindow/Shaders/useShadowMapInstancingVS.glsl +++ b/examples/OpenGLWindow/Shaders/useShadowMapInstancingVS.glsl @@ -15,7 +15,12 @@ uniform mat4 ModelViewMatrix; uniform mat4 ProjectionMatrix; uniform mat4 DepthBiasModelViewProjectionMatrix; uniform mat4 MVP; -uniform vec3 lightDirIn; +uniform vec3 lightPosIn; +uniform vec3 cameraPositionIn; +uniform mat4 ViewMatrixInverse; +uniform float materialShininessIn; +uniform vec3 lightSpecularIntensityIn; +uniform vec3 materialSpecularColorIn; out vec4 ShadowCoord; @@ -60,7 +65,13 @@ vec4 quatRotate ( in vec4 p, in vec4 q ) return quatMul ( temp, vec4 ( -q.x, -q.y, -q.z, q.w ) ); } -out vec3 lightDir,normal,ambient; +out vec3 lightPos,normal,ambient; +out vec4 vertexPos; +out vec3 cameraPosition; +out float materialShininess; +out vec3 lightSpecularIntensity; +out vec3 materialSpecularColor; + void main(void) { @@ -69,15 +80,19 @@ void main(void) vec4 worldNormal = (quatRotate3( vertexnormal,q)); - normal = normalize(worldNormal).xyz; + normal = worldNormal.xyz; - lightDir = lightDirIn; - + lightPos = lightPosIn; + cameraPosition = cameraPositionIn; + materialShininess = materialShininessIn; + lightSpecularIntensity = lightSpecularIntensityIn; + materialSpecularColor = materialSpecularColorIn; vec4 localcoord = quatRotate3( position.xyz*instance_scale,q); - vec4 vertexPos = MVP* vec4((instance_position+localcoord).xyz,1); - - gl_Position = vertexPos; + vertexPos = vec4((instance_position+localcoord).xyz,1); + + vec4 vertexLoc = MVP* vec4((instance_position+localcoord).xyz,1); + gl_Position = vertexLoc; ShadowCoord = DepthBiasModelViewProjectionMatrix * vec4((instance_position+localcoord).xyz,1); fragment.color = instance_color; diff --git a/examples/OpenGLWindow/Shaders/useShadowMapInstancingVS.h b/examples/OpenGLWindow/Shaders/useShadowMapInstancingVS.h index a98e44f82..0800c2cd0 100644 --- a/examples/OpenGLWindow/Shaders/useShadowMapInstancingVS.h +++ b/examples/OpenGLWindow/Shaders/useShadowMapInstancingVS.h @@ -13,7 +13,12 @@ static const char* useShadowMapInstancingVertexShader= \ "uniform mat4 ProjectionMatrix;\n" "uniform mat4 DepthBiasModelViewProjectionMatrix;\n" "uniform mat4 MVP;\n" -"uniform vec3 lightDirIn;\n" +"uniform vec3 lightPosIn;\n" +"uniform vec3 cameraPositionIn;\n" +"uniform mat4 ViewMatrixInverse;\n" +"uniform float materialShininessIn;\n" +"uniform vec3 lightSpecularIntensityIn;\n" +"uniform vec3 materialSpecularColorIn;\n" "out vec4 ShadowCoord;\n" "out Fragment\n" "{\n" @@ -51,7 +56,12 @@ static const char* useShadowMapInstancingVertexShader= \ " vec4 temp = quatMul ( q, p );\n" " return quatMul ( temp, vec4 ( -q.x, -q.y, -q.z, q.w ) );\n" "}\n" -"out vec3 lightDir,normal,ambient;\n" +"out vec3 lightPos,normal,ambient;\n" +"out vec4 vertexPos;\n" +"out vec3 cameraPosition;\n" +"out float materialShininess;\n" +"out vec3 lightSpecularIntensity;\n" +"out vec3 materialSpecularColor;\n" "void main(void)\n" "{\n" " vec4 q = instance_quaternion;\n" @@ -59,13 +69,18 @@ static const char* useShadowMapInstancingVertexShader= \ " \n" " vec4 worldNormal = (quatRotate3( vertexnormal,q));\n" " \n" -" normal = normalize(worldNormal).xyz;\n" -" lightDir = lightDirIn;\n" -" \n" +" normal = worldNormal.xyz;\n" +" lightPos = lightPosIn;\n" +" cameraPosition = cameraPositionIn;\n" +" materialShininess = materialShininessIn;\n" +" lightSpecularIntensity = lightSpecularIntensityIn;\n" +" materialSpecularColor = materialSpecularColorIn;\n" " \n" " vec4 localcoord = quatRotate3( position.xyz*instance_scale,q);\n" -" vec4 vertexPos = MVP* vec4((instance_position+localcoord).xyz,1);\n" -" gl_Position = vertexPos;\n" +" vertexPos = vec4((instance_position+localcoord).xyz,1);\n" +" \n" +" vec4 vertexLoc = MVP* vec4((instance_position+localcoord).xyz,1);\n" +" gl_Position = vertexLoc;\n" " ShadowCoord = DepthBiasModelViewProjectionMatrix * vec4((instance_position+localcoord).xyz,1);\n" " fragment.color = instance_color;\n" " vert.texcoord = uvcoords;\n"