Difference between revisions of "Procedural Textures"

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Text replacement - "aren't" to "are not")
m
 
(17 intermediate revisions by 6 users not shown)
Line 1: Line 1:
 
{{TOC|side}}
 
{{TOC|side}}
== What are procedural textures ==
+
Procedural textures are textures generated by the engine on the basis of their text description.
 +
They can be used anywhere instead of normal textures.<br>
 +
Text description of procedural texture is set in standard place of texture path and filename.
 +
To identify that a procedural texture is used, the character "#" is set at the beginning of the string.<br>
 +
Usually the string consists of procedural texture type name and arguments on both sides enclosed in brackets, in format {{hl|#(leftArgs)TypeName(rightArgs)}}.
  
Procedural textures are textures generated by our engine on the basis of theirs text description.
+
Textures may be generated procedurally and they take nearly no space on HDD but they still use space in video memory.
They can be used anywhere instead of normal textures.
+
Yet, if two materials use the exact same procedural texture string, the texture already existing in video memory is used and not duplicated - thus it may be important to try and avoid creating unnecessary similar textures.
Text description of procedural texture is set in standard place of texture path and filename.
+
{{Feature|important|
To identify procedural texture is used character "#" on beginning of string.
+
* There cannot be any spaces or mathematical expressions within the string.
Usually string consists of procedural texture type name and arguments on sides enclosed in brackets: #(A)TypeName(B).
+
* Decimals always have to be preceded by a 0 (e.g. {{hl|0.5}} instead of {{hl|.5}}).
There can't be any spaces or mathematical expressions within name.
+
* Only double quotes {{hl|"}} are supported within the string, single quotes {{hl|'}} are not: <sqf>
 +
_object setObjectTexture "#something(""text"")"; // OK
 +
_object setObjectTexture '#something("text")'; // OK
 +
_object setObjectTexture "#something('text')"; // not OK
 +
</sqf>
 +
}}
  
Textures may be generated procedurally and they take nearly no space on HDD but they still use space in video-memory.
 
Yet if two materials use procedural texture with same name then it is taken as only one texture and uses memory space only once.
 
Thus it is needed to avoid creating unnecessarily nearly same textures.
 
  
 +
== Procedural Texture Types ==
  
== Types of procedural textures ==
+
Note that all texture types have in common the left-hand parameters list:
 +
* format - texture color format (can be {{hl|rgb}}, {{hl|argb}}, {{hl|ai}}, {{hl|a}}, {{hl|i}})
 +
* width - number of pixels in X, in power of two (e.g 1, 2, 4, 8, 16, 32, 64, 128 etc)
 +
* height - number of pixels in Y, in power of two (e.g 1, 2, 4, 8, 16, 32, 64, 128 etc)
 +
* mipmapsAmount - number of {{Link|https://en.wikipedia.org/wiki/Mipmap|mipmaps}} to generate
  
=== color ===
+
=== Color ===
  
  #(format,width,height,number of mipmaps)color(r,g,b,a,texture type)
+
  #(format,width,height,mipmapsAmount)'''color'''(r,g,b,a)
 +
and
 +
#(format,width,height,mipmapsAmount)'''color'''(r,g,b,a,textureType)
  
* format - texture color format (RGB nebo ARGB)
+
* r, g, b, a - texture channels (Red, Green, Blue, Alpha)
* width - number of pixels in X
+
* textureType - [[Texture Naming Conventions|texture type]] which match texture name ending without "_" (optional)
* height - number of pixels in Y
 
* number of mipmaps - number of mipmaps
 
* r, g, b, a - texture channels (Red, Green, Blue, Alpha). Decimals have to be preceded by a 0 (e.g. 0.5 instead of .5).
 
* texture type - [[Texture Naming Conventions|texture type]] which match texture name ending without "_" (optional)
 
  
 
Examples:
 
Examples:
 
  #(rgb,8,8,3)color(1,0,0,1)
 
  #(rgb,8,8,3)color(1,0,0,1)
 +
#(rgb,1,1,1)color(0.5,0.5,0.5,1) {{cc|empty 1&times;1 detail map}}
 +
#(rgb,1,1,1)color(0.5,0.5,1,1) {{cc|empty 1&times;1 normal map}}
 
  #(rgb,8,8,3)color(0.5,0.5,0.5,1,dt)
 
  #(rgb,8,8,3)color(0.5,0.5,0.5,1,dt)
 
  #(rgb,8,8,3)color(0.5,0.5,1,1,no)
 
  #(rgb,8,8,3)color(0.5,0.5,1,1,no)
Line 34: Line 45:
 
=== Render To Texture ===
 
=== Render To Texture ===
  
  #(argb,512,512,1)r2t(surface,aspect)
+
  #(argb,512,512,1)'''r2t'''(surface,aspect)
  
 
* surface - The name that will later be used as reference in the camera script
 
* surface - The name that will later be used as reference in the camera script
 
* aspect - Aspect ratio of the image
 
* aspect - Aspect ratio of the image
 +
 +
{{Feature|informative|Do not use capital letters when naming RTT surfaces.}}
  
 
Examples:
 
Examples:
 
 
  #(argb,512,512,1)r2t(rtt,1.0)
 
  #(argb,512,512,1)r2t(rtt,1.0)
 
  #(argb,512,512,1)r2t(rendersurface,1.333)
 
  #(argb,512,512,1)r2t(rendersurface,1.333)
  
{{Informative | Avoid using capital letters when naming rtt surfaces.}}
+
=== Perlin Noise ===
  
=== perlinNoise ===
+
#(format,width,height,mipmapsAmount)'''perlinNoise'''(xScale,yScale,min,max)
  
#(format,width,height,number of mipmaps)perlinNoise(xScale,yScale,min,max)
+
* xScale - horizontal noise scale (typically a multiple of 256)
 
+
* yScale - horizontal noise scale (typically a multiple of 256)
* xScale - horizontal noise scale (typically a multiply of 256)
 
* yScale - horizontal noise scale (typically a multiply of 256)
 
 
* min - minimum value
 
* min - minimum value
 
* max - minimum value
 
* max - minimum value
  
 
Examples:
 
Examples:
 +
#(ai,512,512,9)perlinNoise(256,256,0,1)
  
#(ai,512,512,9)perlinNoise(256,256,0,1)
+
=== Irradiance ===
  
=== irradiance ===
+
#(format,width,height,mipmapsAmount)'''irradiance'''(specularPower)
  
#(format,width,height,number of mipmaps)irradiance(specular power)
+
* specularPower - specular strength
 
* format - texture color format (RGB nebo ARGB)
 
* width - number of pixels in X
 
* height - number of pixels in Y
 
* number of mipmaps - number of mipmaps
 
* specular power - specular strenght
 
  
It's values table which is used with per-pixel lighting. Modern shaders are not using this type of texture anymore.
+
It is a values table that is used with per-pixel lighting. Modern shaders are not using this type of texture anymore.
  
 
Examples:
 
Examples:
 
 
  #(ai,32,128,1)irradiance(8)
 
  #(ai,32,128,1)irradiance(8)
  
 
=== Fresnel ===
 
=== Fresnel ===
  
see [[Super shader#6._Fresnel function|Super shader - Fresnel function]]
+
#(format,width,height,mipmapsAmount)'''Fresnel'''(N,K)
 +
 
 +
* N - refractive index
 +
* K - absorption coefficient
 +
 
 +
{{Feature|informative|see [[Super shader#6._Fresnel function|Super shader - Fresnel function]].}}
  
 
Example:
 
Example:
 +
#(ai,64,64,1)Fresnel(1.3,7)
  
  #(ai,64,64,1)Fresnel(1.3,7)
+
=== Fresnel Glass ===
 +
 
 +
#(format,width,height,mipmapsAmount)'''fresnelGlass'''()
 +
 
 +
Examples:
 +
  #(ai,64,64,1)fresnelGlass()
 +
 
 +
=== Water Irradiance ===
 +
 
 +
#(format,width,height,mipmapsAmount)'''waterIrradiance'''(specularPower)
 +
 
 +
* specularPower - specular strength
 +
 
 +
This texture main value is solely with special pixel shaders for water.
 +
 
 +
Examples:
 +
 
 +
 
 +
=== Tree Crown ===
 +
 
 +
#(format,width,height,mipmapsAmount)'''treeCrown'''(density)
 +
and
 +
#(format,width,height,mipmapsAmount)'''treeCrownAmb'''(density)
 +
for ambient lighting.
 +
 
 +
* density - defines how much light passes thought tree-top ''via'' the longest line segment
 +
 
 +
This texture is used only for diffuse lighting actually it just counts exponential function (v PS2 can be done easily w/o texture).
 +
 
 +
Parameter defines how much surrounding light passes into the defined point.
 +
It uses an exponential function of distance from circle boundary.
 +
 
 +
Examples:
 +
#(ai,32,32,1)treeCrown(0.2)
 +
#(ai,32,32,1)treeCrownAmb(0.5)
 +
 
 +
=== Point ===
  
=== fresnelGlass ===
+
#(format,width,height,mimapsAmount)'''point'''()
  
#(format,width,height,number of mipmaps)fresnelGlass()
+
Create a white dot on a transparent background.
 
* format - texture color format (RGB nebo ARGB)
 
* width - number of pixels in X
 
* height - number of pixels in Y
 
* number of mipmaps - number of mipmaps
 
  
 
Examples:
 
Examples:
 +
#(rgb,64,64,1)point()
 +
 +
=== Dither ===
 +
 +
#(format,width,height,mipmapsAmount)'''dither'''(min,max)
 +
 +
* min - minimum value
 +
* max - minimum value
  
#(ai,64,64,1)fresnelGlass()
+
The format '''has''' to be {{hl|ai}}.
  
=== waterIrradiance ===
+
Examples:
 +
#(ai,8,8,1)dither(0,150)
  
#(format,width,height,number of mipmaps)waterIrradiance(specular power)
+
{{ArgTitle|3|Text|{{GVI|arma3|2.12}}}}
  
* format - texture color format (RGB nebo ARGB)
+
Creates a text texture.
* width - number of pixels in X
 
* height - number of pixels in Y
 
* number of mipmaps - number of mipmaps
 
* specular power - specular strenght
 
  
Possible future expansion : As addition to specular exponen there might be refractive index.
+
#(rgb,width,height,3)'''text'''(valign,halign,"FontName",fontSize,backgroundColor,textColor,"text")
  
This texture main value is solely with special pixel shaders for water.
+
* valign - from 0(top), 1(center), 2(bottom)
 +
* halign - from 0(left), 1(center), 2(right)
 +
* fontName - [[FXY File Format#Arma 3|Available fonts]]
 +
* fontSize - Number
 +
* backgroundColor - in format #RRGGBB or #RRGGBBAA
 +
* textColor - in format #RRGGBB or #RRGGBBAA
 +
* text - the text to display
  
=== treeCrown ===
+
Examples:
 +
#(rgb,512,512,3)text(0,0,"Caveat",0.3,"#0000ff7f","#ff0000","Hallo\nWelt")
  
#(format,width,height,number of mipmaps)treeCrown(density)
+
{{ArgTitle|3|UI On Texture|{{GVI|arma3|2.12}}}}
  
* format - texture color format (RGB nebo ARGB)
+
Generates an UI Display and renders the result into a texture.
* width - number of pixels in X
 
* height - number of pixels in Y
 
* number of mipmaps - number of mipmaps
 
* specular power - specular strenght
 
* density - defines how much light pass thought tree-top via longest line segment
 
  
It's used only for diffuse lighting actually it just counts exponential function (v PS2 can be done easily w/o texture)
+
#(rgb,Width,Height,MipCount)'''ui'''("DisplayClassName","UniqueName","texType")
  
For ambient lighting is used another type of textures: texture="#(ai,32,32,1)treeCrownAmb(0.5)";
+
* displayClassName - From [[Description.ext]] (Mission Config File) or {{hl|config.cpp}} (Mod Config). Case sensitive.
Parameter defines how much surrounding light pass into defined point.
+
* uniqueName - A string to declare the display's unique name. Naming is the same as classnames (a-z, A-Z, 0-9, _)
Textura is exponential function of distance from circle boundary.
+
* texType - (Optional) default "ca"? See [[Texture Map Types]]
  
 
Examples:
 
Examples:
 +
#(rgb,1024,1024,1)ui("RscDisplayRenderTest","abc")
 +
#(rgb,1024,1024,1)ui(RscDisplayMain,abc)
  
#(ai,32,32,1)treeCrown(0.2)
+
Related commands:
 +
[[displayUpdate]], [[displayUniqueName]]
 +
 
 +
{{ArgTitle|3|UI On Texture Advanced|{{GVI|arma3|2.14}}}}
  
=== Others ===
+
Same as [[#UI_On_Texture]] but has a different way of providing arguments and supports more advanced arguments.
 +
String values can be quoted in " or '. If no whitespace is in the string, quotes are not required.
  
Engine supports also simple procedural textures, you can just write instead of filename
+
#(rgb,Width,Height,MipCount)'''uiEx'''(argumentName:argumentValue, otherArgumentName:otherArgumentValue, ...)
  
#(format,width,height,number of mipmaps)color(r,g,b,a)
+
Current supported arguments
  
==== Empty detail map ====
+
* display [[String]] - The displays class name. From [[Description.ext]] (Mission Config File) or {{hl|config.cpp}} (Mod Config). Case sensitive. This entry is required.
#(rgb,1,1,1)color(0.5,0.5,0.5,1)
+
* uniqueName [[String]] - A string to declare the display's unique name. Naming is the same as classnames (a-z, A-Z, 0-9, _) This entry is required.
 +
* texType [[String]] - (Optional, default "ca"?) See [[Texture Map Types]]
 +
* viewportX [[Scalar]] - Horizontal offset for rendering viewport. Can be used to only render specific section of the Display. Default 0
 +
* viewportY [[Scalar]] - Vertical offset. Default 0
 +
* viewportW [[Scalar]] - Width Multiplier in percent. Default 1
 +
* viewportH [[Scalar]] - Height multiplier Default 1
 +
* bgColor [[String]] - of format {{hl|#RRGGBB}} or {{hl|#RRGGBBAA}}. Default transparent {{hl|#00000000}}
 +
* mipFilter [[String]] - either {{hl|point}} or {{hl|linear}}. Default{{hl|point}}
  
==== Empty normal map ====
+
Examples:
  #(rgb,1,1,1)color(0.5,0.5,1,1)
+
  #(rgb,2048,4096,1)uiEx(display:"RscDisplayFieldManual", uniqueName:"testName")
 +
#(rgb,2048,4096,1)uiEx(display:RscDisplayFieldManual, uniqueName:testName, viewportX:-0.5, viewportW:2, bgColor:#ff000000)
  
  
{{GameCategory|arma1| Texturing}}
+
{{GameCategory|arma1|Texturing}}
 
{{GameCategory|arma2|Editing}}
 
{{GameCategory|arma2|Editing}}
 
{{GameCategory|arma3|Editing}}
 
{{GameCategory|arma3|Editing}}
[[Category:Data Types]]
 

Latest revision as of 15:13, 1 May 2023

Procedural textures are textures generated by the engine on the basis of their text description. They can be used anywhere instead of normal textures.
Text description of procedural texture is set in standard place of texture path and filename. To identify that a procedural texture is used, the character "#" is set at the beginning of the string.
Usually the string consists of procedural texture type name and arguments on both sides enclosed in brackets, in format #(leftArgs)TypeName(rightArgs).

Textures may be generated procedurally and they take nearly no space on HDD but they still use space in video memory. Yet, if two materials use the exact same procedural texture string, the texture already existing in video memory is used and not duplicated - thus it may be important to try and avoid creating unnecessary similar textures.

  • There cannot be any spaces or mathematical expressions within the string.
  • Decimals always have to be preceded by a 0 (e.g. 0.5 instead of .5).
  • Only double quotes " are supported within the string, single quotes ' are not:
    _object setObjectTexture "#something(""text"")"; // OK _object setObjectTexture '#something("text")'; // OK _object setObjectTexture "#something('text')"; // not OK


Procedural Texture Types

Note that all texture types have in common the left-hand parameters list:

  • format - texture color format (can be rgb, argb, ai, a, i)
  • width - number of pixels in X, in power of two (e.g 1, 2, 4, 8, 16, 32, 64, 128 etc)
  • height - number of pixels in Y, in power of two (e.g 1, 2, 4, 8, 16, 32, 64, 128 etc)
  • mipmapsAmount - number of mipmaps to generate

Color

#(format,width,height,mipmapsAmount)color(r,g,b,a)

and

#(format,width,height,mipmapsAmount)color(r,g,b,a,textureType)
  • r, g, b, a - texture channels (Red, Green, Blue, Alpha)
  • textureType - texture type which match texture name ending without "_" (optional)

Examples:

#(rgb,8,8,3)color(1,0,0,1)
#(rgb,1,1,1)color(0.5,0.5,0.5,1)	// empty 1×1 detail map
#(rgb,1,1,1)color(0.5,0.5,1,1)		// empty 1×1 normal map
#(rgb,8,8,3)color(0.5,0.5,0.5,1,dt)
#(rgb,8,8,3)color(0.5,0.5,1,1,no)

Render To Texture

#(argb,512,512,1)r2t(surface,aspect)
  • surface - The name that will later be used as reference in the camera script
  • aspect - Aspect ratio of the image
Do not use capital letters when naming RTT surfaces.

Examples:

#(argb,512,512,1)r2t(rtt,1.0)
#(argb,512,512,1)r2t(rendersurface,1.333)

Perlin Noise

#(format,width,height,mipmapsAmount)perlinNoise(xScale,yScale,min,max)
  • xScale - horizontal noise scale (typically a multiple of 256)
  • yScale - horizontal noise scale (typically a multiple of 256)
  • min - minimum value
  • max - minimum value

Examples:

#(ai,512,512,9)perlinNoise(256,256,0,1)

Irradiance

#(format,width,height,mipmapsAmount)irradiance(specularPower)
  • specularPower - specular strength

It is a values table that is used with per-pixel lighting. Modern shaders are not using this type of texture anymore.

Examples:

#(ai,32,128,1)irradiance(8)

Fresnel

#(format,width,height,mipmapsAmount)Fresnel(N,K)
  • N - refractive index
  • K - absorption coefficient

Example:

#(ai,64,64,1)Fresnel(1.3,7)

Fresnel Glass

#(format,width,height,mipmapsAmount)fresnelGlass()

Examples:

#(ai,64,64,1)fresnelGlass()

Water Irradiance

#(format,width,height,mipmapsAmount)waterIrradiance(specularPower)
  • specularPower - specular strength

This texture main value is solely with special pixel shaders for water.

Examples:


Tree Crown

#(format,width,height,mipmapsAmount)treeCrown(density)

and

#(format,width,height,mipmapsAmount)treeCrownAmb(density)

for ambient lighting.

  • density - defines how much light passes thought tree-top via the longest line segment

This texture is used only for diffuse lighting actually it just counts exponential function (v PS2 can be done easily w/o texture).

Parameter defines how much surrounding light passes into the defined point. It uses an exponential function of distance from circle boundary.

Examples:

#(ai,32,32,1)treeCrown(0.2)
#(ai,32,32,1)treeCrownAmb(0.5)

Point

#(format,width,height,mimapsAmount)point()

Create a white dot on a transparent background.

Examples:

#(rgb,64,64,1)point()

Dither

#(format,width,height,mipmapsAmount)dither(min,max)
  • min - minimum value
  • max - minimum value

The format has to be ai.

Examples:

#(ai,8,8,1)dither(0,150)

Text

Creates a text texture.

#(rgb,width,height,3)text(valign,halign,"FontName",fontSize,backgroundColor,textColor,"text")
  • valign - from 0(top), 1(center), 2(bottom)
  • halign - from 0(left), 1(center), 2(right)
  • fontName - Available fonts
  • fontSize - Number
  • backgroundColor - in format #RRGGBB or #RRGGBBAA
  • textColor - in format #RRGGBB or #RRGGBBAA
  • text - the text to display

Examples:

#(rgb,512,512,3)text(0,0,"Caveat",0.3,"#0000ff7f","#ff0000","Hallo\nWelt")

UI On Texture

Generates an UI Display and renders the result into a texture.

#(rgb,Width,Height,MipCount)ui("DisplayClassName","UniqueName","texType")
  • displayClassName - From Description.ext (Mission Config File) or config.cpp (Mod Config). Case sensitive.
  • uniqueName - A string to declare the display's unique name. Naming is the same as classnames (a-z, A-Z, 0-9, _)
  • texType - (Optional) default "ca"? See Texture Map Types

Examples:

#(rgb,1024,1024,1)ui("RscDisplayRenderTest","abc")
#(rgb,1024,1024,1)ui(RscDisplayMain,abc)

Related commands: displayUpdate, displayUniqueName

UI On Texture Advanced

Same as #UI_On_Texture but has a different way of providing arguments and supports more advanced arguments. String values can be quoted in " or '. If no whitespace is in the string, quotes are not required.

#(rgb,Width,Height,MipCount)uiEx(argumentName:argumentValue, otherArgumentName:otherArgumentValue, ...)

Current supported arguments

  • display String - The displays class name. From Description.ext (Mission Config File) or config.cpp (Mod Config). Case sensitive. This entry is required.
  • uniqueName String - A string to declare the display's unique name. Naming is the same as classnames (a-z, A-Z, 0-9, _) This entry is required.
  • texType String - (Optional, default "ca"?) See Texture Map Types
  • viewportX Scalar - Horizontal offset for rendering viewport. Can be used to only render specific section of the Display. Default 0
  • viewportY Scalar - Vertical offset. Default 0
  • viewportW Scalar - Width Multiplier in percent. Default 1
  • viewportH Scalar - Height multiplier Default 1
  • bgColor String - of format #RRGGBB or #RRGGBBAA. Default transparent #00000000
  • mipFilter String - either point or linear. Defaultpoint

Examples:

#(rgb,2048,4096,1)uiEx(display:"RscDisplayFieldManual", uniqueName:"testName")
#(rgb,2048,4096,1)uiEx(display:RscDisplayFieldManual, uniqueName:testName, viewportX:-0.5, viewportW:2, bgColor:#ff000000)