Three.js WebGLRenderTarget:着色器中的空纹理纹理纹理均匀
使用THREE.WebGLRenderTarget将场景渲染为纹理并将该纹理传递给第二个着色器时,在着色器纹理均匀变量中接收的值始终为null 代码流程:Three.js WebGLRenderTarget:着色器中的空纹理纹理纹理均匀,three.js,shader,Three.js,Shader,使用THREE.WebGLRenderTarget将场景渲染为纹理并将该纹理传递给第二个着色器时,在着色器纹理均匀变量中接收的值始终为null 代码流程: Shader1用于渲染深度贴图(在屏幕上渲染时工作正常) 渲染的深度贴图将作为纹理均匀传递给最终在屏幕上渲染的着色器2 相关代码段: //Initialize the renderTarget var options = { minFilter : THREE.LinearFilter,
//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。我现在已经附加了着色器代码。请看一看。感谢您对统一定义的更新。