Vai al contenuto
talama

Programmazione Shader Mental Ray

Recommended Posts

Apro questo thread perchè vorrei iniziare a capire qualcosa di più per ciò che riguarda la progr. degli shader per mr. L'obbiettivo per ora (anche considerando che le mie conoscenze per ciò che riguarda la prog. in generale si limitano ad una conoscenza basilare del C) è soltanto quello di mettere insieme le informaz. "minime" che sono necessarie per scrivere e compilare il primo shader (tipo l'"hello world" della progr. degli shader), per poi magari approfondire e affrontare argomenti un po' più complessi (ma non troppo :D ).

Intanto alucni link che possono essere utili:

Xsi shader programming 101 e 102 su nanomation:

http://www.nanomation.co.uk/Programming-101.html

http://www.nanomation.co.uk/Programming-102.html

Mailing list pubbliche della mental images:

http://www.mentalimages.com/2_1_5_forum/index.html

I forum "shader beginner" e "shader advanced" sul sito del lamrug:

http://forum.lamrug.org/viewforum.php?f=8

http://forum.lamrug.org/viewforum.php?f=9

Ciao

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Premesso che tutto quello che scriverò di seguito va preso con il beneficio del dubbio, queste sono alcune delle informaz. che mi sono servite per:

Scrivere e compilare il primo shader:

File .mi

lo shader più semplice da implementare è quasi sicuramente un constant shader che non faccia altro che restituire sempre e ccomunque lo stesso colore ogni volta che un che un eye ray colpisce l'oggetto a cui lo shader è assegnato.

come prima cosa abbiamo bisogno di un file .mi (almeno per chi usa Maya, per xsi ci sono i file .spdl, per max non so) che contenga la dichiarazione delllo shader, cioè:

- il tipo del parametro ritornato dallo shader

- il nome dello shader

- il tipo e il nome dei parametri di input dello shader

In piu è possibile specificare altre informazioni opzionali, come x es la versione dello shader.

Esisto poi i "comment commands" che sono relativi a maya (ma presumo che esista l'equivalente per max/xsi) e che servono per modificare il modo in cui parametri dello shader sono visualizzati nell' AE, ma su questa parte della storia sono veramente ignorante.

esempio di .mi file relativo ad un constant shader. Supponendo di voler chiamare lo shader mio_shader (notare la fantasia :D ) il file .mi si chiamerà:

mio_shader.mi

declare shader

color "mio_shader" (

color "mat_color" default 0 0 1.0

)

apply material

version 1

end declare

In questo .mi si dichiara uno shader che si chiama mio_shader, che ritorna come risultato un tipo color e che ha un unico parametro, sempre di tipo color, che si chiama mat_color impostato di default a R=0 G=0 B=1 (blu).

apply material fa sì che quando lo shader verrà installato in Maya si troverà nella tab "Material" dei materiali di mental ray.

Ciao

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

grande sto tread!!

seguo interessato anche se io in realtà con le mie conoscenze di programmazione potrei compilare al massimo un phenomenon di mr visto che mi fermo al mel base.

keep it up!

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Abbiamo poi bisogno di una DLL

(definizioni di DLL: http://www.google.it/search?hl=it&q=define...n+Google&meta=)

che possa essere linkata in modo dinamico a runtime (cioè quando il progr. è già in esecuz.) che contenga una o + delle funzioni che il raytracer può chiamare quando ha bisogno di "eseguire" lo shader.

In realtà la versione stand-alone di mr è in grado di accettare gli shader anche direttamente in forma di codice sorgente o di codice oggetto (ma non penso che questo sia possibile per le versioni integrate in maya, max o xsi).

Per ottenere la DLL serve:

- una struttura in C che contenga i parametri di input dello shader. I parametri dichiarati in questa struttura devono combaciare esattamente con quelli dichiarati nel file .mi

Nel caso del constant shader mio_shader questa struttura sarà:

typedef struct {

miColor mat_color;

}mio_shader_params;

(usando typedef, oltre a dichiarare la struttura, definisco anche un nuovo tipo di dato complesso [in questo caso non molto complesso dal momento che contiene un solo membro] che si chiama mio_shader_params.

- le funzioni dello shader scritte in C o C++. Ci sono 4 funzioni che possono essere chiamate dal raytracer, 3 delle quali sono opzionali (cioè possiamo anche non implementarle). Il prototipo dell'unica funzione necessaria è:

miBoolean mio_shader (miColor *result, miState *state, mio_shader_params *in_pParams);

Questa è la funzione che verrà chiamata ogni volta che lo shader deve essere valutato.

- Il primo argomento della funzione (miColor *result) deve essere un puntatore allo stesso tipo di dato dichiarato nel file mio_shader.mi come tipo di dato da ritornare.

- Il secondo (miState *state) serve per passare alla funzione lo stato corrente del raytracer quando lo shader viene chiamato. (in questo caso il nome del puntatore deve essere obbligatoriamente state)

- Il terzo parametro (mio_shader_params *in_pParams) è un puntatore al tipo di dato dichiarato che è stato definito tramite: typedef struct ecc, ecc. ed è utilizzato dalla funzione per accedere ai parametri di input dello shader.

Ciao

Condividi questo messaggio


Link al messaggio
Condividi su altri siti
seguo interessato anche se io in realtà con le mie conoscenze di programmazione potrei compilare al massimo un phenomenon di mr visto che mi fermo al mel base.

Fidati che se ci sono riuscito io, ci può riuscire chiunque.

Io di mel non sò nulla, ma penso che dovrò impararne almeno le basi per gli AEtemplate

degli shader

Ciao

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Alla fine di tutta questa storia avremo:

- un file mio_shader.mi che contiene la dichiarazione dello shader

- un file header mio_shader.h che contiene la definizione della struttura con i parametri dello shader :

mio_shader.h

#include <shader.h>

typedef struct {

miColor mat_color;

}mio_shader_params;

Il file shader.h che viene incluso dalla prima riga si trova (per chi usa Maya) in Dir_di_installazione_di_maya\devkit\mentalray\include (per me c:\Programmi\Alias\Maya7.0\devkit\mentalray\include). Per compilare la DLL dobbiamo dire al compilatore dove si trova questo file.

- un file C mio_shader.c che contiene le funzioni dello shader:

mio_shader.c

#include "mio_shader.h"

int mio_shader_version (void)

{

return (1);

}

miBoolean mio_shader (miColor *result, miState *state,

mio_shader_params *params)

{

*result = *mi_eval_color(&params->mat_color);

return miTRUE;

}

La prima funzione (opzionale) ritorna la versione dello shader

La seconda (obbligatoria) è la funzione principale, quella che calcola il "risultato" dello shader.

La riga: *result = *mi_eval_color(&params->mat_color);

valuta (attraverso mi_eval_colo,r a cui viene passato l'indirizzo di memoria della struttura params) il valore del parametro mat_color e lo assegna a result.

Lo shader ritorna quindi miTRUE per segnalare al raytracer che tutto è andato bene o miFALSE altrimenti.

mi_eval_color è una macro definita in shader.h che termina con una chiamata a mi_eval, a cui viene passato come secondo parametro il "miState" attuale.

esistono macro mi_eval_ per i principali tipi di dato.

es : mi_eval_boolean, mi_eval_integer, mi_eval_vector, ecc. ecc.

Ciao

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Se si vuole evitare di scrivere troppo:

- scrivere solo il file mio_shader.mi

- aprire un prompt dei comandi e digitare mkmishader mio_shader.mi

mkmishader (mkmishader --help per avere una lista delle opzioni disponibili) genererà un file C che contiene già tutto quello che serve. (alcuni nomi sono differenti, ma la cosa non fà differenza :D ).

Il file C generato da mkmishader contiene anche la definiz. della struttura con i parametri dello shader che io avevo messo in un file header, ma anche in questo caso è solo una questione di "preferenze".

L'unica cosa da fare è sostituire

miColor mat_color = *mi_eval_color(&param->mat_color);

che crea una variabile mat_color a cui assegna il valore del parametro mat_color (utile per shader che devono utilizzare il valore dei parametri di input per esguire calcoli che poi serviranno per ottenere il risultato, cioè quasi tutti gli shader a parte questo "stupido" constant shader)

con *result = *mi_eval_color(&param->mat_color);

e cancellare le righe:

result->r += 0.0;

result->g += 0.0;

result->b += 0.0;

result->a += 0.0;

Ciao


Modificato da talama

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Nella fretta mi sono dimenticato una cosa molto importante. Dal momento che vogliamo compilare una DLL è necessario, nel file C che contiene le funzioni dello shader, far precedere la dichiarazione di ogni funzione da DLLEXPORT.

Quindi il file C corretto sarebbe:

mio_shader.c

#include "mio_shader.h"

DLLEXPORT int mio_shader_version (void)

{

return (1);

}

DLLEXPORT miBoolean mio_shader (miColor *result, miState *state,

mio_shader_params *params)

{

*result = *mi_eval_color(&params->mat_color);

return miTRUE;

}

Ciao

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Compilare lo shader

Cosa serve:

- un complilatore (ma và!). Ne esitono diversi free e open source (http://www.thefreecountry.com/compilers/cpp.shtml). Visto che i compilatori "ufficialmente supportati" da mr sono quello della microsoft e quello della intel, e che la versione da linea di comando di quello della microzozz (visual c++ toolkit 2003) è free, io ho deciso di utilizzare questo.

Si può scaricare qui:

http://www.microsoft.com/downloads/details...&displaylang=en

Una volta installato il compilatore è utile aggiungere la directory che contiene l'eseguile del compilatore al nostro PATH.

(tasto destro su risorse del computer -> proprietà -> avanzate -> variabili d'ambiente, tra le variabili dell'utente c'è PATH, -> modifica e aggiungere c:\programmi\microsoft visual c++ toolkit 2003\bin)

- ci sono 2 librerie che sono necessarie in fase di compilazione e che non sono incluse nel visual c++ toolkit 2003:

msvcrt.lib e uuid.lib.

La prima si trova nel .NET framework SDK 1.1 :

http://www.microsoft.com/downloads/details...&displaylang=en

(dopo l'installazione la libreria msvcrt.lib si troverè in c:\programmi\microsoft visual studio .NET 2003\Vc7\lib)

La seconda si trova nel Windows Server 2003 SP1 Platform SDK.

http://www.microsoft.com/downloads/details...&displaylang=en

Non è necessario installarlo, basta scaricare il file CAB PSDK-FULL.7.cab, aprirlo con winzip o winrar estrarre il file PSDK-SDK_Core_BLD_common.1, aprirlo con winzip o winrar ed estrarre Uuid_Lib.95CE..... e rinominarlo Uuid.lib

Copiare Uuid.lib e msvcrt.lib in c:\programmi\microsoft visual c++ toolkit 2003\lib

Per evitare di dover ogni volta scrivere tutti i parametri da passare al compilatore è utile installare gnu-make x windows dal progetto MinGW (minimalist GNU for windows) http://prdownloads.sourceforge.net/mingw/m...-3.exe?download

Una volta installato aggiungere c:\mingw\bin alla variabile d'ambiente PATH

Ciao

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Adesso basta creare un Makefile (un file di testo che si chiama Makefile) per dire a make quali sono le dipendenze tra i vari file.

Generalmente un makefile è composto da regole nella forma

<target> : <dipendenze>

[TAB]<comando da eseguire>

[TAB] significa che bisogna inserire un carattere TAB prima di ogni comando;

Questo è il makefile che ho utilizzato io

Makefile

NAME = mio_shader

CC = cl

CFLAGS = /O2 /MD /nologo /W3 -DWIN32

TARGET = $(NAME).dll

SRC = $(NAME).c

OBJ = $(NAME).obj

INCLUDE = C:\Programmi\Alias\Maya7.0\devkit\mentalray\include

LIBPATH =C:\programmi\alias\maya7.0\devkit\mentalray\lib\nt

LIB = shader.lib

LFLAGS = /nologo /nodefaultlib:LIBC.LIB /OPT:NOREF /INCREMENTAL:NO /DLL /OUT:$(TARGET)

$(TARGET) : $(OBJ)

$(CC) $(CFLAGS) /I$(INCLUDE) $(SRC) /link /LIBPATH:$(LIBPATH) $(LFLAGS) $(LIB)

$(OBJ) : $(SRC) $(NAME).h

$(CC) /c $(CFLAGS) /I$(INCLUDE) $(SRC)

A questo punto per compilare lo shader basta aprire un prompt dei comandi, posizionarsi nella cartella in cui si trovano i file mio_shader.h, mio shader.c e Makefile, e scrivere make.

Il compilatore dovrebbe compilare e linkare la DLL mio_shader.dll

Non resta che installare lo shader e provare se funziona.

qui ci sono i miei file

http://rapidshare.de/files/6501760/mio_shader.rar.html

Ciao

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

bella gente non ho avuto il tempo di leggere tutto ma mi sembra che si è proprio sulla buona strada.

Su internet di documentazione ce ne davvero poca !!!

Per chi vuole cominciare adesso un passo dopo passo addirittura in italiano è il massimo.

Mi raccomando sei tutti noi continua cosi!!!

Appena trovo che fine ha fatto il mio visula c dopo i lavori a casa metto mano al mental di sicuro.Ero molto interessato a fare shader hardware poichè mi sembra di ricordare che con un paio di passi si puo' renderizzare in mental ray qualsiasi shader non ricordo se cg o hlsl,ma potrei anche sbagliarmi visto che ho preso l'ultima volta il manuale troppo tempo fa per esserne sicuro in questo momento anche data l'ora tarda.


Modificato da pablo83

Condividi questo messaggio


Link al messaggio
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora

  • Navigazione recente   0 utenti

    Non ci sono utenti registrati da visualizzare in questa pagina.

×