Loading...
 

Materials-Textures

Diametric Reflectivity Extension
(material rendering approach)

SpecularXY - sharp edge (light)
SpecularZ - far inner (spheremap-filter)
ReflectionXY - narrow (cubemapped)
ReflectionZ - near inner (raytraced)

This is a stylistic paradigm to rendering materials in a fundamentally different way, by using two opposing textures and shaders for both specularity and reflection. In the rigid realm of modern physically-based rendering orthodoxy, there are two benefits to following this technique. These two opposites can be adjusted and exploited to create reflection offset and sweeping effects during movement and animation, to result in highly reactive hyper-reflective stylised visuals, still being compatible with current standard material practices, and is also geared toward being more optimised from an artistic discernment, in conjunction with (and not only) a technical one.

The inherent philosophy is that physically-based rendering should become a necessary refinement over time, not an initial enforcement to obey, and the reality is that our workflow is at great risk of this rigidity while the concepts within the projects themselves can only benefit from such unconventional approach, and this is fully suited to the characteristic of the team. It actually allows for great flexibility in how a surface can be stylised in terms of light interaction and reflectivity, not only in parametric and programmatic terms but also artistic ones, as only a texture adjustment may be required and thus under complete command of mappers and texture artists alike. These extra texture passes are easily derived and compounded from the standard ones compatible with modern physically-based rendering, and optionally broken apart or composed together depending on necessity, all entirely automated within our integrated development environment.

The meaning involves both diametric in a stylistic sense, but also a technical one in terms of optimisation. At any one time, only half of the surfaces within a scene should be using raytraced reflections, and then only half of those again would have a depth higher than one. This is true for rendering distance and some options within material scripts, but this approach allows it to be true for more developers to decide how and where it should be optimised, and even more heavily so, by virtue of a raytraced reflection always having a cubemap bake to deprecate to by default, and therefore able to be optimised in more subjectively aggressive ways, even foregoing entire texture passes completely. The belief is that aggressive optimisations with one hand allows freedom and privilege with the other, and isolated focused accurate reflections can be achieved where necessary while technically, being friendly to performance, and artistically, friendly to creativity.

It's also possible, at least within our offline rendering workflow, to subjugate the more demanding reflection standards for lesser ones, either in part or as a whole, or vise-versa if desired. Both the reflection axes can be assigned to either low-res spheremaps (used by specularity), medium-res baked cubemaps, high-res baked cubemaps, or per-pixel raytraced reflections, or any combination or order therein. This means that scenes can be as infinitely reflective as the mapper intends and will take as long to render as necessary, without being restricted to real-time performance limitations, while at the same time being fully scalable down to a rendering approach multiple times removed from the current generation of real-time graphics, all using the same content and all mostly automated.

The goal is the ability to render something that is "more reflective" than the most highly reflective thing perceptible under the suffocating constraints of modern realistic rendering, even if that itself becomes unrealistic in favour of stylisation and artistic endeavour. This especially matters while enduring a lot of movement and animation where reflectivity really matters although often becomes lost. The intended purpose of offsetting axes in both reflection and specularity, using this technique with different methods, aims only to enhance it.


.
.
.
============
.
.
.




Opaque -(light+/fog+)

AlphaAdd -(light+/fog+) (used for light-effects)
*disable lighting, and disable fog but use custom mips for best effect for flares?

AlphaAdd2 -(light+/fog+) (used for bright light-effects)

AlphaAdd3 -(light+/fog+) (used for bright light-effects)

AlphaBlend -(light+/fog+)

AlphaBlend2 -X (*this was the original one with fog issues)

AlphaShade -completely invisible??? (could be more efficient?)

AlphaInverted -(light+/fog+) (could be used for crazy smoked-glass effect)(*inverts-behind!)

AlphaNegative -(light+/fog~) (could be used for smoked/stained-glass effect)(*needs mips)(*inv-img)

AlphaPositive -(light+/fog+) (used for bright-coloured decals (grafitti!))(inv-bright,correct-colour!)
*this is less transparent based on having less interaction with light. (use half-lambert/no normals) = "faded-grafitti"

AlphaPositive2 -(light+/fog+) (used for bright-coloured decals (grafitti?))
*this is less transparent based on having less interaction with light. (use half-lambert) = "bright-grafitti"

AlphaFade -(light+/fog+) (used for glass/liquids) (sometimes you'd use light but not normals???)
*this is MUCH less transparent based on having less interaction with light. (use half-lambert) = "glass/liquids"

Zero_SourceColor -(light+/fog+) (used for dark-decals (scuffs!))(*inv-colour!)(*inv-img!)
*this is MUCH less transparent based on having less interaction with light. (use half-lambert?) = "dark-decals"

Dual_MinusSource -(light+/fog+) (used for dark-decals (that hue-shift behind?))(*inv-brightness)
*this is less transparent based on having less interaction with light. (use half-lambert/no normals) = "dark-grafitti"

Dual_MinusDest -(light+/fog~) (could be used for smoked-glass effect)(*needs mips)

AlphaSubtract -X | AlphaSubtract2 -X | AlphaSubtract3 -X | AlphaFade2 -X | AlphaFade3 -X | AlphaNegative2 -X
SourceColor_Zero -X | DestColor_Zero -X | Zero_DestColor -X | Dual_Source -X | Dual_Dest -X

.
.
.




----------------------

  • _clr = colour ("diffuse" texture to assign colour)

- high colour-saturation with highlights and shadows removed.

  • _bmp = bump/height (parallax effect - dark=low, bright=high)

- X2 resolution and soft, without small harsh details.

  • _nrm = normalmap (colours represent angles to distribute light)

- derived from the bumpmap but sharper and with harsh details.

  • _spc = specular (determines where highlights from light occurs)

- focused on edges, high-contrast, sharp and noisy.

  • _rfl = reflection (determines where environment will be reflected)

- focused on middle features, high-contrast, soft and smooth.

  • _occ = occlusion (helps prevent the material from washing-out from strong lights)

- focused on edges and shadows, low-contrast, sharp and noisy.
----------------------
All of these "textures" are combined together in a "script" to create a "material".
The script determines environment reflections, "detail-mapping" and other attributes.
The textures (.TGA/.PNG) must be compiled into .DDS files to load in the engine faster.
...(the script):-
----------------------
highLevelMaterial "ve9/magnettxtrsgthmtlpltedr1"
{
template = ShaderBaseMaterial
reflectionColor = 1 1 1
reflectionSpecificCubemap = "Base\\Types\\Basic\\SkyBox\\env_damcloud2.jpg"
specularColor = 1 1 1
specularPower = 4
specularShininess = 256
displacementTechnique = ParallaxMapping
heightScale = 0.017
diffuse1Map
{
texture = "VE\\Textures\\ve9\\magnettxtrsgthmtlpltedr1_clr.dds"
}
diffuse2Map
{
texture = "VE\\Textures\\detail\\detaili_83.dds"
transform
{
scale = 32 72
}
}
diffuse6Map
{
texture = "VE\\Textures\\ve9\\magnettxtrsgthmtlpltedr1_occ.dds"
}
reflectionMap
{
texture = "VE\\Textures\\ve9\\magnettxtrsgthmtlpltedr1_rfl.dds"
}
specularMap
{
texture = "VE\\Textures\\ve9\\magnettxtrsgthmtlpltedr1_spc.dds"
}
normalMap
{
texture = "VE\\Textures\\ve9\\magnettxtrsgthmtlpltedr1_nrm.dds"
}
heightMap
{
texture = "VE\\Textures\\ve9\\magnettxtrsgthmtlpltedr1_bmp.png"
}
}




.
.
.




=====
- Shadowing Hate - "viohuman28" -
- character base (v28) (080303) -
- displacement modifier recipes -
=====

-------------------
- displacement types (to levels):-

.=small O=big #=soft !=sharp -=shallow
=deep

-------------------
- subdivision levels (to type):-
orig=0 lo=1 med=2 high=3 max=4 final=5+S
-------------------

"The type of displacement, including the greyscale image and its strengths and blur, determines what subdivision level the displacement should be effective from. This is to ensure a perfect balance between the smoothing of the subdivisions and effectiveness of the displacement, avoiding "steps" on big/soft/deep (O#
) displacements which slot into somewhere between the 2nd and 4th subdivision, and allowing extremely small/sharp/shallow (.!-) displacements that have effect from the 3rd up to the final 5th subdivision and the beyond final smoothing operations. At that point the resolution of the final normalmaps will not be able to translate any more detail. This method also ensures there are no arguments between the displacements as originally ordered, to avoid folding and countereffective values in any one area. Almost nothing is displaced at level 1 subdivision which is still considered as an interpretation of the original mesh and displacements that large and soft would be done by actually adjusting the original mesh. Displacements at the 2nd subdivision are for big/soft/deep (O#
) manipulations of the upper and lower meshes only, never for heads. The following lists have been ordered by level, then by displacement image number, and ultimately ordered to avoid steps and unintentional folding, allowing for harsh smooth shaping in harmony with finer subtle detail. The "dif" (*) column indicates where the female version has different strength and/or blur values for the same displacement as cloned from the male version, or it may also indicate what might (?) need tweaking later on."


---------------------
- (male head) - mesh "head" - ID "3" - push "0.037" -
------------------------
displacement image:- .dif | strength:- | blur:- | type:- | level:-
------------------------
00_innermouth | -0.05 | 1.0 | .!- | high

04_nostril | -0.5 | 2.0 | .!
| high 05_brow | 0.4 | 3.0 | .#
| high 08_mouthedge2 | 0.2 | 2.0 | .#
| high 11_chin1 | 1.0 | 10.0 | .#
| high

13_mouthedge3 | -0.05 | 0.03 | .#- | high
16_cheek1 | -0.1 | 3.0 | .#- | high
17_cheek2 | -0.05 | 3.0 | O#- | high

18_ear1 | -0.3 | 1.0 | .#
| high 19_ear2 | -0.3 | 3.0 | .#
| high 23_cheekfar | -0.5 | 10.0 | O#
| high 26_eyesbetween2 | -0.3 | 10.0 | .#
| high

27_dimpol | -0.1 | 1.0 | .#- | high

37_eyesidedent | -0.2 | 6.0 | O#
| high 39_earlobe | 2.0 | 4.0 | .#
| high 40_foreheadbulge | 1.1 | 3.0 | O#
| high 41_eyesaggin | -0.5 | 3.0 | .#
| high 42_jawbone | 0.2 | 3.0 | O#
| high


01_eye | 0.1 | 0.1 | .!- | max

03_nose | -0.7 | 2.0 | .!
| max 06_lips | 0.3 | 0.3 | .#
| max

07_mouthedge | -0.1 | 1.0 | .!- | max
09_lips2 | 0.1 | 0.01 | .#- | max
10_lips3 | -0.1 | 0.3 | .#- | max
12_chin2 | -0.1 | 0.5 | .!- | max
14_eyesag | -0.02 | 0.03 | .!- | max
15_eyewrink | -0.01 | 0.03 | .!- | max
22_forehead | -0.02 | 0.01 | .!- | max

24_noseupside | -0.3 | 3.0 | .!
| max

25_eyesbetween | -0.05 | 0.3 | .!- | max

28_chinline | -0.3 | 0.7 | .!
| max

29_eyefinal | 0.1 | 1.0 | .!- | max
31_eyefinal2 | 0.01 | 0.3 | .!- | max

32_earline | 0.7 | 1.0 | .#
| max

34_liplines | -0.03 | 0.03 | .!- | max

35_nostrillines | 0.3 | 1.7 | .!
| max 36_mouthedge4 | 0.3 | 3.0 | .#
| max 38_eardetail | -0.3 | 0.01 | .!
| max

45_neckouts | 0.1 | 3.0 | .#- | max

47_cheektop !!! | -0.1 | 0.1 | .#
| max

02_hair ? | 1.0 | 3.0 | O!
| final 02_hair_b ? | 0.2 | 1.0 | O!
| final 03_nose !!!!! | -0.2 | 0.3 | .!
| final

07_mouthedge !!!!! | -0.03 | 0.3 | .!- | final
20_browhair | 0.05 | 0.01 | .!- | final
21_headcolor ? | -0.01 | 0.01 | O!- | final
30_oldwrinks | -0.01 | 0.01 | O!- | final
33_lipcracks | 0.01 | 0.01 | .!- | final
34_liplines !!!! | -0.005 | 0.01 | .!- | final

43_hairdetail | 0.7 | 0.7 | O!
| final

44_veinworks | 0.01 | 0.01 | O!- | final
46_lillumpies | 0.005 | 0.01 | O!- | final
48_cheektop2 !!! | -0.05 | 0.1 | .!- | final
49_liplines2 !!! | -0.05 | 0.01 | .!- | final
50_mouthedge4 !!! | -0.05 | 0.01 | .!- | final
99_quickin | 0.01 | 0.3 | O!- | final
------------------------

-------------------
- (female head) - mesh "head" - ID "3" - push "0.037" -
------------------------
displacement image:- .dif | strength:- | blur:- | type:- | level:-
------------------------
00_innermouth | -0.05 | 1.0 | .!- | high

04_nostril | -0.5 | 2.0 | .!
| high 05_brow | 0.3 | 3.0 | .#
| high

08_mouthedge2 * | 0.1 | 2.0 | .#- | high

11_chin1 * | 0.3 | 10.0 | .#
| high

13_mouthedge3 * | -0.03 | 0.03 | .#- | high
16_cheek1 * | -0.2 | 3.0 | .#- | high

17_cheek2 * | -0.2 | 3.0 | O#
| high 18_ear1 | -0.3 | 1.0 | .#
| high 19_ear2 | -0.3 | 3.0 | .#
| high 23_cheekfar | -0.5 | 10.0 | O#
| high 26_eyesbetween2 * | -0.2 | 10.0 | .#
| high

27_dimpol * | -0.2 | 1.0 | .#- | high

37_eyesidedent | -0.2 | 6.0 | O#
| high 39_earlobe | 2.0 | 4.0 | .#
| high 40_foreheadbulge * | 0.8 | 3.0 | O#
| high 41_eyesaggin * | -0.2 | 3.0 | .#
| high 42_jawbone * | 0.1 | 3.0 | O#
| high


01_eye | 0.1 | 0.1 | .!- | max

03_nose | -0.7 | 2.0 | .!
| max 06_lips * | 0.5 | 0.3 | .#
| max

07_mouthedge * | -0.05 | 1.0 | .!- | max
09_lips2 * | 0.05 | 0.01 | .#- | max
10_lips3 * | -0.05 | 0.3 | .#- | max
12_chin2 | -0.1 | 0.5 | .!- | max
14_eyesag * | -0.01 | 0.03 | .!- | max
15_eyewrink * | -0.005 | 0.03 | .!- | max
22_forehead * | -0.005 | 0.01 | .!- | max

24_noseupside | -0.3 | 3.0 | .!
| max

25_eyesbetween * | -0.03 | 0.3 | .!- | max

28_chinline * | -0.2 | 0.7 | .!
| max

29_eyefinal * | 0.05 | 1.0 | .!- | max
31_eyefinal2 | 0.01 | 0.3 | .!- | max

32_earline | 0.7 | 1.0 | .#
| max

34_liplines * | -0.05 | 0.03 | .!- | max

35_nostrillines | 0.3 | 1.7 | .!
| max 36_mouthedge4 * | 0.2 | 3.0 | .#
| max 38_eardetail | -0.3 | 0.01 | .!
| max

45_neckouts | 0.1 | 3.0 | .#- | max

47_cheektop !!! | -0.05 | 0.1 | .#
| max

02_hair ? | 0.6 | 3.0 | O!
| final 02_hair_b ? | 0.2 | 1.0 | O!
| final 03_nose !!!!! | -0.2 | 0.3 | .!
| final

07_mouthedge !!!!! | -0.03 | 0.3 | .!- | final
20_browhair | 0.05 | 0.01 | .!- | final
21_headcolor ? | -0.01 | 0.01 | O!- | final
30_oldwrinks * | -0.002 | 0.01 | O!- | final
33_lipcracks | 0.01 | 0.01 | .!- | final
34_liplines !!!! | -0.005 | 0.01 | .!- | final

43_hairdetail | 0.7 | 0.7 | O!
| final

44_veinworks | 0.01 | 0.01 | O!- | final
46_lillumpies * | 0.002 | 0.01 | O!- | final
48_cheektop2 !!! | -0.1 | 0.1 | .!- | final
49_liplines2 !!! | -0.05 | 0.01 | .!- | final
50_mouthedge4 !!! | -0.05 | 0.01 | .!- | final
99_quickin | 0.01 | 0.3 | O!- | final
------------------------

"The following lists are specifically for the semi-naked 'convalescent stasis chamber' characters, considered the only final unmodified outputs from the original bases for upper and lower meshes. Displacements are named as shared between the male and female versions and most likely very few of these will get reused on other characters. Because of the comparatively different size, texture resolution and mesh structure between the head and these lower and upper meshes, the balance between the displacement type and subdivision level shifts toward lower subdivisions for upper and lower displacements otherwise too soft and deep for the same subdivision level on the head meshes, but still enough to avoid "steps", of course."

---------------------
- (male naked) - mesh "upper" - ID "1" - push "0.037" -
------------------------
displacement image:- .dif | strength:- | blur:- | type:- | level:-
------------------------

upper_03_belly | 0.3 | 7.0 | O#
| med

upper_09_shoulderpads | 0.1 | 1.0 | .#- | med
upper_17_handfattener | 0.1 | 2.0 | .#- | med

upper_19_bigbackdent | -0.9 | 2.0 | O#
| med

manupper_01_chestdent | -0.7 | 5.0 | .#
| high manupper_02_pecsupport | -0.3 | 0.7 | .#
| high upper_00_abdowntrim | -0.3 | 7.0 | .#
| high

upper_12_elbow2 | -0.1 | 7.0 | .#- | high
upper_13_wristbumps | 0.05 | 3.0 | .#- | high
upper_14_musclesout | 0.2 | 0.3 | O#- | high
upper_15_midfrontline | -0.07 | 0.01 | .!- | high
upper_22_musclesout2 ? | 0.13 | 0.7 | O#- | high

manupper_01_chestdent | -0.1 | 1.0 | .#
| max manupper_00_nippols | 0.2 | 0.7 | .!
| max

upper_00_abdowntrim | -0.1 | 1.7 | .!- | max

upper_02_sixpackish | 0.3 | 0.01 | O#
| max upper_04_ribsy | 0.3 | 3.0 | .#
| max upper_05_collarbone | 0.2 | 2.0 | .#
| max

upper_06_spine | -0.1 | 3.0 | .!- | max

upper_07_backblades | 0.6 | 3.0 | .!
| max

upper_08_backribs | 0.2 | 1.0 | .!- | max

upper_10_armpit | -0.2 | 0.1 | .!
| max

upper_11_elbow | 0.1 | 0.1 | .!- | max
upper_12_elbow2 | -0.01 | 0.1 | .!- | max
upper_18_handsout | 0.03 | 0.1 | .!- | max
upper_21_absidemusc | 0.1 | 0.3 | .#- | max
upper_25_finalins ? | -0.01 | 0.3 | O!- | max

manupper_04_veinworks ? | 0.01 | 0.01 | O!- | final

upper_01_bellybutton | -0.5 | 1.0 | .!
| final

upper_06_spine | 0.05 | 0.01 | .!- | final
upper_16_musclesin | -0.07 | 0.3 | O!- | final
upper_20_handsin | -0.03 | 0.01 | .!- | final
upper_23_musclesin2 ? | -0.1 | 0.3 | O!- | final
upper_24_lillumpies ? | 0.01 | 0.01 | O!- | final
------------------------

-------------------
- (male naked) - mesh "lower" - ID "2" - push "0.037" -
------------------------
displacement image:- .dif | strength:- | blur:- | type:- | level:-
------------------------

manlower_02_package | 0.3 | 7.0 | .#
| high

lower_00_musclesout | 0.05 | 1.0 | O#- | high

lower_04_legbulges | 0.3 | 1.0 | O#
| high


manlower_00_buttcrack | -0.05 | 1.2 | .#- | max
manlower_01_buttbulge | 0.5 | 0.7 | .!- | max

manlower_02_package | 0.1 | 3.0 | .#
| max

lower_01_kneecaps | 0.07 | 0.01 | .#- | max
lower_02_kneebacks | -0.03 | 0.7 | .!- | max
lower_06_ankles | 0.1 | 1.0 | .#- | max
lower_07_heeltendon | 0.05 | 0.3 | .!- | max
lower_08_kneebacks2 | -0.1 | 0.7 | .!- | max
lower_09_pelvis | 0.1 | 1.0 | .#- | max

lower_11_shoey | 0.2 | 1.0 | .#
| max

lower_12_musclesin2 | -0.1 | 1.0 | O!- | max
lower_14_finalins ? | -0.01 | 0.3 | O!- | max

manlower_03_underwearline ??? | 0.1 | 0.01 | O!- | final
manlower_04_veinworks ? | 0.01 | 0.01 | O!- | final
lower_05_kneedetail | -0.06 | 0.01 | .!- | final
lower_10_musclesin | -0.05 | 0.1 | O!- | final
lower_13_lillumpies | 0.01 | 0.01 | O!- | final
------------------------

---------------------
- (female naked) - mesh "upper" - ID "1" - push "0.037" -
------------------------
displacement image:- .dif | strength:- | blur:- | type:- | level:-
------------------------

femupper_01_boobbulge * | 0.3 | 10.0 | O#
| med femupper_04_boobbulge2 * | 0.5 | 5.0 | O#
| med femupper_06_boobbulge3 * | 2.0 | 1.0 | O#
| med upper_03_belly | 0.3 | 7.0 | O#
| med

upper_09_shoulderpads | 0.1 | 1.0 | .#- | med
upper_17_handfattener | 0.1 | 2.0 | .#- | med

upper_19_bigbackdent * | -0.7 | 2.0 | O#
| med

femupper_03_boobsupport * | -0.3 | 0.7 | O!
| high femupper_05_boobsupport2 * | -0.2 | 0.3 | .!
| high upper_00_abdowntrim | -0.3 | 7.0 | .#
| high

upper_12_elbow2 | -0.1 | 7.0 | .#- | high
upper_13_wristbumps | 0.05 | 3.0 | .#- | high
upper_14_musclesout | 0.2 | 0.3 | O#- | high
upper_15_midfrontline * | -0.05 | 0.01 | .!- | high
upper_22_musclesout2 ? | 0.1 | 0.3 | O#- | high

femupper_02_chestdent * | -0.7 | 5.0 | .#
| max femupper_00_nippols * | 0.5 | 0.3 | .!
| max

femupper_07_boobsupport3 * | -0.1 | 1.0 | .!- | max
upper_00_abdowntrim * | -0.1 | 1.7 | .!- | max
upper_02_sixpackish * | 0.1 | 0.1 | O#- | max

upper_04_ribsy * | 0.2 | 3.0 | .#
| max upper_05_collarbone | 0.2 | 2.0 | .#
| max

upper_06_spine | -0.1 | 3.0 | .!- | max

upper_07_backblades | 0.6 | 3.0 | .!
| max

upper_08_backribs * | 0.1 | 1.0 | .!- | max

upper_10_armpit | -0.2 | 0.1 | .!
| max

upper_11_elbow | 0.1 | 0.1 | .!- | max
upper_12_elbow2 | -0.01 | 0.1 | .!- | max
upper_18_handsout | 0.03 | 0.1 | .!- | max
upper_21_absidemusc * | 0.05 | 0.3 | .#- | max
upper_25_finalins * | -0.005 | 0.3 | O!- | max

femupper_08_underwearline ??? | 0.1 | 0.01 | O!- | final
femupper_09_veinworks ? | 0.01 | 0.01 | O!- | final

upper_01_bellybutton | -0.5 | 1.0 | .!
| final

upper_06_spine | 0.05 | 0.01 | .!- | final
upper_16_musclesin * | -0.03 | 0.3 | O!- | final
upper_20_handsin | -0.03 | 0.01 | .!- | final
upper_23_musclesin2 ? | -0.03 | 0.3 | O!- | final
upper_24_lillumpies | 0.01 | 0.01 | O!- | final
------------------------

---------------------
- (female naked) - mesh "lower" - ID "2" - push "0.037" -
------------------------
displacement image:- .dif | strength:- | blur:- | type:- | level:-
------------------------

femlower_01_buttbulge * | 0.7 | 3.0 | O#
| med femlower_07_pussyout2 * | 1.0 | 0.7 | .#
| med


femlower_00_buttcrack * | -0.1 | 3.0 | .!- | high

femlower_06_pussyout * | 0.1 | 0.1 | .#
| high

lower_00_musclesout | 0.05 | 1.0 | O#- | high

lower_04_legbulges | 0.3 | 1.0 | O#
| high


femlower_00_buttcrack * | -0.1 | 0.3 | .!- | max

femlower_02_buttcrack2 * | -0.2 | 0.7 | .!
| max

femlower_03_buttcheekcrease * | -1.0 | 10.0 | .!- | max
femlower_03_buttcheekcrease * | -0.05 | 0.7 | .!- | max
femlower_04_buttcrack3 * | -0.1 | 0.3 | .!- | max
femlower_05_buttcrackdent * | -0.1 | 0.3 | .#- | max
lower_01_kneecaps | 0.07 | 0.01 | .#- | max
lower_02_kneebacks | -0.03 | 0.7 | .!- | max
lower_06_ankles | 0.1 | 1.0 | .#- | max
lower_07_heeltendon | 0.05 | 0.3 | .!- | max
lower_08_kneebacks2 | -0.1 | 0.7 | .!- | max
lower_09_pelvis | 0.1 | 1.0 | .#- | max

lower_11_shoey | 0.2 | 1.0 | .#
| max

lower_12_musclesin2 | -0.1 | 1.0 | O!- | max
lower_14_finalins * | -0.005 | 0.3 | O!- | max

femlower_08_underwearline ??? | 0.1 | 0.01 | O!- | final
femlower_09_veinworks ? | 0.01 | 0.01 | O!- | final
lower_05_kneedetail | -0.06 | 0.01 | .!- | final
lower_10_musclesin | -0.05 | 0.1 | O!- | final
lower_13_lillumpies ? | 0.01 | 0.01 | O!- | final
------------------------
------------------------

------------------------

- Final Subdivision & Smoothing:-
"...can be of various types depending on the nature of the detail, but these organic character use a single iteration 'quad output' subdivision modifier with strength and relax values both at 0.3 and all else default. Other times it's better to add another HSDS subdivision but you will have more control with proper 'mesh smooth' modifiers to gain more control over sharper details."

------------------------

- Noise recipe:-
"Each "final" stage can (should, for organics) have 2 specific subtle random noise modifiers applied before exporting for baking. One is a large smooth noise effect, the other is a fine grainy effect, both very subtle. It's barely noticable but I believe it will help toward a more truly organic feel among the visuals and help it to appear less perfect in an omnipresent way. Be sure the _EXACT_ values are always used, it will make for uniform and seamless results. One small incorrect value will certainly create ugly seams."

- Noise(1) - Noise(2)
- seed - "23" - "72"
- scale - "3" - "0.002"
- str-x - "0.03" - "0.002"
- str-y - "0.03" - "0.002"
- str-z - "0.03" - "0.002"

------------------------

- The new/alternate technique for finer normalmap details:-
"To create many finer details like wrinkles, veins and pimples, instead of subdividing the entire mesh to some ridiculous degree, I've discovered that these details can be rendered to a separate flat normalmap, still separated and highly subdivided but much easier to handle. This normalmap can then be place onto the lower subdivisions as a texture and translated into a final normalmap. Using 3D Studio MAX render-to-texture, this procedure can not only read actual mesh forms, but the output of a normalmap texture applied to these higher subdivisions, rendering out the large and smooth deformations of lower subdivion displacements along with the pre-baked details in the applied normalmap texture. Take note the end result will NOT be 100% correct using this method, the finer details will warp along the model differently giving a more unnatural result."

'low' to 'high' renderbump "360" render-to-texture:-
= follow normal displacement procedure

'max' & 'final' flat render-to-texture:-
= block-size= 128
= mesh-size= 32
= segs of entire mesh= 64x64 (file)
= tessellate 4 (tension 0) (+revert to editable mesh)
= tessellate 1 (tension 0) (+revert to editable mesh)
= turbosmooth (+revert to editable mesh)
= apply max & final displacements (or only final?)
= scale Z = 1000.0 (screen x2) (Y maybe viewport)

render-to-texture
= reset to 33.0

(normalmap options in render-to-texture settings):-
Nrm.-normalmap:= tangent X:Right Y:Down
Inv.-normalmap:= tangent X:Left Y:Down

------------------------

- Displacement Steps:-
"...happen when the displacement is too deep and strong on too great a subdivided surface that the greyscale values of 1 create visible "steps" between themselves that are larger than the destination texel scale of the normalmap. What this means is that because greyscale images are only 256 different levels of grey, it becomes interpreted as only 256 levels of difference on the mesh and can not be further interpolated with blur. The only way around this is to apply such displacements at lower subdivisions separately so that the subdivision smoothes the displacement result without the "steps" effect, while still leaving the finer details to higher subdivisions."

- Folding & Countereffective Values:-
"...happen when different displacements are applied to the same area with contradicting strength values, such as one displacement pushing outward while another overlapping displacement pulls inward with a stronger value, sometimes resulting in folding and can cause sharp artifacts on the normalmap. This is sometimes done on purpose such as around the eye areas for example, where a natural fold is achieved for the eyelids by using negative values on overlapping displacements."

- Flooding UV Seams:-
"...is when using strong extra blur on large/soft displacements close to the UV seams, the pixels can flood across these UV seams and, unable to be translated onto the final mesh, create harsh seams on the output high-detail mesh. As a result, large/soft displacements are not possible to use over or even near the boundary seams in the UV layout. This is why it's impossible to have specific displacements for the shoulders, being that area is split down the middle and detached in the UV layout. Luckily the shoulder is an area with tight mesh on the low-detail version, and all other UV seams reside along areas that would either be perfectly flat or have purposeful seams anyway, so the problem can be largely avoided."

------------------------

- Baking the final normalmap:-
"Displacements are grouped onto temporary dummy objects separated relating to their level and then applied during the appropriate subdivision operation on the target mesh, then converted back to an editable mesh for the next subdivision level and its displacements, and so on, which can all be scripted to happen automatically. For the baking of normalmaps, this needs to happen many number of times on small cut-outs of the whole model. As an example, each hand itself is treated with all 5 subdivisions plus mesh smoothing along with a buffer zone down the wrist, and likewise when the forearm gets baked it will include the wrist and part of the hand, and likewise part of the elbow at the other end which would also get rendered with the upper arm, and so on. These overlapping buffer areas are essential to be able to seamlessly composite the separate bakes into one entire final normalmap for the character, but unfortunately also means wasted rendering time baking the exact same stuff up to 3 times over. All up, for a whole character model, there would usually be over 20 different bakes done, sometimes using 3 different normalmap procedures if necessary, so baking out a normalmap for all 3 textures of a typical character model may take up to 100 different bakes dealing with up to 1 million triangles each. So a typical high-detail character model as perceived via the normalmap can be up to 20 million triangles, though that's an overestimation because so much is lost on overlapping normalmap blends during the final compositing stages, then only having just over 4 million texels to project that detail, the final polycount is very unclear. What is clear is that subtexel detail isn't entirely lost under 4MP, but serving toward enhancing and balancing the normal values that are there, with the baking procedures using antialiasing to estimate the normal values of multiple triangles into one texel toward the final normalmap. Like this, it pretty much works out that one texel can represent a calculated estimate of 8 triangles and its center vertex, which all up must be pretty damn close to our target texel scale for character models."

------------------------

- "Buffer" Render/Bake Zones:-
"If you look at the mesh structure around the lower front torso of the low-detail in-game version, a typical render/bake is about 3x2 quads across at a time, mostly (not always) in relation to the size and not the density of the mesh subdivisions, due to the optimisations within the subdivision process. So as an example, this lower front torso area would be baked like one of the hands would be baked, being roughly the same size. Again using these 6 quads of the lower front torso as an example, the extra buffer zone of high-detail mesh that is rendered (not low-detail, as the entire low-detail model is always used during baking) would be roughly half one of these quads on any given axis. The end result would ensure a consistent overlapping of at least half a triangle when baking the normalmap onto the low-detail mesh. When talking about end points like the neck and both waists (rendering along from each direction) it's best of course to include a buffer zone that is completely up to the end point. The reason such large buffer areas are used is so blends can be much smoother when compositing different bake outputs into the final normalmap, especially around the neck and waist, and along the UV seams and other trouble areas, the highest displaced definition of the model should be able to translate near perfect to the final composited normalmap."

------------------------

- Technique for other characters:-
"Many character models will be clothed or in special combat armour and will require a different approach to displacement, and often also accompanied by external geometry which will get baked into the normalmap. Unlike the stasis characters whose diffuse textures are created using the multiple displacement maps, most other characters will have displacements that are derived from the original texture work, and rendered out from that. The way we do diffuse textures is by using patch meshes and other formable geometry, so we can render out to any resolution and be able to control displacement maps as a whole well beyond the hand-painted displacements of the head models and stasis characters. These 3D-textures are incredibly easy to tweak in terms of sectioning off detail specifically for what will later be used as height information for displacements, and also being able to instantly render out these sections to be used as an alpha for some post-editing as an image, allowing for perfectly clean detail with precise displacement quality. The most other characters should require is only an "in" and "out" for each level of displacement, because there will be no need to control individual displacements for creating many custom versions, like the head model. The trick is to actually redo entire sections with clean geometry instead of subdividing the original mesh, such as if you have a character with a backpack on, upon creating the high-detail version you would flatten his back again and have the high-detail stuff with an entirely new piece of geometry sharing the original UVs that you can have more control over. This was redundant with the heads and stasis characters because of their organic nature but essential with more precise shapes like technical gear and backpacks. It's a little extra work comparatively, but apart from that, the displacements work much the same and all baked the same way, the baking procedure generally doesn't give a damn how the model is cut up and pasted together with external work, it will bake it all the same if it's prepared and exported properly."

------------------------
============




___

highLevelMaterial "ve99/nahighmaterial1"

...this is the material header of which everything else will reference, the material's name.


{

...open.


template = ShaderBaseMaterial

...class of material, can also be 'vegetation' but usually is just this base type.


reflectionColor = 1 1 1

...can colourise reflections, almost never used via this script, it's always better to adjust the textures below.


reflectionPower = 2

...the power can be overdriven for a more powerful effect, but should always be an integer above 1, else negated.


reflectionSpecificCubemap = "Base\\Types\\Basic\\SkyBox\\env_cubemap1.jpg"

...exact type of reflection, can be soft or sharp, bright or dull, busy or vague, static-baked or real-time.


specularColor = 1 1 1

...can colourise specular, almost never used via this script, it's always better to adjust the textures below.


specularPower = 2

...the power can be overdriven for more powerful effect, but should always be an integer above 1, else negated.


specularShininess = 64

...the tightness of the specularity, from extremely broad (2 or 3) to pinpoints of gloss (1024 or 2048).


displacementTechnique = ParallaxMapping

...method of bumpmapping, usually never changes unless very high settings are used.


heightScale = 0.027

...strength of bumpmapping, may need adjusting depending on the texture used below.


diffuse1Map

...type of unique texture block below - 1 is usually the base diffuse(colour) texture.


{

...open.


texture = "VE\\Textures\\ve99\\nahighmaterial1_clr.dds"

...texture. (this is 99% of the time what you see in Radiant).


}

...close.


diffuse2Map

...type of unique texture block below - 2 is usually the filtered detail-mapping.


{

...open.


texture = "VE\\Textures\\detail\\detaili_99.dds"

...texture.


transform

...transform sub-stage for where scaling, rotation and scrolling can be applied.


{

...open.


scale = 64 64

...amount to scale the detail-mapping.


}

...close.


}

...close.


diffuse6Map

...type of unique texture block below - 6 is usually the (filtered) occlusion-mapping.


{

...open.


texture = "VE\\Textures\\ve99\\nahighmaterial1_occ.dds"

...texture.


}

...close.


reflectionMap

...type of unique texture block below - reflection.


{

...open.


texture = "VE\\Textures\\ve99\\nahighmaterial1_rfl.dds"

...texture.


}

...close.


specularMap

...type of unique texture block below - specular.


{

...open.


texture = "VE\\Textures\\ve99\\nahighmaterial1_spc.dds"

...texture.


}

...close.


normalMap

...type of unique texture block below - normalmap.


{

...open.


texture = "VE\\Textures\\ve99\\nahighmaterial1_nrm.dds"

...texture.


}

...close.


heightMap

...type of unique texture block below - bumpmap.


{

...open.


texture = "VE\\Textures\\ve99\\nahighmaterial1_bmp.png"

...texture.


}

...close.


}

^...close.



___







------------
_bmp (bump map)
_nrm (normal map)
_clr (colour map) (+"_msk" (alpha-channel))
_lmn (luminance map/add)
_hmp (hit-map pixels)
_occ (ambient-occlusion map) \
_rfl (reflection mask map) -(these would be combined into 1 "_sro" file)
_spc (specular map) /
_rfr (refraction map)

------------
blending type
alpha type
alpha falloff strength
specific cubemap used by reflection
specular power
specular colour
specular shininess
reflection power
reflection colour


.
.
.



--------
GL_ONE / GL_ZERO = (Opaque)
GL_SRC_ALPHA / GL_ONE = (AlphaAdd)
GL_ONE / GL_ONE = (AlphaAdd2)
GL_SRC_COLOR / GL_ONE = (AlphaAdd3)
GL_SRC_ALPHA / GL_ONE_MINUS_SRC_ALPHA = (AlphaBlend)
GL_ONE / GL_ONE_MINUS_SRC_ALPHA = (AlphaBlend2)
GL_ZERO / GL_SRC_COLOR = (AlphaSubtract)
GL_DST_COLOR / GL_ZERO = (AlphaSubtract2)
GL_DST_COLOR / GL_SRC_COLOR = (AlphaSubtract3)
GL_ONE_MINUS_DST_COLOR / GL_ONE_MINUS_SRC_COLOR = (AlphaInverted)
GL_DST_COLOR / GL_ONE_MINUS_DST_COLOR = (AlphaNegative)
GL_ONE_MINUS_DST_COLOR / GL_ZERO = (AlphaNegative2)
GL_ONE / GL_ONE_MINUS_SRC_COLOR = (AlphaPositive)
GL_SRC_COLOR / GL_ONE_MINUS_SRC_COLOR = (AlphaPositive2)
GL_SRC_COLOR / GL_ONE = (AlphaFade)
GL_ONE / GL_SRC_COLOR = (AlphaFade2)
GL_ONE_MINUS_SRC_COLOR / GL_ZERO = (AlphaFade3)
GL_SRC_COLOR / GL_ZERO = (SourceColor_Zero)
GL_DST_COLOR / GL_ZERO = (DestColor_Zero)
GL_ZERO / GL_ONE_MINUS_DST_COLOR = (Zero_DestColor)
GL_ZERO / GL_ONE_MINUS_SRC_COLOR = (Zero_SourceColor)
...
--------
Opaque
AlphaAdd = (full bright)
AlphaAdd2 = (full bright)
AlphaAdd3 = (half bright)
AlphaBlend
AlphaBlend2
AlphaSubtract = (whte.trns/blck.opqe)
AlphaSubtract2 = (whte.trns/blck.opqe)
AlphaSubtract3
AlphaInverted = (blck.trns/whte.invt)
AlphaNegative
AlphaNegative2
AlphaPositive
AlphaPositive2
AlphaFade
AlphaFade2
AlphaFade3
SourceColor_Zero
DestColor_Zero
Zero_DestColor
Zero_SourceColor
...



(maps):-

- colour/diffuse/albedo +alpha (24/32bit)
(only colour values, no shadows or highlights)
"you will need to give this much less contrast but much brighter/colourful,
because PBR will never allow other values to oversaturated/flood this pass."

- normal/local (24bit)
- bump/height/displacement (8bit)
"didn't really change, straight-forward, except IOR/refraction is calculated
using a different pass, depending on the material configuration."

- ambient-occlusion/cavity/shadow/modulate (8bit)
(shadows (cavities) isolated from diffuse)
"basically taking whatever shadows/low-light information was in the diffuse
and isolating (perhaps assentuating/spreading-out) into its own pass."

- specular/spec (24bit)
(basic specularity)
"this is only used to simplify a material, otherwise (in combination with all
other maps, including normals and diffuse) is split up into the 2 following):-

(or):-

- metallic/metalness/reflection/ref (8bit) (maybe 1-4bit?)
(what is reflective (conductive) and what is not (insulator))
"basically the 'ref' pass we're already using, sometimes put in the
alpha of the diffuse map for old 'environment-mapping'."

- roughness/glossness/gloss/micronoise (8bit)
(defines the sharpness/clarity (or lack thereof) of color reflections)
"basically the 'sharpness' (in combination with the previous mention) of
both specular and reflections, calculated per-texel instead of material."

- refraction/IOR (8bit)
(how to bend light through alpha'd (semitransparent) materials)

- emission/add/additive (24bit)
(colour values that ignore lighting)



(other (very optional) maps):-
- translucency (maybe called 'fresnel map').
- tint (used to add colour to semi-transparent surfaces (stained-glass)).
- hitmap (what particle to emit per-texel, conceptual surface type).
- alpha (if the alpha channel is isolated to allow for unqiue scaling).


(parameters):-
- shading type (fresnel/blinn/phong/etc.)
- fresnel bias (grazing(/edge) reflection).
- cubemap interactions (resolution/updates/specify?).

.
.
.



specular
- normal -gamma (dif) invnormal -gamma
- orgspec (isolate with dilated new spec)
(whiteness limited by orgspec)

reflection
- normal -split (darkest) red and green (+inv)
- invorgspec (isolate with dilated new rfl)
(whiteness limited by orgspec)

occlusion
- normal -split blue (sub) diffuse (sub) new rfl

bump
- normal2bump...
(mix with new rfl?)

...
whiteness-limit:-
- print histogram verbose from orgspec
- bulb whiteness value
- use bulb as luminence to limit new outputs

.
.
.