oputyk Temat założony przez niniejszego użytkownika |
GLSL - Shader Phonga » 2014-03-01 16:11:47 Mam taki oto shader: Wierzchołków: in vec4 vVertex; in vec3 vNormal;
uniform mat4 mvpMatrix; uniform mat4 mvMatrix; uniform mat3 normalMatrix; uniform vec3 vLightPosition;
out vec3 vVaryingNormal; out vec3 vVaryingLightDir; void main( void ) { vVaryingNormal = normalMatrix * vNormal; vec4 vPosition4 = mvMatrix * vVertex; vec3 vPosition3 = vPosition4.xyz / vPosition4.w; vVaryingLightDir = normalize( vLightPosition - vPosition3 ); gl_Position = mvpMatrix * vVertex; }
Fragmentów: out vec4 vFragColor;
uniform vec4 ambientColor; uniform vec4 diffuseColor; uniform vec4 specularColor;
in vec3 vVaryingNormal; in vec3 vVaryingLightDir; void main( void ) { float diff = max( 0.0, dot( normalize( vVaryingNormal ), normalize( vVaryingLightDir ) ) ); vFragColor = diff * diffuseColor; vFragColor += ambientColor; vec3 vReflection = normalize( reflect( - normalize( vVaryingLightDir ), normalize( vVaryingNormal ) ) ); float spec = max( 0.0, dot( normalize( vVaryingNormal ), vReflection ) ); if( diff != 0 ) { float fSpec = pow( spec, 128.0 ); vFragColor.rgb += vec3( fSpec, fSpec, fSpec ); } }
W tym shaderze działa światło rozproszone (diffuse), ale nie działa światło otaczające (ambient) i odbicia lustrzanego (specular). Nie wiem, czy jest to wina shadera, czy może kodu klienckiego: GLShaderManager shaderManager; GLGeometryTransform M; GLMatrixStack M1; GLMatrixStack M2; GLFrustum frustum; GLFrame camera; GLTriangleBatch btch; GLuint ShaderID; GLuint locDColor, locAColor, locSColor; GLuint locLight; GLuint locMVP; GLuint locMV; GLuint locNM; void ChangeSize( int w, int h ) { if( h == 0 ) h = 1; glViewport( 0, 0, w, h ); frustum.SetPerspective( 80.0f, float( w ) / float( h ), 1.0f, 1000.0f ); M2.LoadMatrix( frustum.GetProjectionMatrix() ); M.SetMatrixStacks( M1, M2 ); } void SetupRC() { glClearColor( 0.0f, 0.0f, 1.0f, 1.0f ); glEnable( GL_DEPTH_TEST ); glEnable( GL_CULL_FACE ); camera.MoveForward( - 4.0f ); gltMakeTorus( btch, 0.8f, 0.15f, 50, 20 ); ShaderID = gltLoadShaderPairWithAttributes( "shd.vp", "shd.fp", 2, GLT_ATTRIBUTE_VERTEX, "vVertex", GLT_ATTRIBUTE_NORMAL, "vNormal" ); locDColor = glGetUniformLocation( ShaderID, "diffuseColor" ); locAColor = glGetUniformLocation( ShaderID, "ambientColor" ); locSColor = glGetUniformLocation( ShaderID, "specularColor" ); locLight = glGetUniformLocation( ShaderID, "vLightPosition" ); locMVP = glGetUniformLocation( ShaderID, "mvpMatrix" ); locMV = glGetUniformLocation( ShaderID, "mvMatrix" ); locNM = glGetUniformLocation( ShaderID, "normalMatrix" ); } void RenderScene() { static sf::Clock clock; if( sf::Keyboard::isKeyPressed( sf::Keyboard::Up ) || sf::Keyboard::isKeyPressed( sf::Keyboard::W ) ) camera.MoveForward( 0.005f ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Down ) || sf::Keyboard::isKeyPressed( sf::Keyboard::S ) ) camera.MoveForward( - 0.005f ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Left ) ) camera.RotateWorld( m3dDegToRad( 0.1f ), 0.0f, 1.0f, 0.0f ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Right ) ) camera.RotateWorld( - m3dDegToRad( 0.1f ), 0.0f, 1.0f, 0.0f ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) ) camera.MoveRight( 0.005f ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) ) camera.MoveRight( - 0.005f ); if( sf::Keyboard::isKeyPressed( sf::Keyboard::Escape ) ) exit( 0 ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); GLfloat vEyeLight[] = { - 100.0f, 100.0f, 100.0f }; GLfloat vDiffuseColor[] = { 1.0f, 0.0f, 0.0f, 1.0f }; GLfloat vAmbientColor[] = { 0.0f, 1.0f, 0.0f, 1.0f }; GLfloat vSpecularColor[] = { 0.0f, 0.0f, 1.0f, 1.0f }; M3DMatrix44f mcamera; camera.GetCameraMatrix( mcamera ); M1.PushMatrix(); M1.PushMatrix( mcamera ); M1.Rotate( clock.getElapsedTime().asSeconds() * 60.0f, 0.0f, 1.0f, 0.0f ); glUseProgram( ShaderID ); glUniform4fv( locDColor, 1, vDiffuseColor ); glUniform4fv( locAColor, 1, vAmbientColor ); glUniform4fv( locSColor, 1, vSpecularColor ); glUniform3fv( locLight, 1, vEyeLight ); glUniformMatrix4fv( locMVP, 1, GL_FALSE, M.GetModelViewProjectionMatrix() ); glUniformMatrix4fv( locMV, 1, GL_FALSE, M.GetModelViewMatrix() ); glUniformMatrix3fv( locNM, 1, GL_FALSE, M.GetNormalMatrix() ); btch.Draw(); M1.PopMatrix(); M1.PushMatrix( mcamera ); M1.Translate( - 4.0f, 0.0f, 6.0f ); glUseProgram( ShaderID ); glUniform4fv( locDColor, 1, vDiffuseColor ); glUniform4fv( locAColor, 1, vAmbientColor ); glUniform4fv( locSColor, 1, vSpecularColor ); glUniform3fv( locLight, 1, vEyeLight ); glUniformMatrix4fv( locMVP, 1, GL_FALSE, M.GetModelViewProjectionMatrix() ); glUniformMatrix4fv( locMV, 1, GL_FALSE, M.GetModelViewMatrix() ); glUniformMatrix3fv( locNM, 1, GL_FALSE, M.GetNormalMatrix() ); btch.Draw(); M1.PopMatrix(); M1.PopMatrix(); glutSwapBuffers(); glutPostRedisplay(); } int main( int argc, char * argv[] ) { gltSetWorkingDirectory( argv[ 0 ] ); glutInit( & argc, argv ); glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH ); glutInitWindowSize( 800, 600 ); glutCreateWindow( "OpenGL - Window" ); glutReshapeFunc( ChangeSize ); glutDisplayFunc( RenderScene ); GLenum err = glewInit(); if( GLEW_OK != err ) { std::cout << err << std::endl; return 1; } SetupRC(); glutMainLoop(); }
Z góry dzięki za pomoc! |