Multiple Outputshaders - MR Bug?

Maya spezifische Fragen.

Multiple Outputshaders - MR Bug?

Postby winniban on Sat Nov 26, 2011 3:40 am

Hi liebe Community,

ich programmiere derzeit einen klassischen Output Shader für MR /Maya 2012 x64 @ Win7.
Brauche 2D Postprocessing nach dem Rendern.

Nun ist mir jedoch etwas sehr komisches aufgefallen.

So dachte ich bis vor kurzen einen Output Shader hinzuzufügen:

Camera Attribute Editor --> Mental Ray -->Output Shaders -->Create --> Es entsteht ein "mentalrayOutputPass1[+rgba]shader.

Diesen wähle ich an und gelange zum "mentalrayOutputPass1" wo ich ein Häkchen "Renderable" zu Beginn setzen kann. Ich möchte keine "File" herausschreiben, sondern einen Output Shader über den unteren Slot hinzufügen.
Dies tue ich. Ich füge meinen eigenen Output Shader hinzu und rendere...------>Crash (beim Rendern)!


Dachte die ganze Zeit, der Fehler liegt an meiner Seite. Es gibt jedoch eine andere Methode den Output Shader hinzuzufügen.

Und zwar verbinde ich mit middle-mouse-drag im Hypershade den Output Shader mit der Camera und wähle "default".
Und dann funktioniert das Rendern, so wie es soll !

Die Verbindung sieht dann so aus: outputshader.msg ---> cameraShape.miOutputShader

Da ist wohl eine versteckte Funktion, welche nicht Camera Attribute Editor zu finden ist.

Nach dem "manuellen" Hinzufügen im Hypershade erblickt jedoch auf einmal ein neues Untermenü die Welt !

Und zwar erscheint nun unter dem "Output Shaders"- Reiter ein neuer mit dem Namen
"Legacy Output Shader". Dort ist mein Shader nun auch vermerkt.


"Legacy Output Shader" klingt für mich jedoch nach "alte Form und nicht mehr offiziel supportet".

Jetzt zu meinem eigenlichen Problem:

Ich brauche eine Verkettung von mehreren custom Output Shadern. Die zuerst genannte Methode sieht doch perfekt danach aus, dass man beliebig viele Shader hinzufügen kann.

Was für eine Art von Output Shader gehört denn nun in den "mentalrayOutputPass1" ?!
Es ist auch scheinbar nichts "onboard", um das ganze einmal zu testen.

Ferner muss ich unbedingt wissen, wie ich diesen "neuen" Outputshader in C++ zu entwickeln habe.

Habe sämtliche Mental Ray Dokus durchforstet, aber es wird nirgendwo erwähnt.


Ich hoffe, dass ihr mir hier weiterhelfen könnt.
Ich könnte auch vermutlich mehrere Shader in ein "Phenomena" gruppieren, arbeite für meiner Master Thesis jedoch an einem Maya Plugin wo ich im Grunde nicht über Phenomena gehen kann, da ich diese sonst dynamisch während der Laufzeit erzeugen müsste...

Ich will einfach nur irgendwie in die normalen "Output Shaders" meine Liste anhängen :/


Lieben Dank

Winniban
winniban
User
 
Posts: 13
Joined: Sat Nov 26, 2011 3:22 am

Re: Multiple Outputshaders - MR Bug?

Postby haggi on Sun Nov 27, 2011 0:43 am

Das scheint in der Tat ein Problem zu sein. Ich habe mal ein mi File exportiert und ganz offensichtlich wird zwar in der Camera definition der Shader zugewiesen, es wird aber zuvor keinerlei Shaderinstanz erzeugt, welche da zugewiesen werden könnte.

Bisher hatte ich output shader immer nur über einen Geometry shader manuell an die Liste der Camera output shaders angehängt. Das hat gut funktioniert, ist aber etwas umständlich und du musst natürlich einen Geometry Shader haben und den auch einem Standin zuweisen....
haggi
Admin
 
Posts: 752
Joined: Wed Jan 10, 2007 0:56 am

Re: Multiple Outputshaders - MR Bug?

Postby winniban on Sun Nov 27, 2011 1:16 am

haggi wrote:Bisher hatte ich output shader immer nur über einen Geometry shader manuell an die Liste der Camera output shaders angehängt. Das hat gut funktioniert


Interessant. Dies ist also der Weg, um der normalen "Output Shaders" - Liste einen Output Shader zuzuordnen ?

Ich verstehe nur nicht genau den Zusammenhang mit dem Geometry Shader. Was bewirkt dieser?

Vielen Dank !
winniban
User
 
Posts: 13
Joined: Sat Nov 26, 2011 3:22 am

Re: Multiple Outputshaders - MR Bug?

Postby haggi on Sun Nov 27, 2011 14:18 pm

Der normale Weg sollte durchaus über die Camera Attribute funktionieren.

Bei mir war es so, dass ich einen "cleanup" Shader schreiben musste, der nach dem Rendering ausgeführt wurde und Speicher freigeben sollte, oder auch einen "unpremultiply" Shader.

Da ich die Daten jedoch in meinem Geometry Shader erzeugt hatte, habe ich auch gleich den output Shader in meinem Geometry shader erzeugt, damit musste der User nix extra setuppen.

Aber kannst du mir nochmal sagen weshalb ein Phenomenon für dich nicht in Frage kommt? Wenn du sagst du arbeitest an einem Mayaplugin, willst aber mehrere Output Shader nutzen, so hast du doch sowieso mr Shader, welche du irgendwie einbinden musst. Und ob du nun ein Phenomenon einsetzt oder einen normalen Output Shader unterscheidet sich ja nicht.
haggi
Admin
 
Posts: 752
Joined: Wed Jan 10, 2007 0:56 am

Re: Multiple Outputshaders - MR Bug?

Postby winniban on Sun Nov 27, 2011 23:13 pm

Ich arbeite an einem Plugin, um PostProcessing in Maya zu integrieren. Im Grunde eine Art Mini After Effects in Maya.

Der User hat ein Layer-basiertes Interface, in welchem er Effekte hinzufügen kann (Dof, Color Correction, Curves etc...). Nun soll er auch in der Lage sein, die Reihenfolge der Effekte bestimmen zu können.

Und ich glaube ,dass da der Knackpunkt liegt.

Mehrere Output Shader mittels einem Phenomenon in Reihe zu schalten, ist zwar eine schöne Lösung, ich müsste jedoch während der Laufzeit die Reihenfolge ändern können.

Und ich glaube das geht nicht oder? Ich kann mir nur den theoretischen Weg vorstellen, dass während der Laufzeit ein .mi File generiert und geladen wird...


Im Moment sieht mein Ansatz wie folgt aus:

Ich nutze den Weg über den "Legacy Output Shader" - Slot, welcher erst erscheint, wenn man im Hypershade die Nodes Manuell verbindet (*.msg-->*.miOutput). Nun kann ich leider nur einen vergeben, also schreibe ich einen "über"-OutputShader welche alle Algorithmen beinhaltet.
Über geschickt parametrisiertes Aufrufen, erhoffe ich so auch Einfluss über die Reihenfolge zu erlangen.

Werde mir das mit dem Geometry Shader jetzt einmal genauer anschauen, weil du sagst, dass es somit in der "Output Shaders" Liste der Kamera funktioniert. Wenn ich das zum laufen bekommen würde, hätte ich eine LIste, welche ich bequem per MEL ändern kann.

Besten Dank für deine hilfreichen Posts :)
winniban
User
 
Posts: 13
Joined: Sat Nov 26, 2011 3:22 am

Re: Multiple Outputshaders - MR Bug?

Postby winniban on Mon Nov 28, 2011 1:16 am

haggi wrote:Da ich die Daten jedoch in meinem Geometry Shader erzeugt hatte, habe ich auch gleich den output Shader in meinem Geometry shader erzeugt, damit musste der User nix extra setuppen.


Wie hast du denn genau den OutputShader im GeometryShader erzeugt?

Im selbstprogrammierten Shader mit :
Code: Select all
miBoolean mi_call_shader(
    miColor * const result,
    miShader_type   type,
    miState * const state,
    miTag           shader)


?


Ist es nicht so, dass Geometry Shader "vor" dem Rendern durchlaufen werden?

Wie schafft man es dann zu sagen, dass der Output Shader danach aufgerufen werden soll?
winniban
User
 
Posts: 13
Joined: Sat Nov 26, 2011 3:22 am

Re: Multiple Outputshaders - MR Bug?

Postby haggi on Mon Nov 28, 2011 12:15 pm

Das funktioniert so, dass man den output shader selbst komplett per "mi_api_funcdecl" erzeugt. Das ist jedoch recht umständlich.

Hat man dann den mtag auf den Shader, dann kann der an die Kamera angehängt werden per mi_api_function_append().

Es sollte aber auch möglich sein, anhand eines vorhandenen Shaders den funktionspointer herauszufinden.

Oder als andere Idee:
Wenn ich das korrekt verstanden habe, dann gibt es verschiedene Layer, jeweils einer als output shader implementiert. Jeder führt anhand der parameter bestimmte Kalkulationen mit den pixeln durch.

Das bedeutet du hättest eine Liste mit Paramerern und Aktionen, also z.B.:

Layer1: Blur Radius 3 Typ Gauss
Layer2: Glow Radius 5
Layer3: Sharpen Radius 8

Du kannst alle diese Parameter über eine Liste auch an einen einzigen Outputshader übergeben indem du ein struct{} array definierst. Damit wärest du flexibel, denn du kannst die Elemente wie üblich über python oder mel hinzufügen oder herausnehmen wie bei anderen Arrays auch.
Das würde dann in Richtung deines Übershaders gehen.
haggi
Admin
 
Posts: 752
Joined: Wed Jan 10, 2007 0:56 am

Re: Multiple Outputshaders - MR Bug?

Postby winniban on Mon Nov 28, 2011 15:31 pm

Hi, hatte die Idee mit dem Struct Parameter bereits auch. Jedoch gibt es kein Struct in Mel, wenn ich das richtig gelesen habe.

Ich habe mittlerweile eine super Lösung gefunden und gecodet, welche ich dem Forum nicht vorenthalten möchte.

Ich habe zuerst einen "Manager"-Shader programmiert, welcher an sich kein Postprocessing durchführt, jedoch eine Liste beinhaltet, in welche man beliebig viele Output Shader hinzufügen kann.

Code: Select all
declare shader
   "mayapost" (
      array shader "outputshader"
   )
   #: nodeid 1391649
   apply output
   version 1
end declare


Dann habe ich einen simplen Color-Shifter zum Test programmiert:

Code: Select all
declare shader
   "colorshift" (
      boolean "red" default on,
      boolean "green" default on,
      boolean "blue" default on
   )
   #: nodeid 1391658
   apply output
   version 1
end declare



Von diesem kann ich nun beliebig viele Instanzen, dem "Manager" Shader hinzufügen. (Und später sollte die Reihenfolge einfach per MEL zu vertauschen sein. Einfach die Node Connections vertauschen)

Der Manager Shader ruft nun innerhalb der C - Routine alle Shader aus der Liste auf.

Hier die wichtigsten Codefragmente:
Code: Select all
struct mayapost {
      int i_shader;
      int n_shader;
      miTag shader[1];
    };


Code: Select all
extern "C" DLLEXPORT miBoolean mayapost(void *result, miState *state, struct mayapost *paras)
{
             miTag *shader =  mi_eval_tag(paras->shader);

      int i_shader = *mi_eval_integer(&paras->i_shader);
      int n_shader = *mi_eval_integer(&paras->n_shader);
      int i;
      for (i=0; i < n_shader; i++){
      mi_warning("Shader %d", shader[i_shader + i]);
      mi_call_shader(NULL ,miSHADER_OUTPUT,state,shader[i_shader + i]);
      }

        return miTRUE;
    }



Im Endeffekt habe ich mir das nicht-brauchbare Maya Feature der Output Shaders - Liste so nachgebaut.


P.S. Da dies Bestandteil meiner Masterarbeit ist, möchte ich noch einmal klarstellen, dass ich den Code selbstständig geschrieben habe, und nicht direkt hier im Forum gefunden und übernommen habe. Mein Name ist Peter Salziger (falls mein Prof nach Codezeilen googlen sollte) :)

Besten Dank auch noch einmal für deine Vorschläge, wenn ich über diese nicht nachgedacht /geforscht hätte, wäre ich wohl nicht zu schnell zu dieser Lösung gekommen !

Eine Frage habe ich noch: Wie bekomme ich per mi_info(".."); den Output in das Maya Output Window ? Da wird nichts angezeigt. Nur bei mi_warning(); so wie ich es im Beispiel verwendet habe.
winniban
User
 
Posts: 13
Joined: Sat Nov 26, 2011 3:22 am

Re: Multiple Outputshaders - MR Bug?

Postby haggi on Mon Nov 28, 2011 16:26 pm

Hast du in der OptionBox in maya für "RenderCurrentFrame" auch die Verbosity auf "Progress" oder zumindest "Info" gestellt?

Willst du den Kram nicht per python realisieren? Ist in vielerlei Hinsicht eleganter als unter mel. Vor allem wenn man viele Connections und Listen bearbeiten muss. Und im Endeffekt leichter verständlich und kürzer im Code.
haggi
Admin
 
Posts: 752
Joined: Wed Jan 10, 2007 0:56 am

Re: Multiple Outputshaders - MR Bug?

Postby winniban on Tue Nov 29, 2011 7:48 am

Daran lags :) Habe den Ort des Häkchens nicht gefunden :D Danke :)

Dass Python im Endeffekt der klügere Weg ist, ist ein durchaus berechtigter Gedanke.

Werde zwar erst einmal mit MEL beginnen, falls ich jedoch merke, dass es zu fummelig wird, steige ich um. (habe Python noch nie genutzt, evtl kann ich mir die Einarbeitung (wohl eher nicht) sparen )

lg
winniban
User
 
Posts: 13
Joined: Sat Nov 26, 2011 3:22 am

Re: Multiple Outputshaders - MR Bug?

Postby haggi on Tue Nov 29, 2011 11:11 am

Ich kanns nur empfehlen, vor allem mit pymel. Was in mel so aussieht:
Code: Select all
string $obj1="pSphere1";
string $obj2="pCube1";
connectAttr ($obj + ".translateX") ($obj + ".translateY");

Sieht dann in python so aus:
Code: Select all
obj1=PyNode("pSphere1")
obj2=PyNode("pCube1")
obj1.tx >> obj2.tx #so wird connected
obj1.tx // obj2.tx  #so wird disconnected
haggi
Admin
 
Posts: 752
Joined: Wed Jan 10, 2007 0:56 am

Return to Mental ray® in Maya

Who is online

Users browsing this forum: No registered users and 1 guest

cron