Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Three.js WebGLRenderTarget:着色器中的空纹理纹理纹理均匀_Three.js_Shader - Fatal编程技术网

Three.js WebGLRenderTarget:着色器中的空纹理纹理纹理均匀

Three.js WebGLRenderTarget:着色器中的空纹理纹理纹理均匀,three.js,shader,Three.js,Shader,使用THREE.WebGLRenderTarget将场景渲染为纹理并将该纹理传递给第二个着色器时,在着色器纹理均匀变量中接收的值始终为null 代码流程: Shader1用于渲染深度贴图(在屏幕上渲染时工作正常) 渲染的深度贴图将作为纹理均匀传递给最终在屏幕上渲染的着色器2 相关代码段: //Initialize the renderTarget var options = { minFilter : THREE.LinearFilter,

使用THREE.WebGLRenderTarget将场景渲染为纹理并将该纹理传递给第二个着色器时,在着色器纹理均匀变量中接收的值始终为null

代码流程:

  • Shader1用于渲染深度贴图(在屏幕上渲染时工作正常)
  • 渲染的深度贴图将作为纹理均匀传递给最终在屏幕上渲染的着色器2
  • 相关代码段:

    //Initialize the renderTarget
    var options = {
    
                    minFilter : THREE.LinearFilter,
                    magFilter : THREE.LinearFilter,
                    format : THREE.RGBAFormat,
                    type : /(iPad|iPhone|iPod)/g.test(navigator.userAgent) ? THREE.HalfFloatType : 
                            THREE.FloatType
                };
    
        renderTarget1 = new THREE.WebGLRenderTarget(window.innerWidth, window.innerHeight, 
                                       options);
        renderTarget1.stencilBuffer = false;
        renderTarget1.texture.needsUpdate = true;
        renderTarget1.texture.generateMipmaps = false;
    
        //Define the Shader2 uniforms
            uniforms = {
                         depthMap : { type: "t", value: renderTarget1.texture},
                         O_SIZE : { type: "float", value: 0.000375},
                       };
    
            //Creating Material for Shader2
            materialShader2 = new THREE.ShaderMaterial({
                                uniforms: uniforms,
                                vertexShader : document.getElementById('vertex2_Shader').textContent,
                                fragmentShader : document.getElementById('fragment2_Shader').textContent
                              });
    
    
        materialShader2.needsUpdate = true;
    
    
        //Animate function
        function animate()
        {
            // render depth map in renderTarget1
            renderer.setRenderTarget(renderTarget1); //setting render target
            renderer.render(sceneDepthMap, shadowCamera); // rendering depthmap to framebuffer
            renderer.setRenderTarget(null);
            renderer.render(scene2, shadowCamera);
            requestAnimationFrame( animate );
        }
    

    我无法访问您的GLSL着色器代码,但您确定统一名称相同吗?它应该是
    统一的二维深度图,注意大写字母。此外,您不再需要在制服中声明
    类型:“t”
    ,引擎会根据其值自动检测

    其次,如果要获取渲染过程的深度缓冲区,则需要设置为新纹理,因为
    .texture
    存储的是颜色缓冲区,而不是深度缓冲区。然后可以将其用作统一值:

    var renderTarget1=new THREE.WebGLRenderTarget(window.innerWidth,window.innerHeight);
    renderTarget1.depthTexture=新的3.depthTexture(
    window.innerWidth,
    窗内高度
    );
    var materialShader2=新的3.ShaderMaterial({
    制服:{
    //请注意统一名称、depthTexture和无类型
    深度贴图:{value:renderTarget1.depthTexture},
    O_大小:{值:0.000375},
    },
    vertexShader:document.getElementById('vertex2_着色器').textContent,
    fragmentShader:document.getElementById('fragment2_着色器').textContent
    });
    
    我无权访问您的GLSL着色器代码,但您确定统一名称相同吗?它应该是
    统一的二维深度图,注意大写字母。此外,您不再需要在制服中声明
    类型:“t”
    ,引擎会根据其值自动检测

    其次,如果要获取渲染过程的深度缓冲区,则需要设置为新纹理,因为
    .texture
    存储的是颜色缓冲区,而不是深度缓冲区。然后可以将其用作统一值:

    var renderTarget1=new THREE.WebGLRenderTarget(window.innerWidth,window.innerHeight);
    renderTarget1.depthTexture=新的3.depthTexture(
    window.innerWidth,
    窗内高度
    );
    var materialShader2=新的3.ShaderMaterial({
    制服:{
    //请注意统一名称、depthTexture和无类型
    深度贴图:{value:renderTarget1.depthTexture},
    O_大小:{值:0.000375},
    },
    vertexShader:document.getElementById('vertex2_着色器').textContent,
    fragmentShader:document.getElementById('fragment2_着色器').textContent
    });
    
    是,统一名称相同。我以传统的方式渲染了深度贴图(在光源处使用正交摄影机,并在rgba纹理中存储网格的z值)。因此,我在renderTarget1中使用.texture而不是.depthTexture。我现在已经附加了着色器代码。请看一看。谢谢你对统一定义的更新。是的,统一名称是相同的。我以传统的方式渲染了深度贴图(在光源处使用正交摄影机,并在rgba纹理中存储网格的z值)。因此,我在renderTarget1中使用.texture而不是.depthTexture。我现在已经附加了着色器代码。请看一看。感谢您对统一定义的更新。