zoukankan      html  css  js  c++  java
  • Qt3D Shader

    ---------------------------------------------------
    Qt3D ShaderPrograme
    Qt3D GLSL 渲染器
    Shader示例可参考:
        http://blog.csdn.net/candycat1992/article/details/44039077
        https://www.shadertoy.com/
    http://blog.csdn.net/candycat1992/article/details/44039077
    faq: shader的输入参数怎么各家都不一样,到底是如何定义的
    ---------------------------------------------------
    概念
        渲染代码可由ShaderProgram对象封装
        参数的传递比ShaderEffect复杂得多,好麻烦
        要求输出的参数是一致的(gl_Position, gl_FragColor)
        
    
    Qt3D默认提供的参数
        attribute highp vec4 vertexPosition;   // 顶点位置
        attribute highp vec3 vertexNormal;     // 顶点法线
        attribute highp vec2 vertexTexCoord;   // 顶点纹理坐标
        uniform highp mat4 mvp;                // ?
        uniform highp mat4 modelMatrix;        // ?
        uniform highp vec3 cameraPosition;     // 相机位置
        uniform mat4 modelView;                // ?
        uniform mat4 modelNormalMatrix;        // ?
    
    常用的方法
       normalize
       dot
       min/mix/max/pow/
       textureCube
        highp vec4 surface = texture2D(surfaceTexture, texCoord);
        highp vec3 reflectedDirection = reflect(viewDirection, normalize(normal));
        textureCube(skyboxTexture, reflectedDirection).rgb
    
    VertexShader
        // Qt 3D默认提供的参数  
        attribute vec3 vertexPosition;  
        attribute vec3 vertexNormal;  
        uniform mat4 modelView;  
        uniform mat4 modelNormalMatrix;  
        uniform mat4 mvp;  
        // 自己提供的参数  
        uniform vec3 lightPosition;  
        varying vec3 reflectVec;  
        varying vec3 viewVec;  
        varying float NdotL;  
        void main( void )  
        {  
            vec3 ecPos = ( modelView * vec4( vertexPosition, 1.0 ) ).xyz;  
            vec3 normal = normalize( modelNormalMatrix * vec4( vertexNormal, 1.0 ) ).xyz;  
            vec3 lightVec = normalize( lightPosition - ecPos );  
            reflectVec = normalize( reflect( -lightVec, normal ) );  
            viewVec = normalize( -ecPos );  
            NdotL = ( dot( lightVec, normal ) + 1.0 ) * 0.5;  
            gl_Position = mvp * vec4( vertexPosition, 1.0 );  
        }  
    
    
    FragmentShader
        // 自己提供的参数  
        uniform vec3 surfaceColor;  
        uniform vec3 warmColor;  
        uniform vec3 coolColor;  
        uniform float diffuseWarm;  
        uniform float diffuseCool;  
        varying vec3 reflectVec;  
        varying vec3 viewVec;  
        varying float NdotL;  
        void main( void )  
        {  
            vec3 kcool    = min( coolColor + diffuseCool * surfaceColor, 1.0 );  
            vec3 kwarm    = min( warmColor + diffuseWarm * surfaceColor, 1.0 );  
            vec3 kfinal   = mix( kcool, kwarm, NdotL );  
            float spec = max( dot( reflectVec, viewVec ), 0.0 );  
            spec = pow( spec, 32.0 );  
            gl_FragColor = vec4( min( kfinal + spec, 1.0 ), 1.0 );  
        }
        
    
    
    cinematic3d/BackgroundCubeMap.qml    
        ShaderProgram {
            id: gles2SkyboxShader
            vertexShaderCode: "
                attribute vec3 vertexPosition;
                varying vec3 texCoord0;
                uniform mat4 mvp;
                void main()
                {
                    texCoord0 = vertexPosition.xyz;
                    gl_Position = vec4(mvp * vec4(vertexPosition, 1.0)).xyww; // Fail depth test always against any rendered pixel
                }
                "
            fragmentShaderCode: "
                varying highp vec3 texCoord0;
                uniform samplerCube skyboxTexture;
                void main()
                {
                    gl_FragColor = textureCube(skyboxTexture, texCoord0);
                }
                "
        }
        
    // 二维贴图材质
    Texture2D {
        property alias source: image.source
        minificationFilter: Texture.LinearMipMapLinear
        magnificationFilter: Texture.Linear
        generateMipMaps: true
        wrapMode {
            x: WrapMode.ClampToEdge
            y: WrapMode.ClampToEdge
        }
        TextureImage {id: image}
    }
  • 相关阅读:
    Nokia Qt SDK开发环境使用
    iPad不久将能使用Android系统
    原生IDE新军:JRuby阵营的RedCar,JavaScript阵营的Cloud9(自己写个IDE出来一定很复杂吧)
    手机产品的信息架构
    百万开发者拥戴!七大.NET著名开源项目
    Prism 4.0发布最终版,支持Windows Phone 7
    Qt Symbian 开发环境安装
    Qt 4.7.1 和 Mobility 1.1.0 已发布
    WSI闭关,这对WS*意味着什么?(个人觉得Web Services是个好东西)
    ERROR: unknown virtual device name解决方法
  • 原文地址:https://www.cnblogs.com/surfsky/p/6963187.html
Copyright © 2011-2022 走看看