2016-11-21 137 views
0
錯質地

我試圖用一個shaderMaterial調整亮度和對比度一個對象(球體的VR視頻)three.js所上ShaderMaterial

在這裏我是如何實現ShaderMaterial

var geometry = new THREE.SphereGeometry(500, 60, 40); 

var panoTexture = new THREE.VideoTexture(video); 
panoTexture.minFilter = THREE.LinearFilter; 
panoTexture.magFilter = THREE.LinearFilter; 
panoTexture.format = THREE.RGBFormat; 

// var material = new THREE.MeshLambertMaterial({ map : texture }); 

var shader = THREE.BrightnessContrastShader; 
shader.uniforms[ "contrast" ].value = 0.0; 
shader.uniforms[ "brightness" ].value = 0.0; 
shader.uniforms[ "texture" ].texture = panoTexture; 

var panoMaterial = new THREE.ShaderMaterial(shader); 


panoVideoMesh = new THREE.Mesh(geometry, panoMaterial); 

這裏是我使用的着色器

THREE.BrightnessContrastShader = { 

    uniforms: { 

     "tDiffuse": { type: "t", value: null }, 
     "brightness": { type: "f", value: 0 }, 
     "contrast": { type: "f", value: 0 }, 
     "texture": { type: "t", value: 0 } 

    }, 

    vertexShader: [ 

     "varying vec2 vUv;", 

     "void main() {", 

      "vUv = uv;", 

      "gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);", 

     "}" 

    ].join("\n"), 

    fragmentShader: [ 

     "uniform sampler2D tDiffuse;", 
     "uniform float brightness;", 
     "uniform float contrast;", 

     "varying vec2 vUv;", 

     "void main() {", 

      "gl_FragColor = texture2D(tDiffuse, vUv);", 

      "gl_FragColor.rgb += brightness;", 

      "if (contrast > 0.0) {", 
       "gl_FragColor.rgb = (gl_FragColor.rgb - 0.5)/(1.0 - contrast) + 0.5;", 
      "} else {", 
       "gl_FragColor.rgb = (gl_FragColor.rgb - 0.5) * (1.0 + contrast) + 0.5;", 
      "}", 

     "}" 

    ].join("\n") 

}; 

當球體是它的使用另一個最近生成的紋理是該場景的另一部分呈現的代碼。

如何保持panoTexture上的視頻紋理,這是可能的,我是否正在以正確的方式去做這件事?

+1

你沒有使用'texture'統一在片段着色器,你使用'tDiffuse'均勻。 – 2pha

+0

謝謝我試過shader.uniforms [「tDiffuse」] .texture = panoTexture;這是一樣的。每次在別處創建新紋理時,都會使用該紋理 – user5839

回答

0

這個工作

shader.uniforms[ "tDiffuse" ].value = panoTexture;