- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在看我认为的 the first paper for depth peeling (the simplest algorithm?)我想用 webgl 实现它,使用 three.js
我想我理解了这个概念并且能够制作几个果皮,一些逻辑看起来像这样:
render(scene, camera) {
const oldAutoClear = this._renderer.autoClear
this._renderer.autoClear = false
setDepthPeelActive(true) //sets a global injected uniform in a singleton elsewhere, every material in the scene has onBeforeRender injected with additional logic and uniforms
let ping
let pong
for (let i = 0; i < this._numPasses; i++) {
const pingPong = i % 2 === 0
ping = pingPong ? 1 : 0
pong = pingPong ? 0 : 1
const writeRGBA = this._screenRGBA[i]
const writeDepth = this._screenDepth[ping]
setDepthPeelPassNumber(i) //was going to try increasing the polygonOffsetUnits here globally,
if (i > 0) {
//all but first pass write to depth
const readDepth = this._screenDepth[pong]
setDepthPeelFirstPass(false)
setDepthPeelPrevDepthTexture(readDepth)
this._depthMaterial.uniforms.uFirstPass.value = 0
this._depthMaterial.uniforms.uPrevDepthTex.value = readDepth
} else {
//first pass just renders to depth
setDepthPeelFirstPass(true)
setDepthPeelPrevDepthTexture(null)
this._depthMaterial.uniforms.uFirstPass.value = 1
this._depthMaterial.uniforms.uPrevDepthTex.value = null
}
scene.overrideMaterial = this._depthMaterial
this._renderer.render(scene, camera, writeDepth, true)
scene.overrideMaterial = null
this._renderer.render(scene, camera, writeRGBA, true)
}
this._quad.material = this._blitMaterial
// this._blitMaterial.uniforms.uTexture.value = this._screenDepth[ping]
this._blitMaterial.uniforms.uTexture.value = this._screenRGBA[
this._currentBlitTex
]
console.log(this._currentBlitTex)
this._renderer.render(this._scene, this._camera)
this._renderer.autoClear = oldAutoClear
}
我正在使用 gl_FragCoord.z
进行测试,并将深度打包到一个 8 位 RGBA 纹理中,使用如下所示的着色器:
float depth = gl_FragCoord.z;
vec4 pp = packDepthToRGBA( depth );
if( uFirstPass == 0 ){
float prevDepth = unpackRGBAToDepth( texture2D( uPrevDepthTex , vSS));
if( depth <= prevDepth + 0.0001) {
discard;
}
}
gl_FragColor = pp;
变化的 vSS
在顶点着色器中计算,在投影之后:
vSS.xy = gl_Position.xy * .5 + .5;
基本想法似乎可行,我得到了果皮,但前提是我使用软糖因素。看起来它失败了,但随着角度变得更钝(这就是为什么 polygonOffset
需要因子和单位来解释斜率?)。
一直没看懂不变性是怎么解决的。我不明白提到的扩展是如何被使用的,除了它似乎覆盖了片段深度,但是用什么?
我必须承认,我什至不确定这里指的是哪个插值,因为每个像素都是对齐的,我只是使用最近的过滤。
我确实看到了一些关于深度缓冲区精度的提示,但并没有真正理解这个问题,我想尝试将深度打包到三个 channel 中,看看会发生什么。
有这么小的软糖因素让它有点工作告诉我很可能所有这些采样和计算的深度似乎确实存在于同一个空间中。但这似乎与使用 gl.EQUAL 进行深度测试是同一个问题?对于狗屎和咯咯笑声,我试图在打包后立即用未打包的深度覆盖深度,但它似乎没有做任何事情。
编辑
增加每次剥离的多边形偏移量似乎已经成功。虽然我在线条上遇到了一些问题,但我认为这是因为我已经在使用偏移来绘制它们并且我需要将其包含在剥离偏移中。我仍然很想更多地了解这个问题。
最佳答案
深度缓冲区存储深度 :) 根据“远”和“近”平面,透视投影倾向于设置“堆叠”在缓冲区的一小部分中的点的深度。它在 z 中不是线性的。您可以根据深度自己设置不同的颜色并渲染一些占用大部分近远距离的三角形。
阴影贴图存储深度(到光的距离)......在投影后计算。稍后,在第二遍或后续遍中,您将比较那些“堆叠”的深度,这使得一些比较失败,因为它们的值非常相似:危险差异。
您可以使用更细粒度的深度缓冲区,24 位而不是 16 或 8 位。这可能会解决部分问题。
还有另一个问题:透视分割 或 z/w,需要获得归一化设备坐标 (NDC)。它发生在顶点着色器之后,因此 gl_FragDepth = gl_FragCoord.z 受到影响。
另一种方法是将计算出的深度存储在某个不受“堆叠”或透视分割影响的空间中。相机空间是一个。换句话说,你可以在vertex shader中计算depth undoing projection。
您链接到的文章适用于旧的固定管道,没有着色器。它显示了处理这些差异的 NVIDIA 扩展。
关于algorithm - webgl(和 threejs)中的深度剥离不变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46475653/
我正在使用python 2.7 当我尝试在其上运行epsilon操作时出现此错误, 这是我的代码 import cv2 import numpy as np img = cv2.imread('img
1 很多程序员对互联网行业中广泛讨论的“35岁危机”表示不满,似乎所有的程序员都有着35岁的职业保质期。然而,随着AI技术的兴起,这场翻天覆地的技术革命正以更加残酷且直接的方式渗透到各行各业。程序员
我有一个包含多个子模块的项目,我想列出每个子模块的相对深度 该项目: main_project submodule1 submodule1\submodule1_1 submo
我有一张彩色图像及其深度图,它们都是由 Kinect 捕获的。我想将它投影到另一个位置(以查看它在另一个视角下的样子)。由于我没有 Kinect 的内在参数(相机参数);我该如何实现? P.S:我正在
给出了这三个网址: 1) https://example.com 2) https://example.com/app 3) https://example.com/app?param=hello 假
这个着色器(最后的代码)使用 raymarching 来渲染程序几何: 但是,在图像(上图)中,背景中的立方体应该部分遮挡粉红色实体;不是因为这个: struct fragmentOutput {
我希望能够在 ThreeJS 中创建一个房间。这是我到目前为止所拥有的: http://jsfiddle.net/7oyq4yqz/ var camera, scene, renderer, geom
我正在尝试通过编写小程序来学习 Haskell...所以我目前正在为简单表达式编写一个词法分析器/解析器。 (是的,我可以使用 Alex/Happy...但我想先学习核心语言)。 我的解析器本质上是一
我想使用像 [parse_ini_file][1] 这样的东西。 例如,我有一个 boot.ini 文件,我将加载该文件以进行进一步的处理: ;database connection sett
我正在使用 Mockito 来测试我的类(class)。我正在尝试使用深度 stub ,因为我没有办法在 Mockito 中的另一个模拟对象中注入(inject) Mock。 class MyServ
我试图在调整设备屏幕大小时重新排列布局,所以我这样做: if(screenOrientation == SCREEN_ORIENTATION_LANDSCAPE) { document
我正在 Ubuntu 上编写一个简单的 OpenGL 程序,它使用顶点数组绘制两个正方形(一个在另一个前面)。由于某种原因,GL_DEPTH_TEST 似乎不起作用。后面的物体出现在前面的物体前面
static FAST_FUNC int fileAction(const char *pathname, struct stat *sb UNUSED_PARAM, void *mo
我有这样的层次结构: namespace MyService{ class IBase { public: virtual ~IBase(){} protected: IPointer
我正在制作一个图片库,需要一些循环类别方面的帮助。下一个深度是图库配置文件中的已知设置,因此这不是关于无限深度循环的问题,而是循环已知深度并输出所有结果的最有效方法。 本质上,我想创建一个 包含系统中
如何以编程方式在树状结构上获取 n 深度迭代器?在根目录中我有 List 每个节点有 Map> n+1 深度。 我已修复 1 个深度: // DEPTH 1 nodeData.forEach(base
我正在构建一个包含大量自定义元素的 Polymer 单页界面。 现在我希望我的元素具有某种主样式,我可以在 index.html 或我的主要内容元素中定义它。可以这样想: index.html
我正在尝试每 25 秒连接到配对的蓝牙设备,通过 AlarmManager 安排,它会触发 WakefulBroadcastReceiver 以启动服务以进行连接。设备进入休眠状态后,前几个小时一切正
假设有一个有默认值的函数: int foo(int x=42); 如果这被其他人这样调用: int bar(int x=42) { return foo(x); } int moo(int x=42)
是否可以使用 Javascript 获取 url 深度(级别)? 如果我有这个网址:www.website.com/site/product/category/item -> depth=4www.w
我是一名优秀的程序员,十分优秀!