Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. qml image shader working but video with shader effects not working

qml image shader working but video with shader effects not working

Scheduled Pinned Locked Moved Solved QML and Qt Quick
2 Posts 1 Posters 687 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J Offline
    J Offline
    jhovarie
    wrote on last edited by
    #1

    Hello guys Im not sure whats is wrong with my code.
    This code works on image it.

    import QtQuick 2.9
    import QtQuick.Window 2.2
    
    Window {
        visible: true
        width: 640
        height: 480
        title: qsTr("Hello World")
    
        Rectangle {
            width: 200; height: 100
            Row {
                Image { id: img;
                        sourceSize { width: 100; height: 100 } source: "images/batman.jpg" }
    
    
                ShaderEffect {
                    width: 100; height: 100
                    property variant src: img
    
                    vertexShader: "
                        uniform highp mat4 qt_Matrix;
                        attribute highp vec4 qt_Vertex;
                        attribute highp vec2 qt_MultiTexCoord0;
                        varying highp vec2 coord;
                        void main() {
                            coord = qt_MultiTexCoord0;
                            gl_Position = qt_Matrix * qt_Vertex;
                        }"
    
                    fragmentShader: "
                        varying highp vec2 coord;
                        uniform sampler2D src;
                        uniform lowp float qt_Opacity;
                        void main() {
                            lowp vec4 tex = texture2D(src, coord);
                            tex.r = 0;
                            gl_FragColor = tex;
                        }"
                }
            }
        }
    }
    

    Then here is my code to apply shader for video but unfortunately it doest not works.

    import QtQuick 2.9
    import QtQuick.Window 2.2
    import QtQuick.Controls 1.3
    import QtMultimedia 5.8
    
    Window {
        visible: true
        width: 800
        height: 600
    
        Rectangle {
            id: myrec
            width: 800
            height: 600
            color: "black"
    
            MediaPlayer {
                id: player
                source:  "videos/FilmCountDown.mp4"
                autoPlay: true
            }
    
            VideoOutput {
                id: videoOutput
                source: player
                anchors.fill: parent
            }
    
            ShaderEffect {
                width: 100; height: 100
                property variant src: player
                vertexShader: "
                    uniform highp mat4 qt_Matrix;
                    attribute highp vec4 qt_Vertex;
                    attribute highp vec2 qt_MultiTexCoord0;
                    varying highp vec2 coord;
                    void main() {
                        coord = qt_MultiTexCoord0;
                        gl_Position = qt_Matrix * qt_Vertex;
                    }"
    
                fragmentShader: "
                    varying highp vec2 coord;
                    uniform sampler2D src;
                    uniform lowp float qt_Opacity;
                    void main() {
                        lowp vec4 tex = texture2D(src, coord);
                        gl_FragColor = vec4(vec3(dot(tex.rgb,
                                 vec3(0.344, 0.5, 0.156))),
                                 tex.a) * qt_Opacity;
                    }"
            }
        }
    }
    
    

    Any help?

    J 1 Reply Last reply
    0
    • J jhovarie

      Hello guys Im not sure whats is wrong with my code.
      This code works on image it.

      import QtQuick 2.9
      import QtQuick.Window 2.2
      
      Window {
          visible: true
          width: 640
          height: 480
          title: qsTr("Hello World")
      
          Rectangle {
              width: 200; height: 100
              Row {
                  Image { id: img;
                          sourceSize { width: 100; height: 100 } source: "images/batman.jpg" }
      
      
                  ShaderEffect {
                      width: 100; height: 100
                      property variant src: img
      
                      vertexShader: "
                          uniform highp mat4 qt_Matrix;
                          attribute highp vec4 qt_Vertex;
                          attribute highp vec2 qt_MultiTexCoord0;
                          varying highp vec2 coord;
                          void main() {
                              coord = qt_MultiTexCoord0;
                              gl_Position = qt_Matrix * qt_Vertex;
                          }"
      
                      fragmentShader: "
                          varying highp vec2 coord;
                          uniform sampler2D src;
                          uniform lowp float qt_Opacity;
                          void main() {
                              lowp vec4 tex = texture2D(src, coord);
                              tex.r = 0;
                              gl_FragColor = tex;
                          }"
                  }
              }
          }
      }
      

      Then here is my code to apply shader for video but unfortunately it doest not works.

      import QtQuick 2.9
      import QtQuick.Window 2.2
      import QtQuick.Controls 1.3
      import QtMultimedia 5.8
      
      Window {
          visible: true
          width: 800
          height: 600
      
          Rectangle {
              id: myrec
              width: 800
              height: 600
              color: "black"
      
              MediaPlayer {
                  id: player
                  source:  "videos/FilmCountDown.mp4"
                  autoPlay: true
              }
      
              VideoOutput {
                  id: videoOutput
                  source: player
                  anchors.fill: parent
              }
      
              ShaderEffect {
                  width: 100; height: 100
                  property variant src: player
                  vertexShader: "
                      uniform highp mat4 qt_Matrix;
                      attribute highp vec4 qt_Vertex;
                      attribute highp vec2 qt_MultiTexCoord0;
                      varying highp vec2 coord;
                      void main() {
                          coord = qt_MultiTexCoord0;
                          gl_Position = qt_Matrix * qt_Vertex;
                      }"
      
                  fragmentShader: "
                      varying highp vec2 coord;
                      uniform sampler2D src;
                      uniform lowp float qt_Opacity;
                      void main() {
                          lowp vec4 tex = texture2D(src, coord);
                          gl_FragColor = vec4(vec3(dot(tex.rgb,
                                   vec3(0.344, 0.5, 0.156))),
                                   tex.a) * qt_Opacity;
                      }"
              }
          }
      }
      
      

      Any help?

      J Offline
      J Offline
      jhovarie
      wrote on last edited by
      #2

      @jhovarie

      I will answer my own reply again..

      Here is the working code for video with shader. I just copy it from the samples.

      import QtQuick 2.0
        import QtMultimedia 5.0
      
        Rectangle {
            width: 300
            height: 300
            color: "black"
      
            MediaPlayer {
                id: mediaPlayer
                source: "test.mp4"
                playing: true
            }
      
            VideoOutput {
                id: video
                anchors.fill: parent
                source: mediaPlayer
            }
      
            ShaderEffect {
                property variant source: ShaderEffectSource { sourceItem: video; hideSource: true }
                property real wiggleAmount: 0.005
                anchors.fill: video
      
                fragmentShader: "
                    varying highp vec2 qt_TexCoord0;
                    uniform sampler2D source;
                    uniform highp float wiggleAmount;
                    void main(void)
                    {
                        highp vec2 wiggledTexCoord = qt_TexCoord0;
                        wiggledTexCoord.s += sin(4.0 * 3.141592653589 * wiggledTexCoord.t) * wiggleAmount;
                        gl_FragColor = texture2D(source, wiggledTexCoord.st);
                    }
                "
            }
        }
      
      1 Reply Last reply
      0

      • Login

      • Login or register to search.
      • First post
        Last post
      0
      • Categories
      • Recent
      • Tags
      • Popular
      • Users
      • Groups
      • Search
      • Get Qt Extensions
      • Unsolved