Orario: 22-05-2013, 18:05 Benvenuto ospite! (Log inRegistrati)


Rispondi 
material passes in ogre3d
Autore Messaggio
Jak
Vaporizator

Messaggi: 471
Registrato: Jul 2011
Offline Offline
#1 material passes in ogre3d
0
Sto studicchiando gli shader(per ora in cg) usando ogre. Dopo qualche test per imparare qualche base ho provato a modificare il materiale Examples/BumpMapping/MultiLight che si trova tra i materiali standard dell'sdk aggiungendoci uno specular decente.
Usando la classica versione con lo specular integrato viene prima calcolato diffuse e specular per ogni luce ed infine moltiplicato per la texture(con un'altra passata) ma per dare un risultato "più meglio" ho pensato di dividere lo specular dal diffuse quindi addare lo specular dopo la pass per la texture.
Lo shader funge bene(è quasi identico all'originale) ma il blendmode della pass per lo specular viene completamente ignorato e mi tiene il modulate della decal pass di conseguenza anzichè addare il fattore specular lo moltiplica dando un risultato sbagliato.
Ho cercato in giro ma non riesco a capire come mai non usa il blend mode che voglio io Hmm
Il codice del materiale è questo (gli shader non li metto in quanto, usati separatamente, risultano corretti)

Codice:
material BumpLegnoJak
{

    // This is the preferred technique which uses both vertex and
    // fragment programs, supports coloured lights
    technique
    {
        // Base ambient pass
        pass ambient
        {
            // base colours, not needed for rendering, but as information
            // to lighting pass categorisation routine
            ambient 1 1 0
            diffuse 0 0 0
            specular 0 0 0 0
            // Really basic vertex program
            // NB we don't use fixed function here because GL does not like
            // mixing fixed function and vertex programs, depth fighting can
            // be an issue
            vertex_program_ref Ogre/BasicVertexPrograms/AmbientOneTexture
            {
                param_named_auto worldViewProj worldviewproj_matrix
                param_named_auto ambient ambient_light_colour
            }
            
        }
        // Now do the lighting pass
        // NB we don't do decal texture here because this is repeated per light
        pass perlight
        {
            // base colours, not needed for rendering, but as information
            // to lighting pass categorisation routine
            ambient 0 0 0
            
            // do this for each light
            iteration once_per_light

            scene_blend add

            // Vertex program reference
            vertex_program_ref Jak/BumpMapVP
            {
                param_named_auto lightPosition light_position_object_space 0
                param_named_auto worldViewProj worldviewproj_matrix
            }

            // Fragment program
            fragment_program_ref Jak/BumpMapFP
            {
                param_named_auto lightDiffuse light_diffuse_colour 0
            }
            
            // Base bump map
            texture_unit normalmap
            {
                texture Tex_legno_bump.png
                colour_op replace
                //filtering anisotropic anisotropic none
                //max_anisotropy 8
            }
        }

        // Decal pass
        pass decal
        {
            // base colours, not needed for rendering, but as information
            // to lighting pass categorisation routine
            lighting off
            // Really basic vertex program
            // NB we don't use fixed function here because GL does not like
            // mixing fixed function and vertex programs, depth fighting can
            // be an issue
            vertex_program_ref Ogre/BasicVertexPrograms/AmbientOneTexture
            {
                param_named_auto worldViewProj worldviewproj_matrix
                param_named ambient float4 1 1 1 1
            }
            scene_blend dest_colour zero
            texture_unit decalmap
            {
                texture Tex_legno.png
                //filtering anisotropic anisotropic none
                //max_anisotropy 8
            }
            
        }
        
        pass perlightspecular
        {
            // base colours, not needed for rendering, but as information
            // to lighting pass categorisation routine
            ambient 0 0 0
            
            // do this for each light
            iteration once_per_light

            scene_blend add

            // Vertex program reference
            vertex_program_ref Jak/BumpMapVPSpecular
            {
                param_named_auto lightPosition light_position_object_space 0
                param_named_auto eyePosition camera_position_object_space
                param_named_auto worldViewProj worldviewproj_matrix
            }

            // Fragment program
            fragment_program_ref Jak/BumpMapFPSpecular
            {
                param_named_auto lightDiffuse light_diffuse_colour 0
                param_named_auto lightSpecular light_specular_colour 0
            }

            // Base bump map
            texture_unit normalmap
            {
                texture Tex_legno_bump.png
                colour_op replace
                //filtering anisotropic anisotropic none
                //max_anisotropy 8
            }
        }
        
    }
}
Se la passata dello specular la inserisco prima della decal pass usa il blend mode che gli indico mentre se lo descrivo dopo la decal ignora il blend mode ed usa modulate Hmm
Non riesco a capire dove sbaglio(e se sono io che sbaglio)
Non fate caso a commenti strani e robe così, come ho detto sto ancora imparando e quindi quelle sono prove o robe varie che voglio ricordare
EDIT: Anche cambiando il blend mode della decal lo specular ha sempre e comunque blend mode modulate...
Ho provato a modificare lo shader usando 0 come colore di output(così in add dovrebbe essere come se non avessi mai fatto niente) per essere sicuro non ci fossero problemi con numeri negativi ma l'oggetto viene tutto nero(quindi usa modulate)

EDIT2: Ok, mi dava un compile error(non si sa perchè) per via del parametro inutilizzato della light diffuse sulla parte dello specular. Togliendolo ho evitato l'errore sul log ma non è cambiato niente.
Sono riuscito a farlo funzionare usando ombre stencil modulative o togliendole completamente ma con le ombre stencil in additive resta quel problema e non ho idea di come risolverlo.

EDIT3: Risolto, a quanto pare un'errore di un'altro materiale dava problemi su questo per strane ragioni...
(Questo messaggio è stato modificato l'ultima volta il: 21-02-2012 17:06 da Jak.)
19-02-2012 12:49
Trova tutti i messaggi di questo utente Cita questo messaggio nella tua risposta
Rispondi 


Vai al forum: