首页 > 其他分享 >three.js 深度不完全解读

three.js 深度不完全解读

时间:2023-10-24 15:01:24浏览次数:41  
标签:const target float three js 解读 vec4 深度 gl

three.js 深度不完全解读

一、深度值的获取

1、方法1: FBO的深度附件

深度信息通过渲染管线中的深度缓冲区(depth buffer)来计算和存储。缓冲区用于存储每个像素点的深度值。
在渲染过程中,渲染器会根据每个像素点的深度值来确定最终像素的可见性和着色。

const target = new THREE.WebGLRenderTarget();
target.depthTexture = new THREE.DepthTexture();

renderer.setRenderTarget(target);
renderer.render()

// 深度值: target.depthTexture, 近(0)~远(1)

2、方法2: 深度材质

scene.overrideMaterial = new THREE.MeshDepthMaterial()
const target = new THREE.WebGLRenderTarget();

renderer.setRenderTarget(target)
renderer.render();

// 深度值: target.texture, 近(1)~远(0)

原理:

// @vertex
vHighPrecisionZW = gl_Position.zw;
// @fragement
// Higher precision equivalent of gl_FragCoord.z. This assumes depthRange has been left to its default values.
float fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;

#if DEPTH_PACKING == 3200
  gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );
#elif DEPTH_PACKING == 3201
  gl_FragColor = packDepthToRGBA( fragCoordZ );
#endif

方法3: 利用 gl_FragCoord

float depth = gl_FragCoord.z / gl_FragCoord.w;

二、深度值的压缩和解压

压缩类型(DEPTH_PACKING):

export const BasicDepthPacking = 3200;
export const RGBADepthPacking = 3201;
vec4 packDepthToRGBA( const in float v ) {
  vec4 r = vec4( fract( v * PackFactors ), v );
  r.yzw -= r.xyz * ShiftRight8; // tidy overflow
  return r * PackUpscale;
}

float unpackRGToDepth( const in highp vec2 v ) {
  return unpackRGBAToDepth( vec4( v.xy, 0.0, 0.0 ) );
}

三、深度值的相关转换

深度转viewZ

float perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {
  // maps perspective depth in [ 0, 1 ] to viewZ
  return ( near * far ) / ( ( far - near ) * depth - far );
}

标签:const,target,float,three,js,解读,vec4,深度,gl
From: https://www.cnblogs.com/lianming/p/17784800.html

相关文章

  • js实现在报表参数界面获取body中控件的值
     要在报表参数界面获取body中控件的值,你可以使用JavaScript来实现。下面是一个详细的介绍:1.DOM(文档对象模型):  -DOM是用于操作HTML文档的API,它允许你通过JavaScript访问和操作文档中的元素。  -在报表参数界面,你可以使用DOM来获取页面上的控件元素。2.获取控件元......
  • js实现关闭子窗口时刷新父窗口
     当我们在子窗口中关闭窗口时,可以使用JavaScript来刷新父窗口。下面是一个详细的介绍:1.获取父窗口对象:  -在子窗口中,可以使用`window.parent`属性获取父窗口的全局对象。  -通过`window.parent`,我们可以访问父窗口的各种属性和方法。2.关闭子窗口:  -在子窗......
  • 使用三方摄像头,实现pjsip的视频通话功能
    提要:近期一直在做视频通话功能,主要基于pjsip来实现的,将这些过程记录下来,可能对做同类型工作的同学有所帮助!实现思路,参考pjsip原来设备采集视频、编码并rtp组包发送的思路,再在原有流程中做修改!主要关键点:1、摄像头采集完成后已经是已编码的H264/H265的流,不需要再开启pjsip的编......
  • C#对没有规律的json字符串转化为对象序列化并遍历读取
    varjsonString={"BillDate":1,"TypeName":0,"StepNum":0,"CollectCode":0,"Uncollected":1,"Tax":0,"AbstractInfo":1}现在我们要对这它进行转化并遍历读取:///<summary>///把json字符串转化为对象//......
  • Jquery向json对象添加键值对,读取键值对,删除键值对
    添加键值对varlabelName={};labelName["Name"]="James"labelName["Sex"]="1"结果:labelName={"Name":"James","Sex":1};读取键值对vargetData={"Label":"Dong","Sex":&quo......
  • jquery对复杂的集合型Json数据进行筛选(象C#的find一样)
    比如如下js下的json数据:varlist=[{"ColName":"OrderDate","ColLabel":"日期","ColNewLabel":"日期","IsChecked":1,"Sort":"0"},{"ColName":"OrderCode","ColLa......
  • C#序列化和反序列化JSON的两种方法(转载)(三)
    C#有两种方式序列化和反序列化JSON字符串:第一种是System.Web.Script.Serialization下的JavaScriptSerializer,原生自带的这种方法需要与类绑定,不方便。第二种是Json.NET第三方库方法,既可以与对象绑定,也可以反序列化为更通用的JObject,方便易用,推荐。一:  JavaScript......
  • JWT Tool:针对 JSON Web Tokens 的测试工具题解JWT cracking
    什么是JWT?JWT是JSONWebToken的缩写,它是一串带有声明信息的字符串,由服务端使用加密算法对信息签名,以保证其完整性和不可伪造性。Token里可以包含所有必要的信息,这样服务端就无需保存任何关于用户或会话的信息了。JWT可用于身份认证,会话状态维持以及信息交换等任务。JWT由三部分......
  • 项目中JSON序列化循环引用的问题
    已经很多次碰到循环引用的问题了之前碰到是在Spring中初始化过程中component之间存在循环引用怎么办 这次碰到,是在JSON序列话的时候碰到了循环引用导致的问题问题原因:在结构体中,为了实现方便数据的引用,在数据结构中加入了Parent节点,由于存在child节点,在生成json对象的时候就......
  • json的解析和生成(两种方式对比)(二)
    一:解析JSON文件       解析JSON文件用到两种方法都可以,即两种类库,都可以     用到的类库      JavaScriptSerializer类,内置于.NET中用于解析的生成JSON文件      JSON.NET库,第三方加载包    第一种用:NET自带的JavaScriptSerializer     ......