对半透明物体实施深度测试
过去两天,我一直在仔细拖互联网,以了解半透明对象的深度测试.我已经阅读了有关该主题的多个论文/教程,从理论上讲,我相信我了解它的工作原理.但是,它们都没有给我实际的示例代码. 我对半透明对象的深度测试有三个要求: 应该是独立订单. 如果相同对象的两个四边形是相交的,则应工作.两者都半透明.想象一下从上方查看时看起来像X的草对物体: 它应该正确地渲染一个半透明的播放器rgba(0, 1, 0, 0.5),在建筑物的窗口后面rgba(0, 0, 1, 0.5),但在背景对象的前面rgba(1, 0, 0, 1): 最左边的线是我想象的光/颜色在穿过半透明的对象向相机 时变化. 最终想法 我怀疑最好的方法是进行深度剥离,但我仍然缺乏一些实现/示例.我倾向于这种方法,因为游戏是2.5D,并且由于性能可能会变得危险(很多层),因此不需要超过两个半透明的对象来" peel". 我已经熟悉Framebuffers以及如何编码它们(对它们做一些后处理效果).我会
0 2023-11-30
编程技术问答社区
WebGL2 FBO深度附件值
我只是试图使用WebGL2这样的webgl2来渲染场景的深度值: //Texture depthTexture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, depthTexture); gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT24, width, height, 0, gl.DEPTH_COMPONENT, gl.UNSIGNED_INT, null); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.T
0 2023-11-30
编程技术问答社区
Webgl:替代写到gl_FragDepth的方法
在WebGL中,是否可以写入片段的深度值或以其他方式控制片段的深度值? 据我所知,WebGL 1.x中不存在GL_FragDepth,但我想知道是否还有其他方法(扩展,浏览器特定的支持等)可以做到这一点. 我要存档的是使用射线跟踪对象播放以及使用常规模型,视图,投影绘制的其他元素. 解决方案 有扩展名 > 因为它是一个扩展程序,它可能到处都不可用,因此您需要检查它. var isFragDepthAvailable = gl.getExtension("EXT_frag_depth"); 如果isFragDepthAvailable不是假的,那么您可以使用 在着色器中启用它 #extension GL_EXT_frag_depth : enable 否则,您可以在顶点着色器中操纵gl_Position.z,尽管我怀疑这不是真正需要的可行解决方案. 其他解决方案 布拉德·拉尔森(Brad Larson)在分子中使用的巧妙解决方法(完整的博客文
0 2023-11-30
编程技术问答社区
WebGL如何在深度缓冲区中设置值?
在OpenGL中,深度缓冲区值是根据场景的近剪切平面计算的. (参考:从深度缓冲区中获取真实的Z值) 这在WebGL中如何起作用?我的理解是,WebGL并没有意识到我场景的远处和剪裁飞机.近距离剪裁平面用于计算我的投影矩阵,但我从不告诉WebGl它们是明确的,因此它不能使用它们来计算深度缓冲区值. 当我的场景渲染时,WebGL如何在深度缓冲区中设置值? 解决方案 webGl(如Modern OpenGL和OpenGL ES)从您在顶点着色器中提供的值gl_Position.z获得深度值(尽管您也可以使用某些扩展名直接写入深度缓冲区,但这要少得多常见) WebGL或Modern OpenGL中没有场景.场景的概念是从90年代初期留下的旧版OpenGL的一部分,自从不推荐使用以来.它不存在于OpenGL ES(在Android,iOS,Chromeos,Raspberry Pi,WebGL等上运行的OpenGL ...) 现代OpenGL和WebGL只是栅格化
0 2023-11-30
编程技术问答社区
我如何在WebGL中读取深度缓冲区?
使用WebGL API,如何从深度缓冲区或以任何其他方式获得一个值P> 解决方案 已经过去了几年,如今,WEBGL_depth_texture扩展已广泛可用...除非您需要支持IE. 一般用法: 准备: 查询扩展名(必需) 分配单独的颜色和深度纹理(gl.DEPTH_COMPONENT) 将两个纹理组合到单个框架缓冲器(gl.COLOR_ATTACHMENT0,gl.DEPTH_ATTACHMENT) 渲染: 绑定框架缓冲器,渲染您的场景(通常是简化版本) 解开框架缓冲器,将深度纹理传递给着色器,然后像其他任何纹理一样阅读: texPos.xyz = (gl_Position.xyz / gl_Position.w) * 0.5 + 0.5; float depthFromZBuffer = texture2D(uTexDepthBuffer, texPos.xy).x; 其他解决方案 我不知道是否可以直接访问深度缓冲区,但是如果您
0 2023-11-30
编程技术问答社区
深度排序2D对象的WebGL 3D使用方法
This question has a strong relation with my other question: Isometric rendering without tiles, is that goal reachable? I want to depth sort objects in an isometric world (html5 canvas). The world is not tiled, so every item in the world can be placed on each x, y, z coordinate. Since it's not a tiled world, depth sorting is hard to do. I even want that if items intersect, that the visible parts are drawn as if it were intersecting parts in a f
0 2023-11-30
编程技术问答社区
如何在OpenGL(ES)中正确渲染重合的多边形
我了解,通过在OpenGL ES中设置深度功能,可以控制在3D场景中如何呈现重叠的几何形状.我在代码中使用gl.depthFunc(gl.LEQUAL)(webGl). 但是,当两组多边形是一致的并且具有不同的颜色时,结果表面被证明是两种颜色的任意混合图案(随着相机位置的变化而变化,因此会导致闪烁).看看此图像: 我该如何解决?我尝试了不同的DepthFunc值,但是它们都没有解决此问题.我希望重合的多边形具有单色,这并不重要. 解决方案 这被称为 z-fighting ,与两个对象有关在相同的深度呈现,但舍入错误(和深度缓冲精度)偶尔会在另一个前方弹出.您可以使用的一种解决方案是使用GlpolyGonoffset函数: SDK/DOCS/MAN/XHTML/GLPOLYGONOFFSET.xml 您可以在此页面的底部看到一个示例: /p> 其他解决方案 您所经历的称为 z战斗,不幸的是,对它没有确定的解决方案.发生的事情是,由于深度缓冲区的精确
0 2023-11-30
编程技术问答社区
线性化深度
在OpenGL中您可以像这样线性化深度值: float linearize_depth(float d,float zNear,float zFar) { float z_n = 2.0 * d - 1.0; return 2.0 * zNear * zFar / (zFar + zNear - z_n * (zFar - zNear)); } (来源: https://stackoverflow.com/a/6657284/10011415 ) 但是,Vulkan处理深度值的处理方式有所不同( https://matthewwellings. com/blog/the-new-vulkan坐标系统/).我不太了解其背后的数学,我必须对功能进行哪些更改才能与Vulkan线性化的深度值? 解决方案 OpenGL和Vulkan之间的重要区别在于,归一化设备坐标(NDC)的Z(深度)具有不同的范围.在OpenGl中为-1至1,在Vulkan中为0到1.
0 2023-11-26
编程技术问答社区
opengl z-sorting的透明度
im在OpenGL ES 2.0中的简单正方形上渲染PNG,但是当我尝试在广场后面绘制一些东西时,我已经绘制了顶部广场中的透明区域的颜色与背景相同. 我在每个渲染电话的开始时都会打电话. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glEnable (GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 解决方案 您的标题本质上是您问题的答案! 通常是通过首先呈现场景中的所有不透明对象(让Z-Buffer找出可见的内容)来完成透明度,然后从后到正面呈现所有透明对象. 其他解决方案 Drew Hall给了您一个很好的答案,但另一种选择是用glAlphaFunc(GL_GREATER, 0.1f)设置glEnable(GL_ALPHA_TEST).这将防止透明的像素(在这种情况下,
0 2023-10-25
编程技术问答社区
是否可以在Unity';HDRP中创建DepthMask效果?
我已经对此猛击了一段时间,但是我无法弄清楚是否可以为 depthmask depthmask hdrp (如在此处列出). 为了确切的用途,我正在尝试以所使用的材料的形状创建一个"孔",以显示所有在所有事物后面呈现的不同摄像机的内容. 我尝试用着色器,不同的ztest和zwrite组合以及我发现的着色器的某些变化来弄乱渲染队列.最重要的是,我尝试用基本HDRP着色器的每种配置来弄乱我可能会做的事情. 我能获得的最接近的是在物体后面制造透明的材料消失.这确实意味着,如果我将所有不透明的材料设置为透明,我会得到我想要的效果,但是这并不理想,因为它的破裂远远超出了它的解决.理想情况下,我能够以不透明的材料以某种方式使用HDRP透明的优先系统,但不确定是否有可能. 我不太确定接下来要做什么,任何帮助都将不胜感激! 解决方案 所以我设法找到了一种实现此目的的方法,它在这里使用自定义通行证: 在 此场景中有三个对象: 将掩盖并有一部分消失的飞机(是黄色).它
2 2023-08-31
编程技术问答社区
使用射线投射时在深度缓冲区中写入正确的值
我正在以3D纹理进行射线铸造,直到我达到正确的值.我正在在一个立方体上进行射线铸造,并且立方体角已经在世界坐标中,因此我不必用ModelViewMatrix将顶点乘以获得正确的位置. 顶点着色器 world_coordinate_ = gl_Vertex; 碎片着色器 vec3 direction = (world_coordinate_.xyz - cameraPosition_); direction = normalize(direction); for (float k = 0.0; k surface_) ... } 一切都按预期工作,我现在想要的是将正确的值对深度缓冲区进行采样.现在写入深度缓冲区的值是立方体坐标.但是我希望写
8 2023-08-31
编程技术问答社区
使用中等精度在RGBA纹理中打包深度信息
试图了解通用移动目标的WebGL开发相关的许多问题,现在我需要将深度信息存储在纹理附件中以进行以后的检索和后处理. javaScript: var depthRB = gl.createRenderbuffer(); gl.bindRenderbuffer(gl.RENDERBUFFER, depthRB); gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, w, h); gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, depthRB); gl.bindRenderbuffer(gl.RENDERBUFFER, null); var texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, texture); gl.texPar
16 2023-08-31
编程技术问答社区
OpenGL中的深度偏移
在OpenGL中抵消深度的最佳方法是什么?我目前每个多边形都有索引顶点属性,然后将其传递给OpenGL中的顶点着色器.我的目标是将最高索引始终位于较低索引的最高指数深度抵消多边形.我目前有这种简单的方法修改gl_Position.z. gl_Position.z += -index * 0.00001; 解决方案 设置深度自动偏移的通常方法为 glPolygonOffset(GLfloat factor,GLfloat units) 当启用GL_POLYGON_OFFSET_FILL,GL_POLYGON_OFFSET_LINE或GL_POLYGON_OFFSET_POINT时, 每个片段的深度值从适当的顶点的深度值插值后,将被抵消. 偏移的值为factor * DZ + r * units, 其中DZ是对深度相对于多边形的屏幕区域的变化的测量值 r是保证可以产生可分解的偏移的最小值. 在执行深度测试之前和将值写入深度缓冲区之前,添加偏移量. . glEnable(
4 2023-08-31
编程技术问答社区
如何在现代OpenGL中用fragment shader中的gl_FragCoord.z来线性地渲染深度?
我阅读了许多有关使用Fragment着色器获得深度的信息. 例如 http:/php?ubb = showflat&number = 234519 ,但我仍然不知道gl_FragCoord.z是否是线性的. GLSL规范说,其范围是屏幕SAPCE中的[0,1],而无需提及线性. 我认为线性是至关重要的,因为我将使用渲染模型来匹配Kinect的深度图. 然后,如果不是线性的,则如何在世界空间中进行线性化? 解决方案 ,但我仍然不知道gl_fragcoord.z是线性的. gl_FragCoord.z是否线性取决于投影矩阵. 而对于拼字图gl_FragCoord.z是线性的,对于透视投影而不是线性. 一般而言,深度(gl_FragCoord.z和gl_FragDepth)的计算如下(请参阅 glsl gl_fragcoord.z计算和设置gl_fragdepth ): float ndc_depth = clip_space_
6 2023-08-31
编程技术问答社区
不能让深度测试在OpenGL中工作
我使用 sfml 创建窗口. 在此屏幕截图中,立方体应该在金字塔后面,但它不起作用. 这是我使用的最小代码: #include #include #include #include "ResourcePath.hpp" void resize(); void drawScene(); void initGL(); float rtri = 0; float rquad = 0; float z = -10.0f; int main (int argc, const char * argv[]) { // Create the main window sf::RenderWindow *window = new sf::RenderWindow(); window->Create( sf::VideoMode( 800, 600, 32 ), "
10 2023-08-31
编程技术问答社区
线性深度缓冲区
许多人使用像这样的第三行使用通常的视角矩阵: (0 0 (n+f)/(n-f) 2*n*f/(n-f)) ,但它在远距离剪平表面附近的浮子精度方面存在问题.结果是Z战斗. 如何使用Z的线性转换?让我们将矩阵的第三行更改为: (0 0 -2/(f-n) (-f-n)/(f-n)) 将是线性转换z,从[-n,-f]到[-1,1].然后,我们将在顶点着色器中添加该行: gl_Position.z *= gl_Position.w; 透视后,将恢复z值. 为什么不到处使用?我在互联网上发现了很多文章.他们所有人都使用了通常的矩阵. 我所描述的线性转换是否有我看不见的问题? 更新:这不是 this .我的问题不是关于如何进行线性深度缓冲区.就我而言,缓冲区已经是线性的.我不明白,为什么不使用此方法?内WebGL管道中是否有陷阱? 解决方案 您所描述的方法根本不起作用.双曲线Z缓冲区的一个优点是,我们可以在屏幕空间中插入所得深度值线性.如果您
12 2023-06-29
编程技术问答社区
OpenGL深度测试在某些计算机上不起作用
我在这里的第一个问题.在我的程序深度测试中,在某些计算机上可以正常工作,但是它在其他计算机上不起作用,这些对象位于较近的距离较近的对象.我打电话给glEnable(GL_DEPTH_TEST);并试图调用glDepthFunc(GL_LESS);,正如我所说,一切在某些计算机上都能正常工作,但是同一程序在其他计算机上无法正常工作.如何修复? 编辑:解决问题.在打电话之前添加这些行 al_create_display();一切都起作用 al_set_new_display_option( ALLEGRO_COLOR_SIZE, 32, ALLEGRO_REQUIRE); al_set_new_display_option( ALLEGRO_DEPTH_SIZE, 24, ALLEGRO_REQUIRE); al_set_new_display_option( ALLEGRO_STENCIL_SIZE, 8, ALLEGRO_REQUIRE);
4 2023-06-29
编程技术问答社区
OpenGL GL_DEPTH_TEST与glDepthFunc和glDepthMask?
我一直在使用glDisable(GL_DEPTH_TEST)禁用深度测试,认为它只会禁用深度"测试".我猜我感到困惑的原因是因为我创建了两个功能,一个是禁用深度"测试",另一个是用glDepthMask(GL_FALSE); 禁用深度"写入"的. 如果禁用GL_DEPTH_TEST既可以禁用"测试"和"写作",那么它等于: glDepthFunc(GL_ALWAYS​); // DISABLE TESTS (OR ACTUALLY ALWAYS LET THE TEST SUCCEED) glDepthMask(GL_FALSE); // DISABLE WRITES 我认为禁用GL_DEPTH_TEST,除非我想禁用两个测试和写入,否则我想知道哪个更好.措辞似乎令人困惑,但也许只是我.我想使用glDepthFun(GL_ALWAYS)进行禁用深度测试仍会进行比较,我想没有办法完全禁用深度测试,而仍然允许写入? 解决方案 glDisable(GL_DEPTH_TES
102 2023-06-29
编程技术问答社区
Kinect V2深度框架的像素大小
Kinect V2提供了一个深度框架,其分辨率为512 x 424像素,而FOV为70.6 x 60 degrees,平均每度约为7 x 7像素. [但是,我找不到有关深度框架像素大小的任何类型的信息,或者是否有任何方法可以从给定信息中计算像素大小? 解决方案 您是否在问如何在深度数据中映射像素的大小? const int FRAME_WIDTH = 512; const int FRAME_HEIGHT = 424; const float FOV_HORIZONTAL = 70.6 * PI / 180.0; // convert to radians const float FOV_VERTICAL = 60.0 * PI / 180.0; // convert to radians const float HORIZONTAL_SCALING = 2 * std::tan(FOV_HORIZONTAL / 2.0) / (float)FRAME_WIDTH; con
22 2023-06-07
编程技术问答社区
当点的深度相同时,opengl的深度缓冲区很慢
我正在制作一个2D游戏,涉及在屏幕上画大量重叠的四边形.什么并不重要的是什么. 如果我从0到0的z值绘制每个四边形,并且具有gldepthfunc(gl_less)set,我会像您期望的那样获得相当不错的速度提升. 这是为了避免绘制完全隐藏或部分隐藏在其他四边形后面的四边形. 因此,我使用以下内容来绘制四边形: float small = (float(1)/1000000); for (int iii = 0; iii draw(opengl, freeSpace, iii*small); } 但是,由于我不将z值用于实际深度,所以我似乎应该可以走: for (int iii = 0; iii draw(opengl, freeSpace, 0.0f); } 或仅将0
6 2023-05-24
编程技术问答社区