Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Qt Quick3D skybox fails on android



  • I have made a small example that shows a skybox. It works fine on desktop but fails on android. The code is simple:

    import QtQuick 2.12
    import QtQuick.Window 2.12
    import QtQuick3D 1.15
    
    Window {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")
    
        View3D {
            id: view3D
            visible: true
            width: parent.width
            height: parent.height
    
            environment: SceneEnvironment {
                //backgroundMode: SceneEnvironment.Color
                backgroundMode:  SceneEnvironment.SkyBox
                lightProbe: Texture {
                    source: "qrc:/skybox.hdr"
                    mappingMode: Texture.LightProbe
                }
                clearColor: "skyblue"
            }
    
            //! [camera]
            PerspectiveCamera {
                id: cam
                position: Qt.vector3d(0, 0, 500)
            }
            //! [camera]
    
    
            DirectionalLight {
                eulerRotation.x: -45
            }
    
            Model {
                id: ball
                //source: "#Cylinder"
                source: "#Cylinder"
                scale: Qt.vector3d(1, 1, 1)
                materials: [ DefaultMaterial {
                        diffuseColor: "red"
                    }
                ]
                position: Qt.vector3d(-100, -150, 0)
                onPositionChanged: console.log(position)
            }
        }
    }
    

    Relevant part of the logs:

    I Adreno  : QUALCOMM build                   : e6de3b7, I22091d40c2
    I Adreno  : Build Date                       : 08/07/19
    I Adreno  : OpenGL ES Shader Compiler Version: EV031.25.03.03
    ............
    I OpenGLRenderer: Initialized EGL, version 1.4
    D OpenGLRenderer: Swap behavior 2
    D OpenGLRenderer: eglCreateWindowSurface = 0xa52a1120, 0x920c6808
    ..............................
    I libSkyBoxTest_armeabi-v7a.so: QSSG.trace_info: GLSL version: OpenGL ES GLSL ES 3.10
    I libSkyBoxTest_armeabi-v7a.so: QSSG.trace_info: GL version: OpenGL ES 3.0 V@331.0 (GIT@e6de3b7, I22091d40c2) (Date:08/07/19)
    I libSkyBoxTest_armeabi-v7a.so: QSSG.trace_info: HW vendor: Qualcomm
    I libSkyBoxTest_armeabi-v7a.so: QSSG.trace_info: Vendor renderer: Adreno (TM) 308
    I libSkyBoxTest_armeabi-v7a.so: QSSG.trace_info: OpenGL extensions: GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_EGL_sync GL_OES_vertex_half_float GL_OES_framebuffer_object GL_OES_rgb8_rgba8 GL_OES_compressed_ETC1_RGB8_texture GL_AMD_compressed_ATC_texture GL_OES_texture_npot GL_EXT_texture_filter_anisotropic GL_EXT_texture_format_BGRA8888 GL_OES_texture_3D GL_EXT_color_buffer_float GL_EXT_color_buffer_half_float GL_QCOM_alpha_test GL_OES_depth24 GL_OES_packed_depth_stencil GL_OES_depth_texture GL_OES_depth_texture_cube_map GL_EXT_sRGB GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_EXT_texture_type_2_10_10_10_REV GL_EXT_texture_sRGB_decode GL_OES_element_index_uint GL_QCOM_user_clip_planes GL_EXT_EGL_image_external_wrap_modes GL_EXT_multisampled_render_to_texture GL_EXT_robustness GL_OES_get_program_binary GL_EXT_debug_label GL_QCOM_tiled_rendering GL_OES_standard_derivatives GL_OES_vertex_array_object GL_EXT_YUV_target GL_EXT_sRGB_write_control GL_EXT_discard_framebuffer GL_OES_surfaceless_context GL_KHR_no_error GL_EX
    I libSkyBoxTest_armeabi-v7a.so: QSSG.trace_info: GL version: OpenGL ES 3.0 V@331.0 (GIT@e6de3b7, I22091d40c2) (Date:08/07/19)
    I libSkyBoxTest_armeabi-v7a.so: QSSG.trace_info: Compiling into shader cache: ' "fullscreen skybox shader" >'
    I Adreno  : ERROR: 0:19: 'inverse' : no matching overloaded function found
    I Adreno  : ERROR: 0:19: '=' :  cannot convert from 'const float' to '4X4 matrix of float'
    I Adreno  : ERROR: 2 compilation errors.  No code generated.
    06-21 07:33:48.481 31533 31709 I Adreno  :
    E libSkyBoxTest_armeabi-v7a.so: QSSG.internal_error: Failed to generate vertex shader!!
    E libSkyBoxTest_armeabi-v7a.so: QSSG.internal_error: Vertex source:
    E libSkyBoxTest_armeabi-v7a.so: #version 100
    E libSkyBoxTest_armeabi-v7a.so: #extension GL_OES_standard_derivatives : enable
    E libSkyBoxTest_armeabi-v7a.so: precision mediump float;
    E libSkyBoxTest_armeabi-v7a.so: precision mediump int;
    E libSkyBoxTest_armeabi-v7a.so: #define texture texture2D
    E libSkyBoxTest_armeabi-v7a.so: #define textureLod(s, co, lod) texture2D(s, co)
    E libSkyBoxTest_armeabi-v7a.so: //Shader name -fullscreen skybox shader
    06-21 07:33:48.481 31533 31709 E libSkyBoxTest_armeabi-v7a.so:
    E libSkyBoxTest_armeabi-v7a.so: attribute vec3 attr_pos;
    06-21 07:33:48.481 31533 31709 E libSkyBoxTest_armeabi-v7a.so:
    E libSkyBoxTest_armeabi-v7a.so: uniform mat4 viewMatrix;
    E libSkyBoxTest_armeabi-v7a.so: uniform mat4 projection;
    06-21 07:33:48.481 31533 31709 E libSkyBoxTest_armeabi-v7a.so:
    06-21 07:33:48.481 31533 31709 E libSkyBoxTest_armeabi-v7a.so:
    E libSkyBoxTest_armeabi-v7a.so: varying vec3 eye_direction;
    06-21 07:33:48.481 31533 31709 E libSkyBoxTest_armeabi-v7a.so:
    E libSkyBoxTest_armeabi-v7a.so: void main() {
    E libSkyBoxTest_armeabi-v7a.so:     gl_Position = vec4(attr_pos, 1.0);
    E libSkyBoxTest_armeabi-v7a.so:     mat4 inverseProjection = inverse(projection);
    E libSkyBoxTest_armeabi-v7a.so:     vec3 unprojected = (inverseProjection * gl_Position).xyz;
    E libSkyBoxTest_armeabi-v7a.so:     eye_direction = normalize(mat3(viewMatrix) * unprojected);
    E libSkyBoxTest_armeabi-v7a.so: }
    06-21 07:33:48.481 31533 31709 E libSkyBoxTest_armeabi-v7a.so:
    E libSkyBoxTest_armeabi-v7a.so: QSSG.invalid_operation: Vertex compilation output:: ERROR: 0:19: 'inverse' : no matching overloaded function found
    E libSkyBoxTest_armeabi-v7a.so: QSSG.invalid_operation: Vertex compilation output:: ERROR: 0:19: '=' :  cannot convert from 'const float' to '4X4 matrix of float'
    E libSkyBoxTest_armeabi-v7a.so: QSSG.invalid_operation: Vertex compilation output:: ERROR: 2 compilation errors.  No code generated.
    E libSkyBoxTest_armeabi-v7a.so: QSSG.invalid_operation: Vertex compilation output::
    E libSkyBoxTest_armeabi-v7a.so: QSSG.invalid_operation: Vertex compilation output::
    W project.exampl: 0xebadde09 skipped times: 0
    F libc    : Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x4 in tid 31709 (QtThread), pid 31533 (project.example)
    

    From above the problem seems to be the inverse() function in the auto generated shader:

    #version 100
    #extension GL_OES_standard_derivatives : enable
    precision mediump float;
    precision mediump int;
    #define texture texture2D
    #define textureLod(s, co, lod) texture2D(s, co)
    //Shader name -fullscreen skybox shader
    
    attribute vec3 attr_pos;
    
    uniform mat4 viewMatrix;
    uniform mat4 projection;
    varying vec3 eye_direction;
    
    
    void main() {
        gl_Position = vec4(attr_pos, 1.0);
        mat4 inverseProjection = inverse(projection);
        vec3 unprojected = (inverseProjection * gl_Position).xyz;
        eye_direction = normalize(mat3(viewMatrix) * unprojected);
    }
    

    According to the Khronus group the inverse() its only available in OpenGL ES shader language version 3.00. This seems to be a Qt bug, the auto generated preprocessor shader should be "#version 300 es", not "#version 100". Also I check my android phone it has opengl es 3.0 so it's good to go. As a workaround I could try to write my own shader but I thing thats only possible for custom Model's, not for SceneEnvironment.
    Somebody as any better ideia how to fix ???


Log in to reply