2016-11-21 3 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; 

 Смежные вопросы

  • Нет связанных вопросов^_^