- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 GLSL 着色器,它根据一组贝塞尔曲线(点的 3d 坐标)绘制 3D 曲线。绘图本身是按照我的意愿完成的,除了遮挡不能正常工作,即在某些视点下,应该在最前面的曲线似乎仍然被遮挡,而反向:应该是曲线的一部分被遮挡仍然可见。
为了说明,这里有几个截图示例:
我是 GLSL 的新手,可能不知道这种效果的正确术语,但我认为它是遮挡剔除(更新:它实际上表明深度缓冲区的问题,术语混淆!)。
我的问题是:在使用 GLSL 着色器时如何处理遮挡?
我必须在着色器程序或其他地方处理它们吗?
关于我的代码,它有点长(加上我使用 OpenGL 包装器库),但主要步骤是:
gl_Position = ModelViewProjectionMatrix * Vertex;
并将颜色信息进一步传递给几何着色器。lines_adjacency
) 及其相应的颜色,并生成一个遵循贝塞尔曲线的三角形带(我在贝塞尔曲线段之间使用了一些基本的颜色插值)。 gl_FragColor = VertexIn.mColor;
。关于 OpenGL 设置,我启用了 GL_DEPTH_TEST
,但它似乎没有我需要的任何东西。此外,如果我在场景中放置任何其他非着色器几何体(例如四边形),无论视点如何,曲线总是渲染在它的顶部。
任何有关如何解决它以及它发生的原因的见解和提示都将受到赞赏。
更新解决方案
因此,据我所知,最初的问题不是找到剔除算法,而是我没有正确处理 z 值的计算(请参阅已接受的答案)。我还了解到,如果设置了正确的深度缓冲区,OpenGL 会自行正确处理遮挡,因此我不需要重新发明轮子。
我搜索了我的 GLSL 程序,发现在将顶点坐标转换为屏幕坐标时,我基本上将几何着色器中的 z 值设置为零 (vec2( vertex.xy/vertex.w ) * Viewport;
)。我通过分别计算 z 值 (vertex.z/vertex.w
) 并将它们分配给发射点 (gl_Position = vec4( screenCoords[i], zValues[i ], 1.0 );
).这解决了我的问题。
关于深度缓冲区设置,我不必明确指定它们,因为我使用的库默认情况下会根据需要正确设置它们。
最佳答案
如果您不使用深度缓冲区,那么最近渲染的对象将始终在顶部。
您应该使用 glEnable(GL_DEPTH_TEST)
启用它,根据您的喜好设置该功能 (glDepthFunc(GL_LEQUAL)
),并确保您在每一帧都清除它否则 (glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
)。
然后确保您的顶点着色器正确设置了最终顶点的 Z 值。看起来最简单的方法是在 CPU 端设置 ModelViewProjectionMatrix
的“模型”部分,使其在传递到着色器之前具有深度值。
只要您使用的是正交投影矩阵,渲染就不会受到影响(除了使绘制顺序正确之外)。
关于opengl - GLSL 着色器 : occlusion order and culling,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39421480/
我正在开发一个图像处理项目,并且在许多科学论文中遇到遮挡这个词,遮挡在图像处理中意味着什么?字典只是给出了一般的定义。谁能使用图像作为上下文来描述它们? 最佳答案 遮挡意味着您想看到某些内容,但由于传
有一个关于我的体素引擎的问题。从现在开始,我基本上是在最大限度地发挥我的发动机的性能,它已经变得非常出色,有时能够达到600fps,但有一个问题,我已经被困了一周,这有点糟糕。。所以就像我之前说的那样
这可能是一个晦涩的问题,但我在网上看到很多非常酷的示例,说明人们如何使用 ARKit 3 中新的 ARKit 人物遮挡技术有效地将人物与背景“分开”,并应用某种过滤给“人民”(见 here )。 在查
出于某种原因,即使我在 Stackoverflow 上查看了某人的问题,我也无法让人们遮挡工作。这是我的代码: //Load ARView let arView = ARView(frame: .ze
我有一个 GLSL 着色器,它根据一组贝塞尔曲线(点的 3d 坐标)绘制 3D 曲线。绘图本身是按照我的意愿完成的,除了遮挡不能正常工作,即在某些视点下,应该在最前面的曲线似乎仍然被遮挡,而反向:应该
我开始研究 iOS 13 上新的 People Occlusion 效果,所以我下载了 sample project并尝试在我的设备上编译。 在 iOS 13 iPhone 7 Plus 上运行,出现
我是一名优秀的程序员,十分优秀!