# RVMAT basics

(Redirected from RVMAT)

#### Theory

##### Lighting

Lighting and shading is what makes 3D scene appealing. In real-time render we still have to simplify so Artist must understand how shading works in engine to be able prepare the best realistic looking surfaces.

ARMA engine counts lighting as T * (D.o + A) + S.o

T = texture color

D = diffuse lighting (color, intensity and direction. ARMA engine has just one light source of directional light - sun or moon.) D is calculated as max(L.N,0)*sunLightColor - where L is light direction, N is surface direction (normal)

A = ambient lighting (color and intensity. It is always present at same intensity all over the scene and its value is done by overcast setting)

S = specular (setting of material glossiness and specularity)

o = direction of light (1= pixel is lit, 0= pixel is in shadow)

Simple materials count lighting per vertex by interpolating light direction between face edges (normals). It is similar to well known Gouraud shading model. More complex materials use per pixel normal orientation.

Values for shading calculations are combined from textures, effect bitmaps, engine light settings (config) and material settings (*.rvmat).

Shadows are calculated in ARMA engine two types, depending on values in Video options and each model setting.

Stencil buffer shadows are sharp and they are added after the whole scene has been drawn. Engine just subtracts diffuse light value on places where stencil shadow volume appeared. This results in speculars still being present in shadows. Also when ambient and diffuse settings of the material aren't equal (and ForceDiffuse!=0) then resulting color isn't correct.

Shadow buffer makes one soft shadow map calculated on GCard for whole scene from the viewport. This affects the precision of the shadow.

##### Glossiness

Material specularity is defined by a curve ([WikiPedia:Bidirectional reflectance function]) that says how much light is reflected under all angles. In ARMA engine we are able to use SPECULAR POWER, IRRADIANCE TABLE or FRESNEL values in *rvmat files.

##### Sections

Textures and materials are linked to each face separately so artist can have various materials on surface mapped with a single texture.

Everytime when Graphics Card (GPU) is instructed to draw with new parameters, we call it scene section. It is usually when new object (*.p3d), texture or material appears. Sections are generated each time when there is need to change paramaters for rendering on Graphical Card (GPU). This is always when loading informations from CPU about independent OBJECT, TEXTURE, MATERIAL or bone limit is exceeded on the card. Overhead in instruction transfer between CPU and GPU then lowers rendering performance which could be used to render hundreds polygons or textures etc.

Texture (TGA) is assigned to individual faces. Material (RVMAT) is assigned to same faces separately thus it's possible use various materials on surface covered with one UV and CO map. Yet then are generated another sections. In STAGE 0 is possible change with RVMAT also difusse component texture. Sections may differ in individual LODs.

##### Procedural textures

Besides TGA/PAA textures ARMA engine can work with maps generated in real-time procedurally. Procedural Textures

##### Normal Map

The Normalmaps used in Arma are Tangent-space maps with the orientation X+ Y- (same as in Unreal Engine and 3dsmax renderer default setting)

### RVMAT files

Those files are a sort of configs.

#### Basic surface setting

```Ambient[]={0.9,0.9,0.9,1};
```

multiplies color values (color texture R,G,B,A) of the surface that is not lit by main directional light.

```Diffuse[]={0.9,0.9,0.9,1};
```

multiplies color values of the surface that lit by main directional light.

```ForcedDiffuse[]={0,0,0,0};
```

those values help to simulate so called Translucency. Part of the diffuse lighting that is reflected on surface in shadow. It works similar to ambient but wit different component of lighting. Unfortunately some shaders don't work well with forcedDiffuse.

```Ambient[]={1,1,1,1};
Diffuse[]={0.5,0.5,0.5,1};
ForcedDiffuse {0.5,0.5,0.5,0}
```

This combination makes same result as old vertex property Half Lighted (surface is lit the same from all sides, it appears flat)

For foliage surfaces there are special shaders that use also forcedDiffuse Alpha value setting for calculating how much light goes through (1= all).

```emmisive[]={0,0,0,0};
```

Also called Luminescence. Values give amount of light that surface shines by himself. Use it for light-sources. It will appeal shining but will not lit anything around.

```specular[]={0.3,0.3,0.3,0};
```

Used for making so called hotspot (in max it is Specular level+specular color). It is part of the light that is reflected from surface. Specular is calculated poer vertex or per pixel depending od specific shader.

```specularPower=40;
```

Also called Glossiness. Defines how sharp the hot-spot will be. Some shaders use IRRADIANCE TABLE instead of this value.

All above mentioned settings can be calculated in some shaders per pixel using effect bitmaps.

All components are together used in calculation of surface shading:

```pixel RGB on screen =
((RVMAT ambient * RGB texture * Environment ambient)
+ (RVMAT diffuse * RGB texture * Environment diffuse * light direction)
+ (RVMAT forced diffuse * RGB texture * Environment diffuse)
+ RVMAT emissive material * RGB texture
+ (RVMAT specular * Environment diffuse * light direction)
```

Color values are usually in range 0-1, but it can be more. ARMA engine calculates light in high dynamic range, with values exceeding 0-255 RGB depth. Final RGB in monitor is calculated for each frame depending od eye/optics Aperture (shutter) settings [[1]].

Realistic surfaces do not reflect 100% of incoming light. The more light is reflected as specular the less diffuse it has. Sum of diffuse, forced diffuse and reflected light should not exceed 1 BUT this is not true on ArmA real-time materials that do render just sunlight hot-spot and miss environmental light.

Diffuse for many usual surfaces is between 40%-80%. If you aim for maximum realistic surface settings, study photoreference. RVMAT settings allow you to put as much color range as possible in texture and than modify it to realistic values with maximum dynamic range.

Realistic surfaces usually reflect directional and scattered light the same way - Diffuse and Ambient are equal. ARMA engine has environment settings with values for diffuse and ambient (scene contrast) based on real world light recording. Color Calibration. It is not wise to compensate contrast in material settings.

Lower diffuse values are used for spongy materials (some light is transfered to forceDiffuse). Lower ambient values can be used on surfaces where global ambient should be reduced, such as Interiors. It is usually made using Ambient Light maps.

##### Specular color

Usually we set RGB values color neutral. But sometimes it is effective to tint color in rvmat. Most obvious it is in specular settings of some glossy metal surfaces.

If I want a specific color, I count:

X= B/(Sp*Db)

B.. desired color of hot-spot

Sp.. actual Specular setting of hot-spotmaterial

Db.. color of environment light (Ambient and Diffuse change during day and overcast) O2 environment editor shows actual colors used in buldozer preview.

X ..number that i use to multiply Specular to get desired color.

#### Render flags

Special shading property that are used instead of old VERTEX LIGHTING PROPERTY settings.

```renderFlags[] = {flag,flag};
```
• NoZWrite

Face is not count in Z-buffer. Used for alpha-transparent surfaces laid over another faces to fix shadow artifacts. (for example squad logo)

• NoColorWrite

Disables calculation in color channels. Face is calculated just in alpha and Z-buffer.

• NoAlphaWrite

Disables calculation in alpha channels. Used for transparent glass that has 2 pass material.

Allows adding alpha-transparent surface color to the background. Used for fire particles.

For terrain.

• AlphaTest32

Defines threshold where pixel becomes transparent at drop off to discrete alpha. The bigger value, the more pixels are used (Alphatest64, Alphatest128)

• NoTiWrite
• NoColorWrite
• NoLODBlend
• Dummy0

Always in Shadow can be achieved with setting RVMAT diffuse[]={0,0,0,0} + reasonable specular reduction.

#### Light Mode

Setting of various kinds of light calculation:

```mainLight="Sun"
```

Possible values are:

• None
• Sun
• Sky
• Horizon
• Stars
• SunObject
• SunHaloObject
• MoonObject
• MoonHaloObject

#### Fog Mode

Setting of various kinds of fog calculation:

```fogMode="Alpha"
```

Possible values are:

• none - no fog
• fog - fog used by usual opaque object, the more is object covered by fog, the closer is it's color to fog color
• alpha - fog used by objects with alpha, the more is object covered by fog, the more transparent is
• fogAlpha - combination of both above approaches, used for roads (alpha-out could be quicker than fogging)

combination of both approaches, used for roads, way to fade-away objects when object is not just normally fogging

• fogSky - fog for sky objects (moon, stars)

```PixelShaderID=".....";
```

```class StageX
```

Each stage define parameters for shader calculation, usually as links to effect bitmaps.

• texture= (name and path to effect bitmap texture)

Must obey texture naming conventions Texture Naming Conventions otherwise there will be no proper automatic conversion made from TGA to PAA.

• Filter="Anizotropic";

Default is Anizotropic, but in some situations you can use Point, Linear, Trilinear.

• uvSource="tex";

can be: none, tex, tex1 (second UV set), pos, norm, worlPos, worldNorm, texShoreAnim, texCollimator, texCollimatorInv

• class uvTransform

Offset, deformation or repeating ot texture in given UV set.

#### Material types

Inside O2 Material editor exist examples for most of shaders. Oxygen_2_-_Manual#MAT_plugin

 Wikipage Vertex shader Pixel shader Notes Material - General material Basic Normal Material - DXTA material Basic NormalDXTA Material - Basic detail map Basic Detail Basic White Basic WhiteAlpha Material - Basic glass Basic AlphaShadow Material - Normal map NormalMap NormalMap Material - Normal map HQ specular NormalMap NormalMapSpecularMap NOHQ+SM NormalMap NormalMapSpecularDIMap NOHQ+SMDI Material - Normal map HQ detail map specular NormalMap NormalMapDetailSpecularMap NOHQ+DT+SM NormalMap NormalMapDetailSpecularDIMap NOHQ+SMDI+DT Material - Basic normal detail NormalMapDiffuse NormalMapDiffuse NormalMapDetail, per vertex lit Water Water Material - Water simple WaterSimple WaterSimple NormalMapThrough NormalMapThrough NormalMapThrough NormalMapThroughSimple Material - Basic Tree crown NormalMapSpecularThrough NormalMapSpecularThrough TreeCrown colormap must be with continuous alpha NormalMapSpecularThrough NormalMapSpecularThroughSimple NormalMapThroughNoFade NormalMapThrough NormalMapThroughNoFade NormalMapThroughSimple NormalMapSpecularThroughNoFade NormalMapSpecularThrough NormalMapSpecularThroughNoFade NormalMapSpecularThroughSimple Material - Detail macro AS BasicAS DetailMacroAS DT+MC+AS Material - Normal map macro AS NormalMapAS NormalMapMacroAS Material - Normal map HQ specular macro AS NormalMapAS NormalMapMacroASSpecularMap NOHQ+MC+AS+SM NormalMapAS NormalMapMacroASSpecularDIMap NOHQ+SMDI+MC+AS Material - Normal map HQ detail specular macro AS NormalMapAS NormalMapDetailMacroASSpecularMap NOHQ+DT+MC+AS+SM NormalMapAS NormalMapDetailMacroASSpecularDIMap NOHQ+SMDI+DT+MC+AS Material - Normal map detail macro AS NormalMapDiffuseAS NormalMapDiffuseMacroAS NO+DT+MC+AS Material - Basic glass reflectance Glass Glass Terrain TerrainX X is number from 1 to 15 and presents mask as per which is choosen combination from 4 layers Material - Antiwater Basic AlphaNoShadow in combination with empty alpha texture clears water from ship and is shadowless Terrain TerrainSimpleX X is number from 1 to 15 and presents mask as per which is choosen combination from 4 layers Super_shader Super Super SM 3.0 - shader with Fresnel for ArmA2 Multimaterial Multi Multi SM 3.0 - shader with multiple submaterials for ArmA2 Material - Tree Tree TreeNoFade SM 3.0 - shader for ArmA2 vegetation Material - TreePRT TreePRT TreePRT SM 3.0 - shader for ArmA2 vegetation Skin_shader

```Normal                              /*diffuse color modulate, alpha replicate*/\
NormalDXTA                          /*diffuse color modulate, alpha replicate, DXT alpha correction*/\
NormalMapThrough                    /*normal map shader - through lighting*/\
NormalMapGrass                      /*normal map shader - through lighting*/\
NormalMapDiffuse                    /**/\
Detail                              /*detail texturing*/\
Interpolation                       /**/\
Water                               /*sea water*/\
WaterSimple                         /*small water*/\
White                               /**/\
WhiteAlpha                          /**/\
Dummy0                              /**/\
DetailMacroAS                       /*detail with ambient shadow texture*/\
NormalMapMacroAS                    /*normal map with ambient shadow texture*/\
NormalMapDiffuseMacroAS             /*diffuse normal map with ambient shadow texture*/\
NormalMapSpecularMap                /*normal map with specular map*/\
NormalMapDetailSpecularMap          /*normal map with detail and specular map*/\
NormalMapMacroASSpecularMap         /*normal map with ambient shadow and specular map*/\
NormalMapDetailMacroASSpecularMap   /*normal map with detail and ambient shadow and specular map*/\
NormalMapSpecularDIMap              /*normal map with specular map, diffuse is inverse of specular*/\
NormalMapDetailSpecularDIMap        /*normal map with detail and specular map, diffuse is inverse of specular*/\
NormalMapMacroASSpecularDIMap       /*normal map with ambient shadow and specular map, diffuse is inverse of  specular*/\
NormalMapDetailMacroASSpecularDIMap /*normal map with detail and ambient shadow and specular map, diffuse is inverse  of specular*/\
Terrain1                            /*terrain - X layers*/\
Terrain2                            /*terrain - X layers*/\
Terrain3                            /*terrain - X layers*/\
Terrain4                            /*terrain - X layers*/\
Terrain5                            /*terrain - X layers*/\
Terrain6                            /*terrain - X layers*/\
Terrain7                            /*terrain - X layers*/\
Terrain8                            /*terrain - X layers*/\
Terrain9                            /*terrain - X layers*/\
Terrain10                           /*terrain - X layers*/\
Terrain11                           /*terrain - X layers*/\
Terrain12                           /*terrain - X layers*/\
Terrain13                           /*terrain - X layers*/\
Terrain14                           /*terrain - X layers*/\
Terrain15                           /*terrain - X layers*/\
TerrainSimple1                      /*terrainSimple - X layers*/\
TerrainSimple2                      /*terrainSimple - X layers*/\
TerrainSimple3                      /*terrainSimple - X layers*/\
TerrainSimple4                      /*terrainSimple - X layers*/\
TerrainSimple5                      /*terrainSimple - X layers*/\
TerrainSimple6                      /*terrainSimple - X layers*/\
TerrainSimple7                      /*terrainSimple - X layers*/\
TerrainSimple8                      /*terrainSimple - X layers*/\
TerrainSimple9                      /*terrainSimple - X layers*/\
TerrainSimple10                     /*terrainSimple - X layers*/\
TerrainSimple11                     /*terrainSimple - X layers*/\
TerrainSimple12                     /*terrainSimple - X layers*/\
TerrainSimple13                     /*terrainSimple - X layers*/\
TerrainSimple14                     /*terrainSimple - X layers*/\
TerrainSimple15                     /*terrainSimple - X layers*/\
Glass                               /*glass shader with environmental map*/\
NonTL                               /*very simple 2D pixel shader*/\
NormalMapSpecularThrough            /*normal map shader - through with specular lighting*/\
Grass                               /*grass shader - alpha discretized*/\
NormalMapThroughSimple              /*simple version of NormalMapThrough shader*/\
NormalMapSpecularThroughSimple      /*simple version of NormalMapSpecularThrough shader*/\
ShoreWet                            /*shore shader for the wet part*/\
ShoreFoam                           /*shore shader for the foam on the top of the shore*/\
NonTLFlare                          /*shader to be used for flares*/\
TerrainGrass1                       /*terrain grass - X layers*/\
TerrainGrass2                       /*terrain grass - X layers*/\
TerrainGrass3                       /*terrain grass - X layers*/\
TerrainGrass4                       /*terrain grass - X layers*/\
TerrainGrass5                       /*terrain grass - X layers*/\
TerrainGrass6                       /*terrain grass - X layers*/\
TerrainGrass7                       /*terrain grass - X layers*/\
TerrainGrass8                       /*terrain grass - X layers*/\
TerrainGrass9                       /*terrain grass - X layers*/\
TerrainGrass10                      /*terrain grass - X layers*/\
TerrainGrass11                      /*terrain grass - X layers*/\
TerrainGrass12                      /*terrain grass - X layers*/\
TerrainGrass13                      /*terrain grass - X layers*/\
TerrainGrass14                      /*terrain grass - X layers*/\
TerrainGrass15                      /*terrain grass - X layers*/\
Crater1                             /*Crater rendering - X craters*/\
Crater2                             /*Crater rendering - X craters*/\
Crater3                             /*Crater rendering - X craters*/\
Crater4                             /*Crater rendering - X craters*/\
Crater5                             /*Crater rendering - X craters*/\
Crater6                             /*Crater rendering - X craters*/\
Crater7                             /*Crater rendering - X craters*/\
Crater8                             /*Crater rendering - X craters*/\
Crater9                             /*Crater rendering - X craters*/\
Crater10                            /*Crater rendering - X craters*/\
Crater11                            /*Crater rendering - X craters*/\
Crater12                            /*Crater rendering - X craters*/\
Crater13                            /*Crater rendering - X craters*/\
Crater14                            /*Crater rendering - X craters*/\
Sprite                              /*Shader used for sprite rendering - it uses SoftParticle approach*/\
SpriteSimple                        /*Shader used for sprite rendering - no SoftParticle approach*/\
Horizon                             /*Shader used for the horizon*/\
TerrainX                            /*terrain - general number of layers*/\
TerrainSimpleX                      /*terrainSimple - general number of layers*/\
TerrainGrassX                       /*terrain grass - general number of layers*/\
TreeSimple                          /*Tree shader - simpler version of Tree*/\
Skin                                /*Human skin - derived from Super shader*/\
CalmWater                           /*calm water surface*/\
TreeAToC                            /*tree with alpha to coverage*/\
GrassAToC                           /*grass with alpha to coverage*/\
TreeSN                              /*Tree shader width simple noise*/\
SpriteExtTi                         /*Sprite used for vehicles covering*/\
TerrainSNX                          /*terrain - general number of layers + satellite normal map*/\
InterpolationAlpha                      /**/\
VolCloud                              /*Shader used for volumetric cloud - it uses SoftParticle approach*/\
VolCloudSimple                        /*Shader used for volumetric cloud - no SoftParticle approach*/\
UnderwaterOcclusion                        /*Shader used for underwater occlusion object*/\
SimulWeatherClouds                    /** SimulWeather clouds */ \
SimulWeatherCloudsWithLightning       /** SimulWeather clouds with lightning */ \
SimulWeatherCloudsCPU                 /** SimulWeather clouds with CPU distance fading */ \
SimulWeatherCloudsWithLightningCPU    /** SimulWeather clouds with lightning and CPU distance fading */ \
SuperExt                            /* skyscraper & building, intended as super shader light version */\
SuperHair                           /* super shader for hair rendering*/\
SuperHairAtoC                           /* super shader for hair rendering, atoc version*/\
Caustics                             /* shader for caustics effect */\
Refract                              /* shader for refractions _ARMA3_REFRACTION */\
SpriteRefract                              /* _ARMA3_REFRACTION_SPRITES - Shader used for sprite rendering with  refraction - it uses SoftParticle approach*/\
SpriteRefractSimple                        /* _ARMA3_REFRACTION_SPRITES - Shader used for sprite rendering with  refraction- no SoftParticle approach*/\
SuperAToC                           /* Super shader AToC variant */\
NonTLFlareNew                        /*shader to be used for flares, new HDR version*/\
NonTLFlareLight                        /*shader to be used for flares from dynamic lights (not sun)*/\
TerrainNoDetailX                     /*terrainX without detail map*/\
TerrainNoDetailSNX                     /*terrainSNX without detail map*/\
TerrainSimpleSNX                     /*terrainSNX without parallax mapping*/\
NonTLFlareNewNoOcclusion             /*same as NonTLFlareNew, but without occlusion test*/\
Empty                                /*empty shader, does not output anything (used only for depth output)*/\
Point                               /*Shader used for point lights*/\
TreeAdvTrans                        /*same as TreeAdv, but there is translucency map in alpha channel of MCA texture ( instead of AO)*/\
TreeAdvTransAToC                    /*same as TreeAdv, but there is translucency map in alpha channel of MCA texture ( instead of AO)*/\
DepthOnly                           /*Special replacement for AlphaOnly for priming non- alpha objects */\
```

```Basic                           /*no extra info*/\
NormalMap                       /*normal map*/\
NormalMapDiffuse                /*normal map + detail map*/\
Grass                           /**/\
Dummy1                          /**/\
Dummy2                          /**/\
Water                           /*per-vertex water animation*/\
WaterSimple                     /*per-vertex water animation (without foam)*/\
Sprite                          /*particle effects*/\
Point                           /*anti-aliased points*/\
NormalMapThrough                /*normal map - tree shader*/\
Dummy3                          /**/\
Terrain                         /*one pass terrain, no alpha mask - based on VSNormalMapDiffuse*/\
NormalMapAS                     /*normal map with ambient shadow*/\
NormalMapDiffuseAS              /*diffuse normal map with ambient shadow*/\
NormalMapSpecularThrough        /*normal map with specular - tree shader*/\
Shore                           /*sea shore - similar to Terrain*/\
TerrainGrass                    /*grass layer - similar to Terrain*/\
Multi                           /*Multi shader - shader with multiple layers suitable for huge surfaces like houses*/\
TreePRT                         /*Tree shader - very cheap shader designed for trees and bushes*/\
Skin                            /*Human skin - derived from Super shader*/\
CalmWater                       /*calm water surface - special shader*/\
VolCloud                        /*volumetric clouds*/\
UnderwaterOcclusion             /*underwater occlusion object vertex shader*/\
SimulWeatherClouds              /*simul weather clouds*/\
SimulWeatherCloudsCPU           /*simul weather clouds with CPU distance fading*/\
SpriteOnSurface                 /*sprite on surface*/\
Refract                         /*vertex shader for refractions - _ARMA3_REFRACTION*/\
SimulWeatherCloudsGS            /*simul weather clouds with geom shader*/\
BasicFade                       /*basic with face fading (based on the angle with camera direction */\
Star                            /*Similar to Point but only for drawing stars */\
```

You can find More about material settings in Material templates

#### Physical properties

Materials are also used in geometries for definition of physical properties.

Parameters for engine are saves into material tables *.bisurf and reference to them from material looks like:

```surfaceInfo="data\wood.bisurf";
```

Such file *.bisurf with physical properties looks like:

```density=2500; // density of homogeneous object in kg/m3 // WikiPedia:List of Elements by density
thickness=10; // non-homogeneous component casing thickness in mm, implemented since ARMA 2: Operation Arrowhead!
rough=0.1;
dust=0.1;
bulletPenetrability=150;  // distance in mm bullet (with speed 1000m/s) travels before it fully stops, simulation for calculation simplification calculate linear braking (ergo on third of distance is bullet decelerated to two thirds of original speed)
soundEnviron=Empty;
isWater=false;
```