OGRE 2.1
Object-Oriented Graphics Rendering Engine
|
Contains information needed by PBS (Physically Based Shading) for OpenGL 3+ & D3D11+. More...
#include <OgreHlmsPbsDatablock.h>
Public Types | |
enum | TransparencyModes { None , Transparent , Fade } |
enum | Workflows { SpecularWorkflow , SpecularAsFresnelWorkflow , MetallicWorkflow } |
Static Public Member Functions | |
static const char * | getCmpString (CompareFunction compareFunction) |
Public Attributes | |
uint16 | mMacroblockHash [2] |
float | mShadowConstantBias |
uint32 | mTextureHash |
uint8 | mType |
Static Public Attributes | |
static const size_t | MaterialSizeInGpu |
static const size_t | MaterialSizeInGpuAligned |
Friends | |
class | HlmsPbs |
Contains information needed by PBS (Physically Based Shading) for OpenGL 3+ & D3D11+.
Enumerator | |
---|---|
SpecularWorkflow | Specular workflow. Many popular PBRs use SpecularAsFresnelWorkflow though.
|
SpecularAsFresnelWorkflow | Specular workflow where the specular texture is addressed to the fresnel instead of kS. This is normally referred as simply Specular workflow in many other PBRs.
|
MetallicWorkflow |
Ogre::HlmsPbsDatablock::HlmsPbsDatablock | ( | IdString | name, |
HlmsPbs * | creator, | ||
const HlmsMacroblock * | macroblock, | ||
const HlmsBlendblock * | blendblock, | ||
const HlmsParamVec & | params | ||
) |
Valid parameters in params:
params | fresnel <value [g, b]> The IOR. @See setIndexOfRefraction When specifying three values, the fresnel is separate for each colour component |
fresnel_coeff <value [g, b]> Directly sets the fresnel values, instead of using IORs "F0" in most books about PBS
roughness
Specifies the roughness value. Should be in range (0; inf) Note: Values extremely close to zero could cause NaNs and INFs in the pixel shader, also depends on the GPU's precision.
background_diffuse <r g b a> Specifies diffuse colour to use as a background when diffuse texture are not present. Does not replace 'diffuse <r g b>' Default: background_diffuse 1 1 1 1
diffuse <r g b> Specifies the RGB diffuse colour. "kD" in most books about PBS Default: diffuse 1 1 1 1 Note: Internally the diffuse colour is divided by PI.
diffuse_map <texture name> Name of the diffuse texture for the base image (optional)
specular <r g b> Specifies the RGB specular colour. "kS" in most books about PBS Default: specular 1 1 1 1
specular_map <texture name> Name of the specular texture for the base image (optional).
roughness_map <texture name> Name of the roughness texture for the base image (optional) Note: Only the Red channel will be used, and the texture will be converted to an efficient monochrome representation.
normal_map <texture name> Name of the normal texture for the base image (optional) for normal mapping
detail_weight_map <texture name> Texture that when present, will be used as mask/weight for the 4 detail maps. The R channel is used for detail map #0; the G for detail map #1, B for #2, and Alpha for #3. This affects both the diffuse and normal-mapped detail maps.
detail_map0 <texture name> Similar: detail_map1, detail_map2, detail_map3 Name of the detail map to be used on top of the diffuse colour. There can be gaps (i.e. set detail maps 0 and 2 but not 1)
detail_blend_mode0 <blend_mode> Similar: detail_blend_mode1, detail_blend_mode2, detail_blend_mode3 Blend mode to use for each detail map. Valid values are: "NormalNonPremul", "NormalPremul", "Add", "Subtract", "Multiply", "Multiply2x", "Screen", "Overlay", "Lighten", "Darken", "GrainExtract", "GrainMerge", "Difference"
detail_offset_scale0 <offset_u> <offset_v> <scale_u> <scale_v> Similar: detail_offset_scale1, detail_offset_scale2, detail_offset_scale3 Sets the UV offset and scale of the detail maps.
detail_normal_map0 <texture name> Similar: detail_normal_map1, detail_normal_map2, detail_normal_map3 Name of the detail map's normal map to be used. It's not affected by blend mode. May be used even if there is no detail_map
detail_normal_offset_scale0 <offset_u> <offset_v> <scale_u> <scale_v> Similar: detail_normal_offset_scale1, detail_normal_offset_scale2, detail_normal_offset_scale3 Sets the UV offset and scale of the detail normal maps.
reflection_map <texture name> Name of the reflection map. Must be a cubemap. Doesn't use an UV set because the tex. coords are automatically calculated.
uv_diffuse_map <uv> Similar: uv_specular_map, uv_normal_map, uv_detail_mapN, uv_detail_normal_mapN, uv_detail_weight_map where N is a number between 0 and 3. UV set to use for the particular texture map. The UV value must be in range [0; 8)
transparency
Specifies the transparency amount. Value in range [0; 1] where 0 = full transparency and 1 = fully opaque.
transparency_mode <transparent, none, fade> Specifies the transparency mode.
alpha_from_textures <true, false> When set to false transparency calculations ignore the alpha channel in the textures
|
virtual |
|
inline |
Returns the internal index to the array in a texture array.
Note: If there is no texture assigned to the given texType, returned value is undefined
Returns true if getEmissive is non-zero or if there is an emissive texture set.
|
inherited |
void Ogre::HlmsPbsDatablock::_setTextures | ( | const PackedTexture | packedTextures[] | ) |
Advanced function for setting all textures at once, instead of one by one, for performance reasons.
packedTextures | The reference count in packedTextures[i].samplerblock is assumed to have already been increased prior to calling this function. We will not increase. If null, a default samplerblock will be assigned |
|
inherited |
Calculates the hashes needed for sorting by the RenderQueue (i.e. mTextureHash)
Reimplemented from Ogre::HlmsDatablock.
|
inherited |
Creates a copy of this datablock with the same settings, but a different name.
name | Name of the cloned datablock. |
|
inherited |
|
inlineinherited |
ColourValue Ogre::HlmsPbsDatablock::getBackgroundDiffuse | ( | void | ) | const |
uint8 Ogre::HlmsPbsDatablock::getBakedTextureIdx | ( | PbsTextureTypes | texType | ) | const |
Returns the index to mBakedTextures.
Returns NUM_PBSM_TEXTURE_TYPES if there is no texture assigned to texType
|
inlineinherited |
|
staticinherited |
CubemapProbe * Ogre::HlmsPbsDatablock::getCubemapProbe | ( | void | ) | const |
PbsBlendModes Ogre::HlmsPbsDatablock::getDetailMapBlendMode | ( | uint8 | detailMapIdx | ) | const |
Returns the detail normal maps' weight.
|
inherited |
Returns the current fresnel.
Note: when hasSeparateFresnel returns false, the Y and Z components still correspond to mFresnelG & mFresnelB just in case you want to preserve this data (i.e. toggling separate fresnel often (which is not a good idea though, in terms of performance)
|
inlineinherited |
|
inlineinherited |
Returns the detail normal maps' weight.
const HlmsSamplerblock * Ogre::HlmsPbsDatablock::getSamplerblock | ( | PbsTextureTypes | texType | ) | const |
TexturePtr Ogre::HlmsPbsDatablock::getTexture | ( | PbsTextureTypes | texType | ) | const |
TexturePtr Ogre::HlmsPbsDatablock::getTexture | ( | size_t | texType | ) | const |
uint8 Ogre::HlmsPbsDatablock::getTextureUvSource | ( | PbsTextureTypes | sourceType | ) | const |
|
inline |
Reimplemented from Ogre::HlmsDatablock.
Returns true iif getEmissive is non-zero.
Whether the same fresnel term is used for RGB, or individual ones for each channel.
void Ogre::HlmsPbsDatablock::importUnity | ( | const Vector3 & | colour, |
Real | metallic, | ||
Real | roughness, | ||
bool | changeBrdf | ||
) |
Helper function to import values from Unity (metallic workflow).
void Ogre::HlmsPbsDatablock::importUnity | ( | const Vector3 & | diffuse, |
const Vector3 & | specular, | ||
Real | roughness, | ||
bool | changeBrdf | ||
) |
Helper function to import & convert values from Unity (specular workflow).
changeBrdf | True if you want us to select a BRDF that closely matches that of Unity. It will change the BRDF to PbsBrdf::DefaultUncorrelated. For best realism though, it is advised that you use that you actually use PbsBrdf::Default. |
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
|
inlineinherited |
operator new, with debug line info
placement operator new
|
inlineinherited |
|
inlineinherited |
array operator new, with debug line info
|
virtual |
folderPath | Folder where to dump the textures. |
savedTextures | [in/out] Set of texture names. Textures whose name is already in the set won't be saved again. Textures that were saved will be inserted into the set. |
saveOitd | When true, we will download the texture from GPU and save it in OITD format. OITD is faster to load as it's stored in Ogre's native format it understands, but it cannot be opened by traditional image editors; also OITD is not backwards compatible with older versions of Ogre. |
saveOriginal | When true, we will attempt to read the raw filestream of the original texture and save it (i.e. copy the original png/dds/etc file). |
Reimplemented from Ogre::HlmsDatablock.
|
virtualinherited |
Sets the alpha test to the given compare function.
CMPF_ALWAYS_PASS means disabled.
compareFunction | Compare function to use. Default is CMPF_ALWAYS_PASS, which means disabled. Note: CMPF_ALWAYS_FAIL is not supported. Set a negative threshold to workaround this issue. |
Reimplemented from Ogre::HlmsDatablock.
void Ogre::HlmsPbsDatablock::setBackgroundDiffuse | ( | const ColourValue & | bgDiffuse | ) |
Sets the diffuse background colour.
When no diffuse texture is present, this solid colour replaces it, and can act as a background for the detail maps.
|
inherited |
Sets a new blendblock that matches the same parameter as the input.
Decreases the reference count of the previous mBlendblock. Runs an O(N) search to get the right block. Calling this function triggers a HlmsDatablock::flushRenderables
blendblock | @See HlmsManager::getBlendblock |
casterBlock | True to directly set the blendblock to be used during the shadow mapping's caster pass. Note that when false, it will reset the caster block to the same as the regular one. |
|
inherited |
Sets the blendblock from the given pointer that was already retrieved from the HlmsManager.
Unlike the other overload, this operation is O(1). Calling this function triggers a HlmsDatablock::flushRenderables
blendblock | A valid block. The reference count is increased inside this function. |
casterBlock | True to directly set the blendblock to be used during the shadow mapping's caster pass. Note that when false, it will reset the caster block to the same as the regular one. |
void Ogre::HlmsPbsDatablock::setBrdf | ( | PbsBrdf::PbsBrdf | brdf | ) |
Changes the BRDF in use.
Calling this function may trigger an HlmsDatablock::flushRenderables
void Ogre::HlmsPbsDatablock::setCubemapProbe | ( | CubemapProbe * | probe | ) |
Manually set a probe to affect this particular material.
To use manual probes just call: datablock->setCubemapProbe( probe );
To use Auto you don't need to do anything. Just enable PCC: hlmsPbs->setParallaxCorrectedCubemap( mParallaxCorrectedCubemap ); and leave PBSM_REFLECTION empty and don't enable manual mode.
probe | The probe that should affect this material to enable manual mode. Null pointer to disable manual mode and switch to auto. |
void Ogre::HlmsPbsDatablock::setDetailMapBlendMode | ( | uint8 | detailMapIdx, |
PbsBlendModes | blendMode | ||
) |
Changes the blend mode of the detail map.
Calling this function triggers a HlmsDatablock::flushRenderables even if you never use detail maps (they affect the cache's hash)
detailMapIdx | Value in the range [0; 4) |
blendMode | Blend mode |
void Ogre::HlmsPbsDatablock::setDetailMapOffsetScale | ( | uint8 | detailMap, |
const Vector4 & | offsetScale | ||
) |
Sets the scale and offset of the detail map.
detailMap | Value in the range [0; 4) |
offsetScale | XY = Contains the UV offset. ZW = Constains the UV scale. Default value is Vector4( 0, 0, 1, 1 ) |
Sets the weight of detail map.
Affects both diffuse and normal at the same time.
detailMap | Value in the range [0; 4) |
weight | The weight for the detail map. Usual values are in range [0; 1] but any value is accepted and valid. Default value is 1 |
Sets the normal mapping weight.
The range doesn't necessarily have to be in [0; 1]
detailNormalMapIdx | Value in the range [0; 4) |
weight | The weight for the normal map. A value of 0 means no effect (tangent space normal is 0, 0, 1); and would be the same as disabling the normal map texture. A value of 1 means full normal map effect. A value outside the [0; 1] range extrapolates. Default value is 1. |
Sets the diffuse colour (final multiplier). The colour will be divided by PI for energy conservation.
Sets emissive colour (e.g.
a firefly). Emissive colour has no physical basis. Though in HDR, if you're working in lumens, this value should probably be in lumens too. To disable emissive, setEmissive( Vector3::ZERO ) and unset any texture in PBSM_EMISSIVE slot.
Sets the fresnel (F0) directly, instead of using the IOR.
@See setIndexOfRefraction
refractionIdx | The fresnel of the material for each colour component. When separateFresnel = false, the Y and Z components are ignored. |
separateFresnel | Whether to use the same fresnel term for RGB channel, or individual ones. |
void Ogre::HlmsPbsDatablock::setIndexOfRefraction | ( | const Vector3 & | refractionIdx, |
bool | separateFresnel | ||
) |
Calculates fresnel (F0 in most books) based on the IOR.
The formula used is ( (1 - idx) / (1 + idx) )²
refractionIdx | The index of refraction of the material for each colour component. When separateFresnel = false, the Y and Z components are ignored. |
separateFresnel | Whether to use the same fresnel term for RGB channel, or individual ones. |
|
inherited |
Sets a new macroblock that matches the same parameter as the input.
Decreases the reference count of the previously set one. Runs an O(N) search to get the right block. Calling this function triggers a HlmsDatablock::flushRenderables
macroblock | @See HlmsManager::getMacroblock |
casterBlock | True to directly set the macroblock to be used during the shadow mapping's caster pass. Note that when false, it will automatically reset the caster's block according to HlmsManager::setShadowMappingUseBackFaces setting. |
|
inherited |
Sets the macroblock from the given pointer that was already retrieved from the HlmsManager.
Unlike the other overload, this operation is O(1). Calling this function triggers a HlmsDatablock::flushRenderables
macroblock | A valid block. The reference count is increased inside this function. |
casterBlock | True to directly set the macroblock to be used during the shadow mapping's caster pass. Note that when false, it will automatically reset the caster's block according to HlmsManager::setShadowMappingUseBackFaces setting. |
Sets the metalness in a metallic workflow.
metalness | Value in range [0; 1] |
@See setDetailNormalWeight. This is the same, but for the main normal map.
When false, objects with this material will not receive shadows (independent of whether they case shadows or not)
receiveShadows | Whether to enable or disable receiving shadows. |
void Ogre::HlmsPbsDatablock::setSamplerblock | ( | PbsTextureTypes | texType, |
const HlmsSamplerblock & | params | ||
) |
Sets a new sampler block to be associated with the texture (i.e.
filtering mode, addressing modes, etc). If the samplerblock changes, this function will always trigger a HlmsDatablock::flushRenderables
texType | Type of texture. |
params | The sampler block to use as reference. |
Sets the specular colour.
void Ogre::HlmsPbsDatablock::setTexture | ( | PbsTextureTypes | texType, |
uint16 | arrayIndex, | ||
const TexturePtr & | newTexture, | ||
const HlmsSamplerblock * | refParams = 0 |
||
) |
Sets a new texture for rendering.
Calling this function may trigger an HlmsDatablock::flushRenderables if the texture or the samplerblock changes. Won't be called if only the arrayIndex changes
texType | Type of the texture. |
arrayIndex | The index in the array texture. |
newTexture | Texture to change to. If it is null and previously wasn't (or viceversa), will trigger HlmsDatablock::flushRenderables. |
params | Optional. We'll create (or retrieve an existing) samplerblock based on the input parameters. When null, we leave the previously set samplerblock (if a texture is being set, and if no samplerblock was set, we'll create a default one) |
void Ogre::HlmsPbsDatablock::setTextureUvSource | ( | PbsTextureTypes | sourceType, |
uint8 | uvSet | ||
) |
Sets which UV set to use for the given texture.
Calling this function triggers a HlmsDatablock::flushRenderables.
sourceType | Source texture to modify. Note that we don't enforce PBSM_SOURCE_DETAIL0 = PBSM_SOURCE_DETAIL_NM0, but you probably want to have both textures using the same UV source. Must be lower than NUM_PBSM_SOURCES. |
uvSet | UV coordinate set. Value must be between in range [0; 8) |
void Ogre::HlmsPbsDatablock::setTransparency | ( | float | transparency, |
TransparencyModes | mode = Transparent , |
||
bool | useAlphaFromTextures = true , |
||
bool | changeBlendblock = true |
||
) |
Makes the material transparent, and sets the amount of transparency.
transparency | Value in range [0; 1] where 0 = full transparency and 1 = fully opaque. |
mode |
useAlphaFromTextures | When false, the alpha channel of the diffuse maps and detail maps will be ignored. It's a GPU performance optimization. |
changeBlendblock | When true, the routine prepares the ideal blendblock to use according to the selected mode. When false, the user is expected to change the blendblock manually before calling this function to prevent false warnings. Useful for advanced experiments or artistic license. |
void Ogre::HlmsPbsDatablock::setTwoSidedLighting | ( | bool | twoSided, |
bool | changeMacroblock = true , |
||
CullingMode | oneSidedShadowCast = CULL_ANTICLOCKWISE |
||
) |
Allows support for two sided lighting.
Disabled by default (faster)
twoSided | Whether to enable or disable. |
changeMacroblock | Whether to change the current macroblock for one that has cullingMode = CULL_NONE or set it to false to leave the current macroblock as is. |
oneSidedShadowCast | If changeMacroblock == true; this parameter controls the culling mode of the shadow caster (the setting of HlmsManager::setShadowMappingUseBackFaces is ignored!). While oneSidedShadowCast == CULL_NONE is usually the "correct" option, setting oneSidedShadowCast=CULL_ANTICLOCKWISE can prevent ugly self-shadowing on interiors. |
Sets the value of the userValue, this can be used in a custom piece.
userValueIdx | Which userValue to modify, in the range [0; 3) |
Sets whether to use a specular workflow, or a metallic workflow.
bEnableMetallic |
HlmsTextureManager::TextureMapType Ogre::HlmsPbsDatablock::suggestMapTypeBasedOnTextureType | ( | PbsTextureTypes | type | ) |
Suggests the TextureMapType (aka texture category) for each type of texture (i.e.
normals should load from TEXTURE_TYPE_NORMALS).
|
inherited |
|
inherited |
|
inherited |
|
inherited |