Environment Buffer

Wie schreibt man ein Phenomenon, bzw. einen Shader?

Environment Buffer

Postby jb_alvarado on Wed Jan 30, 2008 16:00 pm

Irgendwie scheitere ich immer noch an den einfachsten Dingen... Mir ist aufgefallen, dass zu dem mia_buffer phen noch eine Environment Buffer fehlt. Das wollte ich jetzt mal nachholen. Allerdings hab ich da noch zwei Probleme. Ich weiß nicht, wie ich es hin bekomme, das der komplette Environment raus geschrieben werden kann. Momentan wird mir noch die Stelle, wo eine Geometrie ist, herausgeschnitten. Geht zu not auch, aber lieber wäre mir, wenn das nicht passieren würde. Dann hätte ich gerne noch die Option drin, dass man im Environment Buffer festlegen kann, in welchen Pass das ganze geschrieben werden soll. So geht es leider nicht:

Code: Select all

typedef struct
{
   miColor    render;
   miBoolean    enable_fb0;
   miColor    buffer_0;
   miInteger   buffer_num1;
   miBoolean    enable_fb1;
   miColor    buffer_1;
   miInteger   buffer_num2;

}environment_buffer_t;

extern "C"
{
DLLEXPORT int environment_buffer_version( void ) { return( 2 ); }

DLLEXPORT miBoolean environment_buffer(
      miColor *result,
      miState *state,
      environment_buffer_t *paras)
{
    miInteger num1 = *mi_eval_integer( &paras->buffer_num1 );
    miInteger num2 = *mi_eval_integer( &paras->buffer_num2 );    
   
   
   if( state->type == miRAY_SHADOW || state->type == miRAY_DISPLACE )
      return miFALSE;

   if(( state->type == miRAY_ENVIRONMENT ) || ( state->type == miRAY_TRANSPARENT ))
   {
      if( *mi_eval_boolean( &paras->enable_fb0 ))
         mi_fb_put( state, num1, mi_eval_color( &paras->buffer_0 ));

      if( *mi_eval_boolean( &paras->enable_fb1 ))
         mi_fb_put( state, num2, mi_eval_color( &paras->buffer_1 ));
   }
   
   *result = *mi_eval_color( &paras->render );
   return( miTRUE );
}
}



Bei
Code: Select all
mi_fb_put( state, num1, mi_eval_color( &paras->buffer_0 ));
dachte ich, ich könnte einfach num1 nehmen, aber das ist wohl nicht der Fall. Also müsste ich wohl das ganze verschachteln...

Mi-File:

Code: Select all


declare shader "environment_buffer" (
   color       "render",
   boolean    "enable_fb0",
   color       "buffer_0",
   integer      "buffer_num1",
   boolean    "enable_fb1",
   color       "buffer_1",
   integer      "buffer_num2"
   )
   
   apply environment, texture
   version 2
end declare



Freue mich über Vorschläge :)
User avatar
jb_alvarado
Moderator
 
Posts: 2021
Joined: Sun Nov 12, 2006 20:16 pm
Location: Dornbirn

Postby jb_alvarado on Wed Jan 30, 2008 16:17 pm

Ah cool, geht doch. Es lag an:
miRAY_ENVIRONMENT

Habe es durch miRAY_EYE ersetzt...

Jetzt hätte ich nur noch das Problem, dass mir die Geometrie raus geschnitten wird.
User avatar
jb_alvarado
Moderator
 
Posts: 2021
Joined: Sun Nov 12, 2006 20:16 pm
Location: Dornbirn

Postby banned on Wed Jan 30, 2008 16:44 pm

aha baust du das gleich in mia_buffer phen ein und braucht man jetzt einen extra buffer writer oder wie?
banned
 

Postby jb_alvarado on Wed Jan 30, 2008 16:53 pm

Das wird eine Komponente des mia_buffer phens, richtig. Allerdings nicht für den Material Hintergrund, sondern für den Globalen Hintergrund. Netter Nebeneffekt davon ist, dass man bei diesem Shader 2 Hintergründe angeben kann. Einmal den Primären, z.B. den physical sky, dieser wird auch in das Rendering mit einbezogen. Und einmal einen sekundären Hintergrund, z.B. für ein Image. Der sekundäre Hintergrund bleibt auch unberührt von der Belichtungssteuerung. Finde ich ganz praktisch...

Werde versuchen nach und nach die wichtigsten Shader pass-rendering- fähig zu machen. Und ein Hintergrund Pass darf dabei natürlich nicht fehlen :).
Den Hintergrund über das Element Rendering raus zu schreiben, fällt ja zurzeit flach, da das komische Sachen macht.

Einen extra buffer writer braucht man nicht. Allerdings muss man ein wenig mit der Menge der Passes aufpassen. Zurzeit gehen ja nur insgesamt 15...
Last edited by jb_alvarado on Wed Jan 30, 2008 16:55 pm, edited 1 time in total.
User avatar
jb_alvarado
Moderator
 
Posts: 2021
Joined: Sun Nov 12, 2006 20:16 pm
Location: Dornbirn

Postby haggi on Wed Jan 30, 2008 16:55 pm

Was hast du denn in deine buffer_0 und buffer_1 reinconnected?

Wenn ich das korrekt verstehe, dann sollte miRAY_ENVIRONMENT korrekt sein. miRAY_EYE sind alle primary rays von der Kamera aus, das würde heissen dass du zwar dein environment bekommst aber auch alle andere, oder sehe ich das falsch?
haggi
Admin
 
Posts: 752
Joined: Wed Jan 10, 2007 0:56 am

Postby jb_alvarado on Wed Jan 30, 2008 17:01 pm

In buffer_0 habe ich den physical sky rein gepackt und in buffer_1 ein Image. Verwenden tue ich dafür die buffer 32 und 33.
Ja du hast recht, durch miRAY_EYE wird quasi alles mit einbezogen. Allerdings ist dort, wo eine Geometrie ist schwarz. Im Alpha- Kanal ist es umgekehrt, der Hintergrund ist schwarz und die Geometrie weiß.
User avatar
jb_alvarado
Moderator
 
Posts: 2021
Joined: Sun Nov 12, 2006 20:16 pm
Location: Dornbirn

Postby jb_alvarado on Wed Jan 30, 2008 17:42 pm

Hm, gibts keinen allgemeinen Ray für Geometrien? Hab mal folgendes versucht:

Code: Select all
   if( state->type == miRAY_HULL )
            return ( miTRUE );


bzw.:

Code: Select all

if( state->type == miRAY_HULL )
      return (mi_trace_continue( result, state ));


Allerdings kommt dabei das gleiche raus, als wenn ichs ganz weglassen würde.
User avatar
jb_alvarado
Moderator
 
Posts: 2021
Joined: Sun Nov 12, 2006 20:16 pm
Location: Dornbirn

Postby haggi on Wed Jan 30, 2008 19:33 pm

Hmmm.... mal überlegen was da passiert. Du hast auf deinem objekt den shader drauf. Im normalen "render" slot parameter deines shaders hast du den normalen shder reinconnected und der wird einfach weitergegeben. Das heisst der primary buffer deines Renderings sollte okay sein. Oder ist es da schon nicht korrekt?

Was passiert denn wenn du statt des physical sky mal nen lambert draufpackst?
haggi
Admin
 
Posts: 752
Joined: Wed Jan 10, 2007 0:56 am

Postby jb_alvarado on Wed Jan 30, 2008 20:10 pm

Hm, eigentlich geht es mir ja darum den shader im Szene Environment zu benutzen und zwar so, dass nur der Hintergrund ohne Objekte im Pass erscheint. Aber wenn ich ihn so anwende, wie du gerade beschrieben hast, auch mit Lambert, funktioniert er auch (miRAY_Hull ist wieder raus geflogen).
Wobei mir auch aufgefallen ist, dass meine Passes aus dem mia_material keinen Alpha- Kanal besitzen, zu mindest nicht jeder (diffuse z.b.). Daher ist es gar nicht so verkehrt wenn mein Environment- Pass eine Alphamaske hat.
User avatar
jb_alvarado
Moderator
 
Posts: 2021
Joined: Sun Nov 12, 2006 20:16 pm
Location: Dornbirn

Postby haggi on Thu Jan 31, 2008 11:55 am

Wenn du den Hintergrund haben willst, dann musst du vermeiden dass der Body gerendert wird. Dazu kannst du die Funktion mi_trace_environment() verwenden. Ansonsten wird dein Environment auf dem Körper evaluiert was vermutlich merkwürdig aussehen kann, oder gar nicht funktionniert. Ich vermute mal, dass z.B. der physical sky nur auf miRAY_ENVIRONMENT reagiert und daher bei einem normalen shading versagt. Wenn du jedoch einen mi_trace_environment() aufrufst sollte das gehen. Du kannst dann auch die direction der Oberfläche mit einbauen und dann bekommst du gleich noch ne reflection map mit dazu.
haggi
Admin
 
Posts: 752
Joined: Wed Jan 10, 2007 0:56 am

Return to Writing Shader and Phenomena®

Who is online

Users browsing this forum: No registered users and 1 guest