summaryrefslogtreecommitdiffstats
path: root/src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.cpp')
-rw-r--r--src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.cpp426
1 files changed, 390 insertions, 36 deletions
diff --git a/src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.cpp b/src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.cpp
index cf276e7..4a1f6e3 100644
--- a/src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.cpp
+++ b/src/runtimerender/Qt3DSRenderDefaultMaterialShaderGenerator.cpp
@@ -170,6 +170,7 @@ struct SShaderGeneratorGeneratedShader
NVRenderCachedShaderProperty<NVRenderTexture2D *> m_LightProbe2;
NVRenderCachedShaderProperty<QT3DSVec4> m_LightProbe2Props;
NVRenderCachedShaderProperty<QT3DSVec2> m_LightProbe2Size;
+ NVRenderCachedShaderProperty<QT3DSVec2> m_alphaTestOp;
NVRenderCachedShaderBuffer<qt3ds::render::NVRenderShaderConstantBuffer *> m_AoShadowParams;
NVRenderCachedShaderBuffer<qt3ds::render::NVRenderShaderConstantBuffer *> m_LightsBuffer;
@@ -216,9 +217,10 @@ struct SShaderGeneratorGeneratedShader
, m_LightProbe2("light_probe2", inShader)
, m_LightProbe2Props("light_probe2_props", inShader)
, m_LightProbe2Size("light_probe2_size", inShader)
+ , m_alphaTestOp("alphaOpRef", inShader)
, m_AoShadowParams("cbAoShadow", inShader)
, m_LightsBuffer("cbBufferLights", inShader)
- , m_lightConstantProperties(NULL)
+ , m_lightConstantProperties(nullptr)
, m_Images(inContext.GetAllocator(), "SShaderGeneratorGeneratedShader::m_Images")
, m_Lights(inContext.GetAllocator(), "SShaderGeneratorGeneratedShader::m_Lights")
, m_ShadowMaps(inContext.GetAllocator(), "SShaderGeneratorGeneratedShader::m_ShadowMaps")
@@ -316,11 +318,11 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
SShaderGenerator(IQt3DSRenderContext &inRc)
: m_RenderContext(inRc)
, m_ProgramGenerator(m_RenderContext.GetShaderProgramGenerator())
- , m_CurrentMaterial(NULL)
- , m_CurrentKey(NULL)
- , m_ShadowMapManager(NULL)
- , m_CurrentPipeline(NULL)
- , m_FirstImage(NULL)
+ , m_CurrentMaterial(nullptr)
+ , m_CurrentKey(nullptr)
+ , m_ShadowMapManager(nullptr)
+ , m_CurrentPipeline(nullptr)
+ , m_FirstImage(nullptr)
, m_LightsAsSeparateUniforms(false)
, m_ProgramToShaderMap(inRc.GetAllocator(), "m_ProgramToShaderMap")
, m_ConstantBuffers(inRc.GetAllocator(), "m_ConstantBuffers")
@@ -546,7 +548,7 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
void AddTranslucencyIrradiance(IShaderStageGenerator &infragmentShader, SRenderableImage *image,
TStrType inLightPrefix, bool areaLight)
{
- if (image == NULL)
+ if (image == nullptr)
return;
addFunction(infragmentShader, "diffuseReflectionWrapBSDF");
@@ -792,7 +794,7 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
// we only create if if we have lights
if (!inLightCount || !theContext.GetConstantBufferSupport())
- return NULL;
+ return nullptr;
CRegisteredString theName = theContext.GetStringTable().RegisterStr("cbBufferLights");
NVRenderConstantBuffer *pCB = theContext.GetConstantBuffer(theName);
@@ -807,7 +809,7 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
(sizeof(SLightSourceShader) * QT3DS_MAX_NUM_LIGHTS) + (4 * sizeof(QT3DSI32)), cBuffer);
if (!pCB) {
QT3DS_ASSERT(false);
- return NULL;
+ return nullptr;
}
// init first set
memset(&s[0], 0x0, sizeof(SLightSourceShader));
@@ -888,10 +890,10 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
{
// vertex displacement
QT3DSU32 imageIdx = 0;
- SRenderableImage *displacementImage = NULL;
+ SRenderableImage *displacementImage = nullptr;
QT3DSU32 displacementImageIdx = 0;
- for (SRenderableImage *img = m_FirstImage; img != NULL;
+ for (SRenderableImage *img = m_FirstImage; img != nullptr;
img = img->m_NextImage, ++imageIdx) {
if (img->m_MapType == ImageMapTypes::Displacement) {
displacementImage = img;
@@ -910,7 +912,7 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
bool vertexColorsEnabled = Material().IsVertexColorsEnabled();
bool hasLighting = Material().HasLighting();
- bool hasImage = m_FirstImage != NULL;
+ bool hasImage = m_FirstImage != nullptr;
bool hasIblProbe = m_DefaultMaterialShaderKeyProperties.m_HasIbl.GetValue(inKey);
bool hasSpecMap = false;
@@ -918,30 +920,30 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
bool hasEmissiveMap = false;
bool hasLightmaps = false;
// Pull the bump out as
- SRenderableImage *bumpImage = NULL;
+ SRenderableImage *bumpImage = nullptr;
QT3DSU32 imageIdx = 0;
QT3DSU32 bumpImageIdx = 0;
- SRenderableImage *specularAmountImage = NULL;
+ SRenderableImage *specularAmountImage = nullptr;
QT3DSU32 specularAmountImageIdx = 0;
- SRenderableImage *roughnessImage = NULL;
+ SRenderableImage *roughnessImage = nullptr;
QT3DSU32 roughnessImageIdx = 0;
// normal mapping
- SRenderableImage *normalImage = NULL;
+ SRenderableImage *normalImage = nullptr;
QT3DSU32 normalImageIdx = 0;
// translucency map
- SRenderableImage *translucencyImage = NULL;
+ SRenderableImage *translucencyImage = nullptr;
QT3DSU32 translucencyImageIdx = 0;
// lightmaps
- SRenderableImage *lightmapIndirectImage = NULL;
+ SRenderableImage *lightmapIndirectImage = nullptr;
QT3DSU32 lightmapIndirectImageIdx = 0;
- SRenderableImage *lightmapRadiosityImage = NULL;
+ SRenderableImage *lightmapRadiosityImage = nullptr;
QT3DSU32 lightmapRadiosityImageIdx = 0;
- SRenderableImage *lightmapShadowImage = NULL;
+ SRenderableImage *lightmapShadowImage = nullptr;
QT3DSU32 lightmapShadowImageIdx = 0;
const bool supportStandardDerivatives
= m_RenderContext.GetRenderContext().IsStandardDerivativesSupported();
- for (SRenderableImage *img = m_FirstImage; img != NULL;
+ for (SRenderableImage *img = m_FirstImage; img != nullptr;
img = img->m_NextImage, ++imageIdx) {
hasSpecMap = img->m_MapType == ImageMapTypes::Specular;
if (img->m_MapType == ImageMapTypes::Bump) {
@@ -983,6 +985,8 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
bool enableSSDO = false;
bool enableShadowMaps = false;
bool enableBumpNormal = normalImage || bumpImage;
+ bool enableAlphaTest
+ = m_DefaultMaterialShaderKeyProperties.m_AlphaTestEnabled.GetValue(inKey);
for (QT3DSU32 idx = 0; idx < FeatureSet().size(); ++idx) {
eastl::string name(FeatureSet()[idx].m_Name.c_str());
@@ -1051,7 +1055,7 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
fragmentShader.Append("\tvec3 vertColor = vec3(1.0);");
// You do bump or normal mapping but not both
- if (bumpImage != NULL) {
+ if (bumpImage != nullptr) {
GenerateImageUVCoordinates(bumpImageIdx, *bumpImage);
fragmentShader.AddUniform("bumpAmount", "float");
@@ -1065,7 +1069,7 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
fragmentShader << "\tbinormal = normalize(cross(world_normal, tangent) );\n";
fragmentShader << "\ttangent = normalize(cross(binormal, world_normal) );\n";
- } else if (normalImage != NULL) {
+ } else if (normalImage != nullptr) {
GenerateImageUVCoordinates(normalImageIdx, *normalImage);
fragmentShader.AddInclude("defaultMaterialFileNormalTexture.glsllib");
@@ -1098,7 +1102,7 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
fragmentShader.AddUniform("material_properties", "vec4");
}
- if (lightmapIndirectImage != NULL) {
+ if (lightmapIndirectImage != nullptr) {
GenerateImageUVCoordinates(lightmapIndirectImageIdx, *lightmapIndirectImage, 1);
fragmentShader << "\tvec4 indirect_light = texture2D( " << m_ImageSampler << ", "
<< m_ImageFragCoords << ");" << Endl;
@@ -1110,7 +1114,7 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
}
}
- if (lightmapRadiosityImage != NULL) {
+ if (lightmapRadiosityImage != nullptr) {
GenerateImageUVCoordinates(lightmapRadiosityImageIdx, *lightmapRadiosityImage, 1);
fragmentShader << "\tvec4 direct_light = texture2D( " << m_ImageSampler << ", "
<< m_ImageFragCoords << ");" << Endl;
@@ -1122,7 +1126,7 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
}
}
- if (translucencyImage != NULL) {
+ if (translucencyImage != nullptr) {
fragmentShader.AddUniform("translucentFalloff", "float");
fragmentShader.AddUniform("diffuseLightWrap", "float");
@@ -1478,6 +1482,14 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
}
}
+ // Alpha test
+ if (enableAlphaTest) {
+ fragmentShader.AddUniform("alphaOpRef", "vec2");
+ fragmentShader.Append(
+ "\tif (dot(vec2(global_diffuse_light.a, 1.0), alphaOpRef) <= 0.0)\n"
+ "\t\tdiscard;");
+ }
+
if (hasEmissiveMap) {
fragmentShader.Append("\tglobal_diffuse_light.rgb += global_emission.rgb;");
}
@@ -1498,6 +1510,343 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
}
}
+ // generate default material shader for depth only pass
+ NVRenderShaderProgram *GenerateDepthPassShader(
+ const SGraphObject &inMaterial, SShaderDefaultMaterialKey inShaderDescription,
+ IShaderStageGenerator &inVertexPipeline, TShaderFeatureSet inFeatureSet,
+ SRenderableImage *inFirstImage, bool inHasTransparency,
+ const char8_t *inVertexPipelineName, const char8_t *inCustomMaterialName = "") override
+ {
+ QT3DS_ASSERT(inMaterial.m_Type == GraphObjectTypes::DefaultMaterial);
+ m_CurrentMaterial = static_cast<const SDefaultMaterial *>(&inMaterial);
+ m_CurrentKey = &inShaderDescription;
+ m_CurrentPipeline = static_cast<IDefaultMaterialVertexPipeline *>(&inVertexPipeline);
+ m_CurrentFeatureSet = inFeatureSet;
+ m_FirstImage = inFirstImage;
+ m_HasTransparency = inHasTransparency;
+
+ ProgramGenerator().BeginProgram();
+
+ bool enableAlphaTest = m_DefaultMaterialShaderKeyProperties
+ .m_AlphaTestEnabled.GetValue(inShaderDescription);
+
+ QT3DS_ASSERT(m_FirstImage != nullptr);
+ if (!enableAlphaTest)
+ return nullptr;
+ QT3DS_ASSERT(enableAlphaTest);
+
+ m_GeneratedShaderString.clear();
+ m_GeneratedShaderString.assign(nonNull(inVertexPipelineName));
+ m_GeneratedShaderString.append("depth--");
+
+ SShaderDefaultMaterialKey theKey(Key());
+ theKey.ToString(m_GeneratedShaderString, m_DefaultMaterialShaderKeyProperties,
+ SShaderDefaultMaterialKeyProperties::DepthKey);
+
+ m_LightsAsSeparateUniforms = !m_RenderContext.GetRenderContext().GetConstantBufferSupport();
+
+ VertexGenerator().BeginFragmentGeneration();
+ IShaderStageGenerator &fragmentShader(FragmentGenerator());
+ IDefaultMaterialVertexPipeline &vertexShader(VertexGenerator());
+
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+ vertexShader.Append("void main() {");
+ vertexShader.Append("\tgl_Position = model_view_projection * vec4( attr_pos, 1.0 );");
+ vertexShader.Append("\tvec3 uTransform;");
+ vertexShader.Append("\tvec3 vTransform;");
+
+ fragmentShader << "\tfloat global_opacity = object_opacity;" << Endl;
+
+ fragmentShader.Append("\tvec4 texture_color;");
+ QT3DSU32 idx = 0;
+ for (SRenderableImage *image = m_FirstImage; image; image = image->m_NextImage, ++idx) {
+ // Various maps are handled on a different locations
+ if (image->m_MapType == ImageMapTypes::Bump
+ || image->m_MapType == ImageMapTypes::Normal
+ || image->m_MapType == ImageMapTypes::Displacement
+ || image->m_MapType == ImageMapTypes::SpecularAmountMap
+ || image->m_MapType == ImageMapTypes::Roughness
+ || image->m_MapType == ImageMapTypes::Translucency
+ || image->m_MapType == ImageMapTypes::LightmapIndirect
+ || image->m_MapType == ImageMapTypes::LightmapRadiosity
+ || image->m_MapType == ImageMapTypes::Emissive) {
+ continue;
+ }
+
+ eastl::basic_string<char8_t> texSwizzle, lookupSwizzle, texLodStr;
+
+ GenerateImageUVCoordinates(idx, *image, 0);
+
+ GenerateTextureSwizzle(
+ image->m_Image.m_TextureData.m_Texture->GetTextureSwizzleMode(), texSwizzle,
+ lookupSwizzle);
+
+ if (texLodStr.empty()) {
+ fragmentShader << "\ttexture_color" << texSwizzle.c_str() << " = texture2D( "
+ << m_ImageSampler << ", " << m_ImageFragCoords << ")"
+ << lookupSwizzle.c_str() << ";" << Endl;
+ } else {
+ fragmentShader << "\ttexture_color" << texSwizzle.c_str() << "= textureLod( "
+ << m_ImageSampler << ", " << m_ImageFragCoords << ", "
+ << texLodStr.c_str() << " )" << lookupSwizzle.c_str() << ";"
+ << Endl;
+ }
+
+ switch (image->m_MapType) {
+ case ImageMapTypes::Diffuse: // assume images are premultiplied.
+ case ImageMapTypes::LightmapShadow:
+ case ImageMapTypes::Specular:
+ case ImageMapTypes::Opacity:
+ fragmentShader.Append("\tglobal_opacity *= texture_color.a;");
+ break;
+ default:
+ break;
+ }
+ }
+
+ fragmentShader.AddUniform("alphaOpRef", "vec2");
+ fragmentShader.Append("\tif (dot(vec2(global_opacity, 1.0), alphaOpRef) <= 0.0)\n"
+ "\t\tdiscard;");
+ fragmentShader.Append("\tfragOutput = vec4(0.0);");
+ fragmentShader.Append("}");
+ vertexShader.Append("}");
+
+ return ProgramGenerator().CompileGeneratedShader(m_GeneratedShaderString.c_str(),
+ SShaderCacheProgramFlags(), FeatureSet());
+
+ }
+
+ // generate default material shader cube depth shader
+ NVRenderShaderProgram *GenerateCubeDepthShader(
+ const SGraphObject &inMaterial, SShaderDefaultMaterialKey inShaderDescription,
+ IShaderStageGenerator &inVertexPipeline, TShaderFeatureSet inFeatureSet,
+ SRenderableImage *inFirstImage, bool inHasTransparency,
+ const char8_t *inVertexPipelineName, const char8_t *inCustomMaterialName = "") override
+ {
+ QT3DS_ASSERT(inMaterial.m_Type == GraphObjectTypes::DefaultMaterial);
+ m_CurrentMaterial = static_cast<const SDefaultMaterial *>(&inMaterial);
+ m_CurrentKey = &inShaderDescription;
+ m_CurrentPipeline = static_cast<IDefaultMaterialVertexPipeline *>(&inVertexPipeline);
+ m_CurrentFeatureSet = inFeatureSet;
+ m_FirstImage = inFirstImage;
+ m_HasTransparency = inHasTransparency;
+
+ ProgramGenerator().BeginProgram();
+
+ bool enableAlphaTest = m_DefaultMaterialShaderKeyProperties
+ .m_AlphaTestEnabled.GetValue(inShaderDescription);
+
+ QT3DS_ASSERT(m_FirstImage != nullptr);
+ if (!enableAlphaTest)
+ return nullptr;
+ QT3DS_ASSERT(enableAlphaTest);
+
+ m_GeneratedShaderString.clear();
+ m_GeneratedShaderString.assign(nonNull(inVertexPipelineName));
+ m_GeneratedShaderString.append("shadowcube--");
+
+ SShaderDefaultMaterialKey theKey(Key());
+ theKey.ToString(m_GeneratedShaderString, m_DefaultMaterialShaderKeyProperties,
+ SShaderDefaultMaterialKeyProperties::DepthKey);
+
+ m_LightsAsSeparateUniforms = !m_RenderContext.GetRenderContext().GetConstantBufferSupport();
+
+ VertexGenerator().BeginFragmentGeneration();
+ IShaderStageGenerator &fragmentShader(FragmentGenerator());
+ IDefaultMaterialVertexPipeline &vertexShader(VertexGenerator());
+
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ vertexShader.AddUniform("model_matrix", "mat4");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+ vertexShader.AddOutgoing("raw_pos", "vec4");
+ vertexShader.AddOutgoing("world_pos", "vec4");
+
+ vertexShader.Append("void main() {");
+ vertexShader.Append("\tvec3 uTransform;");
+ vertexShader.Append("\tvec3 vTransform;");
+ vertexShader.Append("\tworld_pos = model_matrix * vec4( attr_pos, 1.0 );");
+ vertexShader.Append("\tworld_pos /= world_pos.w;");
+ vertexShader.Append("\tgl_Position = model_view_projection * vec4( attr_pos, 1.0 );");
+ vertexShader.Append("\traw_pos = vec4( attr_pos, 1.0 );");
+
+ fragmentShader << "\tfloat global_opacity = object_opacity;" << Endl;
+
+ fragmentShader.Append("\tvec4 texture_color;");
+ QT3DSU32 idx = 0;
+ for (SRenderableImage *image = m_FirstImage; image; image = image->m_NextImage, ++idx) {
+ // Various maps are handled on different locations
+ if (image->m_MapType == ImageMapTypes::Bump
+ || image->m_MapType == ImageMapTypes::Normal
+ || image->m_MapType == ImageMapTypes::Displacement
+ || image->m_MapType == ImageMapTypes::SpecularAmountMap
+ || image->m_MapType == ImageMapTypes::Roughness
+ || image->m_MapType == ImageMapTypes::Translucency
+ || image->m_MapType == ImageMapTypes::LightmapIndirect
+ || image->m_MapType == ImageMapTypes::LightmapRadiosity
+ || image->m_MapType == ImageMapTypes::Emissive) {
+ continue;
+ }
+
+ eastl::basic_string<char8_t> texSwizzle, lookupSwizzle, texLodStr;
+
+ GenerateImageUVCoordinates(idx, *image, 0);
+
+ GenerateTextureSwizzle(
+ image->m_Image.m_TextureData.m_Texture->GetTextureSwizzleMode(), texSwizzle,
+ lookupSwizzle);
+
+ if (texLodStr.empty()) {
+ fragmentShader << "\ttexture_color" << texSwizzle.c_str() << " = texture2D( "
+ << m_ImageSampler << ", " << m_ImageFragCoords << ")"
+ << lookupSwizzle.c_str() << ";" << Endl;
+ } else {
+ fragmentShader << "\ttexture_color" << texSwizzle.c_str() << "= textureLod( "
+ << m_ImageSampler << ", " << m_ImageFragCoords << ", "
+ << texLodStr.c_str() << " )" << lookupSwizzle.c_str() << ";"
+ << Endl;
+ }
+
+ switch (image->m_MapType) {
+ case ImageMapTypes::Diffuse: // assume images are premultiplied.
+ case ImageMapTypes::LightmapShadow:
+ case ImageMapTypes::Specular:
+ case ImageMapTypes::Opacity:
+ fragmentShader.Append("\tglobal_opacity *= texture_color.a;");
+ break;
+ default:
+ break;
+ }
+ }
+
+ fragmentShader.AddUniform("camera_position", "vec3");
+ fragmentShader.AddUniform("camera_properties", "vec2");
+ fragmentShader.Append("\tvec3 camPos = vec3(camera_position.x, camera_position.y, "
+ "-camera_position.z);");
+ fragmentShader.Append("\tfloat dist = length(world_pos.xyz - camPos);");
+ fragmentShader.Append("\tdist = max((dist - 1.0) / (camera_properties.y - 1.0), 0.0);");
+ fragmentShader.AddUniform("alphaOpRef", "vec2");
+ fragmentShader.Append("\tif (dot(vec2(global_opacity, 1.0), alphaOpRef) <= 0.0)\n"
+ "\t\tdist = 1.0;");
+ fragmentShader.Append("\tfragOutput = vec4(dist);");
+ fragmentShader.Append("}");
+
+ vertexShader.Append("}");
+
+ return ProgramGenerator().CompileGeneratedShader(m_GeneratedShaderString.c_str(),
+ SShaderCacheProgramFlags(), FeatureSet());
+ }
+
+ // generate default material shader orthographic depth shader
+ NVRenderShaderProgram *GenerateOrthoDepthShader(
+ const SGraphObject &inMaterial, SShaderDefaultMaterialKey inShaderDescription,
+ IShaderStageGenerator &inVertexPipeline, TShaderFeatureSet inFeatureSet,
+ SRenderableImage *inFirstImage, bool inHasTransparency,
+ const char8_t *inVertexPipelineName, const char8_t *inCustomMaterialName = "") override
+ {
+ QT3DS_ASSERT(inMaterial.m_Type == GraphObjectTypes::DefaultMaterial);
+ m_CurrentMaterial = static_cast<const SDefaultMaterial *>(&inMaterial);
+ m_CurrentKey = &inShaderDescription;
+ m_CurrentPipeline = static_cast<IDefaultMaterialVertexPipeline *>(&inVertexPipeline);
+ m_CurrentFeatureSet = inFeatureSet;
+ m_FirstImage = inFirstImage;
+ m_HasTransparency = inHasTransparency;
+
+ ProgramGenerator().BeginProgram();
+
+ bool enableAlphaTest = m_DefaultMaterialShaderKeyProperties
+ .m_AlphaTestEnabled.GetValue(inShaderDescription);
+
+ QT3DS_ASSERT(m_FirstImage != nullptr);
+ if (!enableAlphaTest)
+ return nullptr;
+ QT3DS_ASSERT(enableAlphaTest);
+
+ m_GeneratedShaderString.clear();
+ m_GeneratedShaderString.assign(nonNull(inVertexPipelineName));
+ m_GeneratedShaderString.append("shadowmap--");
+
+ SShaderDefaultMaterialKey theKey(Key());
+ theKey.ToString(m_GeneratedShaderString, m_DefaultMaterialShaderKeyProperties,
+ SShaderDefaultMaterialKeyProperties::DepthKey);
+
+ m_LightsAsSeparateUniforms = !m_RenderContext.GetRenderContext().GetConstantBufferSupport();
+
+ VertexGenerator().BeginFragmentGeneration();
+ IShaderStageGenerator &fragmentShader(FragmentGenerator());
+ IDefaultMaterialVertexPipeline &vertexShader(VertexGenerator());
+
+ vertexShader.AddIncoming("attr_pos", "vec3");
+ vertexShader.AddUniform("model_view_projection", "mat4");
+ vertexShader.AddOutgoing("outDepth", "vec3");
+
+ vertexShader.Append("void main() {");
+ vertexShader.Append("\tvec3 uTransform;");
+ vertexShader.Append("\tvec3 vTransform;");
+ vertexShader.Append("\tgl_Position = model_view_projection * vec4( attr_pos, 1.0 );");
+ vertexShader.Append("\toutDepth.x = gl_Position.z / gl_Position.w;");
+
+ fragmentShader << "\tfloat global_opacity = object_opacity;" << Endl;
+
+ fragmentShader.Append("\tvec4 texture_color;");
+ QT3DSU32 idx = 0;
+ for (SRenderableImage *image = m_FirstImage; image; image = image->m_NextImage, ++idx) {
+ // Various maps are handled on different locations
+ if (image->m_MapType == ImageMapTypes::Bump
+ || image->m_MapType == ImageMapTypes::Normal
+ || image->m_MapType == ImageMapTypes::Displacement
+ || image->m_MapType == ImageMapTypes::SpecularAmountMap
+ || image->m_MapType == ImageMapTypes::Roughness
+ || image->m_MapType == ImageMapTypes::Translucency
+ || image->m_MapType == ImageMapTypes::LightmapIndirect
+ || image->m_MapType == ImageMapTypes::LightmapRadiosity
+ || image->m_MapType == ImageMapTypes::Emissive) {
+ continue;
+ }
+
+ eastl::basic_string<char8_t> texSwizzle, lookupSwizzle, texLodStr;
+
+ GenerateImageUVCoordinates(idx, *image, 0);
+
+ GenerateTextureSwizzle(
+ image->m_Image.m_TextureData.m_Texture->GetTextureSwizzleMode(), texSwizzle,
+ lookupSwizzle);
+
+ if (texLodStr.empty()) {
+ fragmentShader << "\ttexture_color" << texSwizzle.c_str() << " = texture2D( "
+ << m_ImageSampler << ", " << m_ImageFragCoords << ")"
+ << lookupSwizzle.c_str() << ";" << Endl;
+ } else {
+ fragmentShader << "\ttexture_color" << texSwizzle.c_str() << "= textureLod( "
+ << m_ImageSampler << ", " << m_ImageFragCoords << ", "
+ << texLodStr.c_str() << " )" << lookupSwizzle.c_str() << ";"
+ << Endl;
+ }
+
+ switch (image->m_MapType) {
+ case ImageMapTypes::Diffuse: // assume images are premultiplied.
+ case ImageMapTypes::LightmapShadow:
+ case ImageMapTypes::Specular:
+ case ImageMapTypes::Opacity:
+ fragmentShader.Append("\tglobal_opacity *= texture_color.a;");
+ break;
+ default:
+ break;
+ }
+ }
+
+ fragmentShader.AddUniform("alphaOpRef", "vec2");
+ fragmentShader.Append("\tfloat depth = (outDepth.x + 1.0) * 0.5;");
+ fragmentShader.Append("\tif (dot(vec2(global_opacity, 1.0), alphaOpRef) <= 0.0)\n"
+ "\t\tdepth = 1.0;");
+ fragmentShader.Append("\tfragOutput = vec4(depth);");
+ fragmentShader.Append("}");
+ vertexShader.Append("}");
+
+ return ProgramGenerator().CompileGeneratedShader(m_GeneratedShaderString.c_str(),
+ SShaderCacheProgramFlags(), FeatureSet());
+ }
+
NVRenderShaderProgram *GenerateMaterialShader(const char8_t *inShaderPrefix)
{
// build a string that allows us to print out the shader we are generating to the log.
@@ -1509,7 +1858,8 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
m_GeneratedShaderString.assign(nonNull(inShaderPrefix));
SShaderDefaultMaterialKey theKey(Key());
- theKey.ToString(m_GeneratedShaderString, m_DefaultMaterialShaderKeyProperties);
+ theKey.ToString(m_GeneratedShaderString, m_DefaultMaterialShaderKeyProperties,
+ SShaderDefaultMaterialKeyProperties::DefaultKey);
m_LightsAsSeparateUniforms = !m_RenderContext.GetRenderContext().GetConstantBufferSupport();
@@ -1545,7 +1895,7 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
{
eastl::pair<TProgramToShaderMap::iterator, bool> inserter =
m_ProgramToShaderMap.insert(eastl::make_pair(
- &inProgram, NVScopedRefCounted<SShaderGeneratorGeneratedShader>(NULL)));
+ &inProgram, NVScopedRefCounted<SShaderGeneratorGeneratedShader>(nullptr)));
if (inserter.second) {
NVAllocatorCallback &alloc(m_RenderContext.GetRenderContext().GetAllocator());
inserter.first->second = QT3DS_NEW(alloc, SShaderGeneratorGeneratedShader)(
@@ -1671,7 +2021,8 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
NVRenderTexture2D *inDepthTexture, NVRenderTexture2D *inSSaoTexture,
SImage *inLightProbe, SImage *inLightProbe2, QT3DSF32 inProbeHorizon,
QT3DSF32 inProbeBright, QT3DSF32 inProbe2Window, QT3DSF32 inProbe2Pos,
- QT3DSF32 inProbe2Fade, QT3DSF32 inProbeFOV)
+ QT3DSF32 inProbe2Fade, QT3DSF32 inProbeFOV,
+ const QT3DSVec2 &alphaOpRef)
{
NVRenderContext &context(m_RenderContext.GetRenderContext());
@@ -1776,6 +2127,7 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
shader.m_MaterialSpecular.Set(material_specular);
shader.m_CameraProperties.Set(inCameraVec);
shader.m_FresnelPower.Set(inMaterial.m_FresnelPower);
+ shader.m_alphaTestOp.Set(alphaOpRef);
if (context.GetConstantBufferSupport()) {
NVRenderConstantBuffer *pLightCb = GetLightConstantBuffer(shader.m_Lights.size());
@@ -1885,12 +2237,13 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
context.SetBlendEquation(blendEqua);
}
void SetMaterialProperties(NVRenderShaderProgram &inProgram,
- const SGraphObject &inMaterial, const QT3DSVec2 &inCameraVec,
- const QT3DSMat44 &inModelViewProjection,
- const QT3DSMat33 &inNormalMatrix,
- const QT3DSMat44 &inGlobalTransform,
- SRenderableImage *inFirstImage, QT3DSF32 inOpacity,
- SLayerGlobalRenderProperties inRenderProperties) override
+ const SGraphObject &inMaterial, const QT3DSVec2 &inCameraVec,
+ const QT3DSMat44 &inModelViewProjection,
+ const QT3DSMat33 &inNormalMatrix,
+ const QT3DSMat44 &inGlobalTransform,
+ SRenderableImage *inFirstImage, QT3DSF32 inOpacity,
+ SLayerGlobalRenderProperties inRenderProperties,
+ const QT3DSVec2 &alphaOpRef) override
{
const SDefaultMaterial &theMaterial(static_cast<const SDefaultMaterial &>(inMaterial));
QT3DS_ASSERT(inMaterial.m_Type == GraphObjectTypes::DefaultMaterial);
@@ -1905,7 +2258,8 @@ struct SShaderGenerator : public IDefaultMaterialShaderGenerator
inRenderProperties.m_LightProbe, inRenderProperties.m_LightProbe2,
inRenderProperties.m_ProbeHorizon, inRenderProperties.m_ProbeBright,
inRenderProperties.m_Probe2Window, inRenderProperties.m_Probe2Pos,
- inRenderProperties.m_Probe2Fade, inRenderProperties.m_ProbeFOV);
+ inRenderProperties.m_Probe2Fade, inRenderProperties.m_ProbeFOV,
+ alphaOpRef);
}
SLightConstantProperties<SShaderGeneratorGeneratedShader> *GetLightConstantProperties(SShaderGeneratorGeneratedShader &shader)