From 5bc7ecf7999439d4a16d83b8f135a1b6aed30958 Mon Sep 17 00:00:00 2001 From: dfighter1985 Date: Tue, 3 Sep 2013 00:18:38 +0200 Subject: [PATCH] Specular shader is now on GLSL. --HG-- branch : gsoc2013-dfighter --- .../driver/OpenGL3/driver_opengl_material.cpp | 87 ++++++++----------- .../driver/OpenGL3/driver_opengl_program.cpp | 15 ++++ 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/code/nel/src/3d/driver/OpenGL3/driver_opengl_material.cpp b/code/nel/src/3d/driver/OpenGL3/driver_opengl_material.cpp index e4aa2d38c..f7fb430ea 100644 --- a/code/nel/src/3d/driver/OpenGL3/driver_opengl_material.cpp +++ b/code/nel/src/3d/driver/OpenGL3/driver_opengl_material.cpp @@ -1078,9 +1078,11 @@ void CDriverGL3::setupSpecularBegin() // For all cases, setup the TexCoord gen for stage1 _DriverGLStates.activeTextureARB(1); +#ifndef GLSL // todo hulud remove // _DriverGLStates.setTextureMode(CDriverGLStates3::TextureCubeMap); _DriverGLStates.setTexGenMode (1, GL_REFLECTION_MAP_ARB); +#endif // setup the good matrix for stage 1. _UserTexMat[ 1 ] = _SpecularTexMtx; @@ -1128,11 +1130,8 @@ sint CDriverGL3::beginSpecularMultiPass() if(!_Extensions.ARBTextureCubeMap) return 1; - - if( _Extensions.ATITextureEnvCombine3) // NVidia or ATI optimization - return 1; - else - return 2; + + return 1; } // *************************************************************************** @@ -1148,8 +1147,35 @@ void CDriverGL3::setupSpecularPass(uint pass) // NB: setupMaterial() code has correclty setuped textures. return; } + +#ifdef GLSL + + int sl0 = getUniformLocation( "sampler0" ); + if( sl0 != -1 ) + { + setUniform1i( sl0, 0 ); + } + + int sl1 = getUniformLocation( "cubeSampler" ); + if( sl1 != -1 ) + { + setUniform1i( sl1, 1 ); + } + + int mvl = getUniformLocation( "mvMatrix" ); + if( mvl != -1 ) + { + setUniformMatrix4fv( mvl, 1, false, _ModelViewMatrix.get() ); + } + + int tml = getUniformLocation( "texMatrix" ); + if( tml != -1 ) + { + setUniformMatrix4fv( mvl, 1, false, _UserTexMat[ 1 ].get() ); + } + +#endif - if (_Extensions.ATITextureEnvCombine3) { // Ok we can do it in a single pass @@ -1167,6 +1193,9 @@ void CDriverGL3::setupSpecularPass(uint pass) _CurrentTexEnvSpecial[1] = newEnvStage1; _DriverGLStates.activeTextureARB(1); + +#ifndef GLSL + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT); // Operator Add (Arg0*Arg2+Arg1) glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_MODULATE_ADD_ATI ); @@ -1198,53 +1227,9 @@ void CDriverGL3::setupSpecularPass(uint pass) // Arg1. glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT, GL_ZERO ); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_EXT, GL_SRC_ALPHA); - } - } - else - { - // We have to do it in 2 passes - // For Both Pass, setup correct Env. - if( pass == 0 ) - { - // Just display the texture - _DriverGLStates.enableBlend(false); - _DriverGLStates.activeTextureARB(1); - _DriverGLStates.setTextureMode(CDriverGLStates3::TextureDisabled); - } - else - { - // Multiply texture1 by alpha_texture0 and display with add - _DriverGLStates.enableBlend(true); - _DriverGLStates.blendFunc(GL_ONE, GL_ONE); - - // Set stage 0 - _DriverGLStates.activeTextureARB(0); - CMaterial::CTexEnv env; - - env.Env.OpRGB = CMaterial::Replace; - env.Env.SrcArg0RGB = CMaterial::Texture; - env.Env.OpArg0RGB = CMaterial::SrcAlpha; - - activateTexEnvMode(0, env); - - // Set stage 1 - if( mat.getTexture(0) == NULL ) - { - env.Env.OpRGB = CMaterial::Replace; - env.Env.SrcArg0RGB = CMaterial::Texture; - env.Env.OpArg0RGB = CMaterial::SrcColor; - } - else - { - env.Env.OpRGB = CMaterial::Modulate; - env.Env.SrcArg0RGB = CMaterial::Texture; - env.Env.OpArg0RGB = CMaterial::SrcColor; - env.Env.SrcArg1RGB = CMaterial::Previous; - env.Env.OpArg1RGB = CMaterial::SrcColor; - } +#endif - activateTexEnvMode(1, env); } } } diff --git a/code/nel/src/3d/driver/OpenGL3/driver_opengl_program.cpp b/code/nel/src/3d/driver/OpenGL3/driver_opengl_program.cpp index c8fd44b22..be5cb1453 100644 --- a/code/nel/src/3d/driver/OpenGL3/driver_opengl_program.cpp +++ b/code/nel/src/3d/driver/OpenGL3/driver_opengl_program.cpp @@ -22,12 +22,18 @@ namespace NL3D if( !program->isLinked() ) return false; + /* nglValidateProgram( program->getProgramId() ); GLint ok; nglGetProgramiv( program->getProgramId(), GL_VALIDATE_STATUS, &ok ); if( ok != GL_TRUE ) + { + char errorLog[ 1024 ]; + nglGetProgramInfoLog( program->getProgramId(), 1024, NULL, errorLog ); return false; + } + */ nglUseProgram( program->getProgramId() ); @@ -218,6 +224,11 @@ namespace NL3D beginLightMapMultiPass(); setupLightMapPass( 0 ); break; + + case CMaterial::Specular: + beginSpecularMultiPass(); + setupSpecularPass( 0 ); + break; } #endif @@ -231,6 +242,10 @@ namespace NL3D case CMaterial::LightMap: endLightMapMultiPass(); break; + + case CMaterial::Specular: + endSpecularMultiPass(); + break; } delete p;