Hello,
I am seeing an issue where a shader will erroneously result in a solid black color. If a line is changed to use a multiply add (adding the smallest possible float value), the correct color is displayed. Any insight into what is triggering the problem and possible workarounds would be greatly appreciated.
#version 310 esprecision highp float;layout(std140) uniform;layout(shared, binding = 8) uniform EgGrConstantBufferShaderType_PerMaterial { vec4 m_PerMaterialPacked0;};layout(shared, binding = 9) uniform EgGrConstantBufferShaderType_PerInstance { mat4 m_PerInstancePacked0; mat4 m_PerInstancePacked1; vec4 m_PerInstancePacked2; vec4 m_PerInstancePacked3; vec4 m_PerInstancePacked4;};layout(binding = 0) uniform sampler2D m_oUniqueSamplerT_0;layout(binding = 1) uniform sampler2D m_oUniqueSamplerT_1;layout(location = 0) in highp vec4 VtxGeoOutput0;layout(location = 2) in highp vec4 VtxGeoOutput2;layout(location = 0) out highp vec4 PixOutput0;float g_fNearlyZero = 1.17549435e-38F;#define MUL(a, b) (a * b)// + g_fNearlyZero) ///< Changing this to (a * b + g_fNearlyZero) results in a correct color being displayedvoid main(){ vec3 value0 = texture(m_oUniqueSamplerT_1, VtxGeoOutput2.xy).xyz; // Diffuse / albedo texture color float value1 = texture(m_oUniqueSamplerT_0, VtxGeoOutput2.xy).x; // 'Occlusion' scalar vec3 value2 = value0 * m_PerMaterialPacked0.x; // m_PerMaterialPacked0.x = 1.0 (scalar to control brightness of the diffuse) vec3 value3 = MUL(value1, value2); ///< Use MUL macro to show issue. Scale diffuse by occlusion value vec3 value4 = m_PerInstancePacked3.xyz + m_PerInstancePacked2.xyz; // m_PerInstancePacked3.xyz = vec3(1.0, 1.0, 1.0) + m_PerInstancePacked2.xyz = vec3(0.0, 0.0, 0.0) vec3 value5 = value3 * value4; // PixOutput0.xyz = max(value5, 0.0); PixOutput0.w = 1.0; return;}
#version 310 es
precision highp float;
layout(std140) uniform;
layout(shared, binding = 8) uniform EgGrConstantBufferShaderType_PerMaterial {
vec4 m_PerMaterialPacked0;
};
layout(shared, binding = 9) uniform EgGrConstantBufferShaderType_PerInstance {
mat4 m_PerInstancePacked0;
mat4 m_PerInstancePacked1;
vec4 m_PerInstancePacked2;
vec4 m_PerInstancePacked3;
vec4 m_PerInstancePacked4;
layout(binding = 0) uniform sampler2D m_oUniqueSamplerT_0;
layout(binding = 1) uniform sampler2D m_oUniqueSamplerT_1;
layout(location = 0) in highp vec4 VtxGeoOutput0;
layout(location = 2) in highp vec4 VtxGeoOutput2;
layout(location = 0) out highp vec4 PixOutput0;
float g_fNearlyZero = 1.17549435e-38F;
#define MUL(a, b) (a * b)// + g_fNearlyZero) ///< Changing this to (a * b + g_fNearlyZero) results in a correct color being displayed
void main()
{
vec3 value0 = texture(m_oUniqueSamplerT_1, VtxGeoOutput2.xy).xyz; // Diffuse / albedo texture color
float value1 = texture(m_oUniqueSamplerT_0, VtxGeoOutput2.xy).x; // 'Occlusion' scalar
vec3 value2 = value0 * m_PerMaterialPacked0.x; // m_PerMaterialPacked0.x = 1.0 (scalar to control brightness of the diffuse)
vec3 value3 = MUL(value1, value2); ///< Use MUL macro to show issue. Scale diffuse by occlusion value
vec3 value4 = m_PerInstancePacked3.xyz + m_PerInstancePacked2.xyz; // m_PerInstancePacked3.xyz = vec3(1.0, 1.0, 1.0) + m_PerInstancePacked2.xyz = vec3(0.0, 0.0, 0.0)
vec3 value5 = value3 * value4; //
PixOutput0.xyz = max(value5, 0.0);
PixOutput0.w = 1.0;
return;
}
Target hardware:
Mali-T880 GLES 3.1 v1.r9p0 in a Samsung Galaxy S7 Edge International version.
GL_RENDERER: Mali-T880
GL_VERSION: OpenGL ES 3.1 v1.r9p0-12dev0.c37094c9ad948aa7a7b056e38dcda762
GL_SHADING_LANGUAGE_VERSION: OpenGL ES GLSL ES 3.10
I've tested this code on a Galaxy Note 5 (Mali-T760) without problems.
Thanks,
Jeremiah