Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

GLSL - Shader Phonga

Ostatnio zmodyfikowano 2014-03-02 12:59
Autor Wiadomość
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:
C/C++
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:
C/C++
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:
C/C++
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!
P-105449
DejaVu
» 2014-03-01 20:46:38
P-105461
oputyk
Temat założony przez niniejszego użytkownika
» 2014-03-01 21:13:05
Tak, teraz już ustawiłem, ale nic to nie dało - zero zmian. Działa światło rozproszone, ale niestety nie pełny shader ADS.
P-105463
DejaVu
» 2014-03-02 04:11:20
Twoja karta graficzna wspiera shadery w tym stopniu, w którym chcesz je wykorzystać?
P-105479
oputyk
Temat założony przez niniejszego użytkownika
» 2014-03-02 12:59:10
Dobra, udało się. Błąd w shaderze fragmentów. Poprawiam kod i zamykam temat. Dzięki za odpowiedzi ;)
P-105500
« 1 »
  Strona 1 z 1