CustomMaterial Samples

documentation

#1

hi i start write some documentation here for custom material ( its realy easy for me to make it here but i can move it in documentation after that complete )

definition : Custom Material inherited from stable version of Standard material (a carbon Copy of BABYLON.StandarMaterial)

when we need CustomMaterial ? : any time you wanna make any custom option but you can’t manage that in standard material .

vertex shader definitions :

  1. position(readonly) or positionUpdated(vec3) : local position per vertex
  2. normal(readonly) or NormalUpdated(vec3) : local normal

fragment shader definitions :

  1. vPositionW( readonly) : world position per pixel
  2. vNormalW(read only)
  3. vDiffuseUV(vec2) : (readonly) : defined uv attribute append when you have DiffuseTexture
  4. diffuseColor(vec3) you can manage that with Fragment_Custom_Diffuse : for control Diffuse color **** that mixed with diffuseTexture if you add any texture
  5. alpha(float) you can manage that from Fragment_Custom_alpha : for control transparency
  6. color(vec4) last result after attached all effect (light fog shadow … ) you can manage that in Fragment_before_FragColor

methods :

Start

.material = new BABYLON.CustomMaterial(“name”,scene);

Demo : You can define customMaterial exactly like StandardMaterial and you have all property and methods in custom material too

AddUniform

material.AddUniform(‘test1’,‘vec3’);

  1. simple (float,vec2, vec3,vec4,…) demo
  2. sampler without UV with Define UV
  3. array array3 , float

Fragment_Begin

material.Fragment_Begin( string)

#include<__decl__defaultFragment> 
[Fragment_Begin]
#extension GL_OES_standard_derivatives : enable

for define any new extension or include any shader (not find any requirement for make sample)

Fragment_Definitions

material.Fragment_Definitions( string)

 
#[Fragment_Definitions] 
 
void main(void) { 

this define before main you can define any varying or global function before main

demo : make varying for simple noise used vertex data to add normal

demo : change vertex use definition function

Fragment_MainBegin

void main(void) { 
 
vNormalW = vNormalW_helper; 
#[Fragment_MainBegin] 

demo : correct normal for back face

Fragment_Custom_Diffuse

you most find your result red and green and blue (witch any way you like ) and set it in diffuseColor or result

*** result (vec3) in this method replaced (one time) by diffuseColor

set texture setTexture use diffuseColor

Fragment_Custom_Alpha

you most find your alpha and set it to alpha variable or in result

*** result (vec3) in this method replaced (one time) byalpha

demo manage transparency

Fragment_Before_FragColor

before the last result you have chance to manage your result your final color available in color variable and you most be set it color after your changes

*** result (vec4) in this method replaced (one time) by color

demo result with and without light effect

Vertex_Begin

for define any new extension or include any shader (not find any requirement for make sample)

Vertex_Definitions

this define before main you can define any varying or global function before main

Vertex_MainBegin

same as Fragment_Main

Vertex_Before_PositionUpdated

localPosition = positionUpdated; 
#[Vertex_Before_PositionUpdated] 
 
gl_Position=viewProjection*finalWorld*vec4(positionUpdated,1.0); 

you most change positionUpdated in here for change last vertex result

Vertex_Before_NormalUpdated

#ifdef NORMAL 
 
#[Vertex_Before_NormalUpdated] 
 
localNormal = normalUpdated; 
vNormalW_helper=normalize(vec3(finalWorld*vec4(normalUpdated,0.0))); 

you most change normalUpdated in here for change last vertex normal result

related samples

Update Uniform demo


#2

A FANTASTIC post and WONDERFUL demos, Naz! Thank you, thank you, thank you!!!


#3

You definitly should add this to the official doc’ :slight_smile:


#4

I have been waiting for the update for these!

Awesome and thank you for the right up.


#5

the next generation is AdaptorMaterial


Material layers?