mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-26 02:15:08 +02:00
Added opacity mask to shadow casters
This commit is contained in:
parent
5d7b149a9e
commit
3fc711dba2
9 changed files with 108 additions and 2 deletions
|
@ -149,6 +149,12 @@ float fetchScatteringMap(vec2 uv) {
|
||||||
|
|
||||||
<@endfunc@>
|
<@endfunc@>
|
||||||
|
|
||||||
|
<@func fetchMaterialAlbedoTextureCoord0(matKey, texcoord0, albedo)@>
|
||||||
|
if (getTexMapArray()._materialParams.y != 1.0 && clamp(<$texcoord0$>, vec2(0.0), vec2(1.0)) != <$texcoord0$>) {
|
||||||
|
discard;
|
||||||
|
}
|
||||||
|
vec4 <$albedo$> = fetchAlbedoMap(<$texcoord0$>);
|
||||||
|
<@endfunc@>
|
||||||
|
|
||||||
<@func fetchMaterialTexturesCoord0(matKey, texcoord0, albedo, roughness, normal, metallic, emissive, scattering)@>
|
<@func fetchMaterialTexturesCoord0(matKey, texcoord0, albedo, roughness, normal, metallic, emissive, scattering)@>
|
||||||
if (getTexMapArray()._materialParams.y != 1.0 && clamp(<$texcoord0$>, vec2(0.0), vec2(1.0)) != <$texcoord0$>) {
|
if (getTexMapArray()._materialParams.y != 1.0 && clamp(<$texcoord0$>, vec2(0.0), vec2(1.0)) != <$texcoord0$>) {
|
||||||
|
|
|
@ -437,6 +437,11 @@ void ModelMeshPartPayload::render(RenderArgs* args) {
|
||||||
if (args->_renderMode != render::Args::RenderMode::SHADOW_RENDER_MODE) {
|
if (args->_renderMode != render::Args::RenderMode::SHADOW_RENDER_MODE) {
|
||||||
RenderPipelines::bindMaterials(_drawMaterials, batch, args->_enableTexturing);
|
RenderPipelines::bindMaterials(_drawMaterials, batch, args->_enableTexturing);
|
||||||
args->_details._materialSwitches++;
|
args->_details._materialSwitches++;
|
||||||
|
} else {
|
||||||
|
// We might have an opacity mask so we need to bind the albedo texture and material which might hold
|
||||||
|
// the alpha mask channel
|
||||||
|
RenderPipelines::bindMaterialsOpacityMask(_drawMaterials, batch, args->_enableTexturing);
|
||||||
|
args->_details._materialSwitches++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Draw!
|
// Draw!
|
||||||
|
|
|
@ -730,6 +730,8 @@ void RenderPipelines::updateMultiMaterial(graphics::MultiMaterial& multiMaterial
|
||||||
multiMaterial.setInitialized();
|
multiMaterial.setInitialized();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gpu::TextureTablePointer defaultMaterialTextures = std::make_shared<gpu::TextureTable>();
|
||||||
|
|
||||||
void RenderPipelines::bindMaterials(graphics::MultiMaterial& multiMaterial, gpu::Batch& batch, bool enableTextures) {
|
void RenderPipelines::bindMaterials(graphics::MultiMaterial& multiMaterial, gpu::Batch& batch, bool enableTextures) {
|
||||||
if (multiMaterial.shouldUpdate()) {
|
if (multiMaterial.shouldUpdate()) {
|
||||||
updateMultiMaterial(multiMaterial);
|
updateMultiMaterial(multiMaterial);
|
||||||
|
@ -737,7 +739,6 @@ void RenderPipelines::bindMaterials(graphics::MultiMaterial& multiMaterial, gpu:
|
||||||
|
|
||||||
auto textureCache = DependencyManager::get<TextureCache>();
|
auto textureCache = DependencyManager::get<TextureCache>();
|
||||||
|
|
||||||
static gpu::TextureTablePointer defaultMaterialTextures = std::make_shared<gpu::TextureTable>();
|
|
||||||
static std::once_flag once;
|
static std::once_flag once;
|
||||||
std::call_once(once, [textureCache] {
|
std::call_once(once, [textureCache] {
|
||||||
defaultMaterialTextures->setTexture(gr::Texture::MaterialAlbedo, textureCache->getWhiteTexture());
|
defaultMaterialTextures->setTexture(gr::Texture::MaterialAlbedo, textureCache->getWhiteTexture());
|
||||||
|
@ -763,3 +764,35 @@ void RenderPipelines::bindMaterials(graphics::MultiMaterial& multiMaterial, gpu:
|
||||||
batch.setResourceTextureTable(defaultMaterialTextures);
|
batch.setResourceTextureTable(defaultMaterialTextures);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gpu::BufferView defaultMaterialSchema;
|
||||||
|
|
||||||
|
void RenderPipelines::bindMaterialsOpacityMask(graphics::MultiMaterial& multiMaterial, gpu::Batch& batch, bool enableTextures) {
|
||||||
|
if (multiMaterial.shouldUpdate()) {
|
||||||
|
updateMultiMaterial(multiMaterial);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (multiMaterial.getMaterialKey().isOpacityMaskMap()) {
|
||||||
|
auto textureCache = DependencyManager::get<TextureCache>();
|
||||||
|
|
||||||
|
static std::once_flag once;
|
||||||
|
std::call_once(once, [textureCache] {
|
||||||
|
defaultMaterialTextures->setTexture(gr::Texture::MaterialAlbedo, textureCache->getWhiteTexture());
|
||||||
|
});
|
||||||
|
|
||||||
|
auto& schemaBuffer = multiMaterial.getSchemaBuffer();
|
||||||
|
batch.setUniformBuffer(gr::Buffer::Material, schemaBuffer);
|
||||||
|
|
||||||
|
if (enableTextures) {
|
||||||
|
batch.setResourceTextureTable(multiMaterial.getTextureTable());
|
||||||
|
} else {
|
||||||
|
batch.setResourceTextureTable(defaultMaterialTextures);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (defaultMaterialSchema._buffer == nullptr) {
|
||||||
|
graphics::MultiMaterial::Schema schema;
|
||||||
|
defaultMaterialSchema = gpu::BufferView(std::make_shared<gpu::Buffer>(sizeof(schema), (const gpu::Byte*) &schema, sizeof(schema)));
|
||||||
|
}
|
||||||
|
batch.setUniformBuffer(gr::Buffer::Material, defaultMaterialSchema);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ public:
|
||||||
static void bindMaterial(graphics::MaterialPointer& material, gpu::Batch& batch, bool enableTextures);
|
static void bindMaterial(graphics::MaterialPointer& material, gpu::Batch& batch, bool enableTextures);
|
||||||
static void updateMultiMaterial(graphics::MultiMaterial& multiMaterial);
|
static void updateMultiMaterial(graphics::MultiMaterial& multiMaterial);
|
||||||
static void bindMaterials(graphics::MultiMaterial& multiMaterial, gpu::Batch& batch, bool enableTextures);
|
static void bindMaterials(graphics::MultiMaterial& multiMaterial, gpu::Batch& batch, bool enableTextures);
|
||||||
|
static void bindMaterialsOpacityMask(graphics::MultiMaterial& multiMaterial, gpu::Batch& batch, bool enableTextures);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -18,9 +18,15 @@
|
||||||
<$declareMeshDeformer(_SCRIBE_NULL, _SCRIBE_NULL, 1, _SCRIBE_NULL, 1)$>
|
<$declareMeshDeformer(_SCRIBE_NULL, _SCRIBE_NULL, 1, _SCRIBE_NULL, 1)$>
|
||||||
<$declareMeshDeformerActivation(1, 1)$>
|
<$declareMeshDeformerActivation(1, 1)$>
|
||||||
|
|
||||||
|
<@include graphics/Material.slh@>
|
||||||
|
<@include graphics/MaterialTextures.slh@>
|
||||||
|
|
||||||
|
<$declareMaterialTexMapArrayBuffer()$>
|
||||||
|
|
||||||
<@include render-utils/ShaderConstants.h@>
|
<@include render-utils/ShaderConstants.h@>
|
||||||
|
|
||||||
layout(location=RENDER_UTILS_ATTR_POSITION_WS) out vec4 _positionWS;
|
layout(location=RENDER_UTILS_ATTR_POSITION_WS) out vec4 _positionWS;
|
||||||
|
layout(location=RENDER_UTILS_ATTR_TEXCOORD01) out vec4 _texCoord01;
|
||||||
|
|
||||||
void main(void) {
|
void main(void) {
|
||||||
vec4 deformedPosition = vec4(0.0, 0.0, 0.0, 0.0);
|
vec4 deformedPosition = vec4(0.0, 0.0, 0.0, 0.0);
|
||||||
|
@ -33,5 +39,14 @@ void main(void) {
|
||||||
TransformObject obj = getTransformObject();
|
TransformObject obj = getTransformObject();
|
||||||
<$transformModelToClipPos(cam, obj, deformedPosition, gl_Position)$>
|
<$transformModelToClipPos(cam, obj, deformedPosition, gl_Position)$>
|
||||||
<$transformModelToWorldPos(obj, deformedPosition, _positionWS)$>
|
<$transformModelToWorldPos(obj, deformedPosition, _positionWS)$>
|
||||||
|
|
||||||
|
Material mat = getMaterial();
|
||||||
|
BITFIELD matKey = getMaterialKey(mat);
|
||||||
|
_texCoord01 = vec4(0.0, 0.0, 0.0, 0.0);
|
||||||
|
// If we have an opacity mask than we need the first tex coord
|
||||||
|
if ((matKey & OPACITY_MASK_MAP_BIT) != 0) {
|
||||||
|
TexMapArray texMapArray = getTexMapArray();
|
||||||
|
<$evalTexMapArrayTexcoord0(texMapArray, inTexCoord0, _positionWS, _texCoord01.xy)$>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,9 +18,15 @@
|
||||||
<$declareMeshDeformer(_SCRIBE_NULL, _SCRIBE_NULL, 1, 1, 1)$>
|
<$declareMeshDeformer(_SCRIBE_NULL, _SCRIBE_NULL, 1, 1, 1)$>
|
||||||
<$declareMeshDeformerActivation(1, 1)$>
|
<$declareMeshDeformerActivation(1, 1)$>
|
||||||
|
|
||||||
|
<@include graphics/Material.slh@>
|
||||||
|
<@include graphics/MaterialTextures.slh@>
|
||||||
|
|
||||||
|
<$declareMaterialTexMapArrayBuffer()$>
|
||||||
|
|
||||||
<@include render-utils/ShaderConstants.h@>
|
<@include render-utils/ShaderConstants.h@>
|
||||||
|
|
||||||
layout(location=RENDER_UTILS_ATTR_POSITION_WS) out vec4 _positionWS;
|
layout(location=RENDER_UTILS_ATTR_POSITION_WS) out vec4 _positionWS;
|
||||||
|
layout(location=RENDER_UTILS_ATTR_TEXCOORD01) out vec4 _texCoord01;
|
||||||
|
|
||||||
void main(void) {
|
void main(void) {
|
||||||
vec4 deformedPosition = vec4(0.0, 0.0, 0.0, 0.0);
|
vec4 deformedPosition = vec4(0.0, 0.0, 0.0, 0.0);
|
||||||
|
@ -33,4 +39,13 @@ void main(void) {
|
||||||
TransformObject obj = getTransformObject();
|
TransformObject obj = getTransformObject();
|
||||||
<$transformModelToClipPos(cam, obj, deformedPosition, gl_Position)$>
|
<$transformModelToClipPos(cam, obj, deformedPosition, gl_Position)$>
|
||||||
<$transformModelToWorldPos(obj, deformedPosition, _positionWS)$>
|
<$transformModelToWorldPos(obj, deformedPosition, _positionWS)$>
|
||||||
|
|
||||||
|
Material mat = getMaterial();
|
||||||
|
BITFIELD matKey = getMaterialKey(mat);
|
||||||
|
_texCoord01 = vec4(0.0, 0.0, 0.0, 0.0);
|
||||||
|
// If we have an opacity mask than we need the first tex coord
|
||||||
|
if ((matKey & OPACITY_MASK_MAP_BIT) != 0) {
|
||||||
|
TexMapArray texMapArray = getTexMapArray();
|
||||||
|
<$evalTexMapArrayTexcoord0(texMapArray, inTexCoord0, _positionWS, _texCoord01.xy)$>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ void main(void) {
|
||||||
<$fetchMaterialTexturesCoord1(matKey, _texCoord1, occlusionTex)$>
|
<$fetchMaterialTexturesCoord1(matKey, _texCoord1, occlusionTex)$>
|
||||||
|
|
||||||
float opacity = 1.0;
|
float opacity = 1.0;
|
||||||
<$evalMaterialOpacity(albedoTex.a, opacity, matKey, opacity)&>;
|
<$evalMaterialOpacity(albedoTex.a, opacity, matKey, opacity)$>;
|
||||||
<$discardTransparent(opacity)$>;
|
<$discardTransparent(opacity)$>;
|
||||||
|
|
||||||
vec3 albedo = getMaterialAlbedo(mat);
|
vec3 albedo = getMaterialAlbedo(mat);
|
||||||
|
|
|
@ -9,10 +9,28 @@
|
||||||
// Distributed under the Apache License, Version 2.0.
|
// Distributed under the Apache License, Version 2.0.
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
//
|
//
|
||||||
|
<@include graphics/Material.slh@>
|
||||||
|
<@include graphics/MaterialTextures.slh@>
|
||||||
|
<@include render-utils/ShaderConstants.h@>
|
||||||
|
|
||||||
|
<$declareMaterialTextures(ALBEDO, _SCRIBE_NULL, _SCRIBE_NULL, _SCRIBE_NULL, _SCRIBE_NULL, _SCRIBE_NULL, _SCRIBE_NULL)$>
|
||||||
|
|
||||||
|
layout(location=RENDER_UTILS_ATTR_TEXCOORD01) in vec4 _texCoord01;
|
||||||
|
#define _texCoord0 _texCoord01.xy
|
||||||
|
|
||||||
layout(location=0) out vec4 _fragColor;
|
layout(location=0) out vec4 _fragColor;
|
||||||
|
|
||||||
void main(void) {
|
void main(void) {
|
||||||
|
Material mat = getMaterial();
|
||||||
|
BITFIELD matKey = getMaterialKey(mat);
|
||||||
|
|
||||||
|
if ((matKey & OPACITY_MASK_MAP_BIT) != 0) {
|
||||||
|
float opacity = 1.0;
|
||||||
|
<$fetchMaterialAlbedoTextureCoord0(matKey, _texCoord0, albedoTex)$>
|
||||||
|
<$evalMaterialOpacity(albedoTex.a, opacity, matKey, opacity)$>;
|
||||||
|
<$discardTransparent(opacity)$>;
|
||||||
|
}
|
||||||
|
|
||||||
// pass-through to set z-buffer
|
// pass-through to set z-buffer
|
||||||
_fragColor = vec4(1.0, 1.0, 1.0, 0.0);
|
_fragColor = vec4(1.0, 1.0, 1.0, 0.0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,12 +13,16 @@
|
||||||
<@include gpu/Inputs.slh@>
|
<@include gpu/Inputs.slh@>
|
||||||
|
|
||||||
<@include gpu/Transform.slh@>
|
<@include gpu/Transform.slh@>
|
||||||
|
<@include graphics/Material.slh@>
|
||||||
|
<@include graphics/MaterialTextures.slh@>
|
||||||
|
|
||||||
<$declareStandardTransform()$>
|
<$declareStandardTransform()$>
|
||||||
|
<$declareMaterialTexMapArrayBuffer()$>
|
||||||
|
|
||||||
<@include render-utils/ShaderConstants.h@>
|
<@include render-utils/ShaderConstants.h@>
|
||||||
|
|
||||||
layout(location=RENDER_UTILS_ATTR_POSITION_WS) out vec4 _positionWS;
|
layout(location=RENDER_UTILS_ATTR_POSITION_WS) out vec4 _positionWS;
|
||||||
|
layout(location=RENDER_UTILS_ATTR_TEXCOORD01) out vec4 _texCoord01;
|
||||||
|
|
||||||
void main(void) {
|
void main(void) {
|
||||||
// standard transform
|
// standard transform
|
||||||
|
@ -26,4 +30,13 @@ void main(void) {
|
||||||
TransformObject obj = getTransformObject();
|
TransformObject obj = getTransformObject();
|
||||||
<$transformModelToClipPos(cam, obj, inPosition, gl_Position)$>
|
<$transformModelToClipPos(cam, obj, inPosition, gl_Position)$>
|
||||||
<$transformModelToWorldPos(obj, inPosition, _positionWS)$>
|
<$transformModelToWorldPos(obj, inPosition, _positionWS)$>
|
||||||
|
|
||||||
|
Material mat = getMaterial();
|
||||||
|
BITFIELD matKey = getMaterialKey(mat);
|
||||||
|
_texCoord01 = vec4(0.0, 0.0, 0.0, 0.0);
|
||||||
|
// If we have an opacity mask than we need the first tex coord
|
||||||
|
if ((matKey & OPACITY_MASK_MAP_BIT) != 0) {
|
||||||
|
TexMapArray texMapArray = getTexMapArray();
|
||||||
|
<$evalTexMapArrayTexcoord0(texMapArray, inTexCoord0, _positionWS, _texCoord01.xy)$>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue