1. 程式人生 > >Qt3D Shader

Qt3D Shader

nts aps 要求 1.0 pan detail sky can light

---------------------------------------------------
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} }

Qt3D Shader