gpt4 book ai didi

c++ - 完全透明的OpenGL模型

转载 作者:太空狗 更新时间:2023-10-29 19:52:58 24 4
gpt4 key购买 nike

向我解释我做错了什么。我已将 3d 模型加载到自编码 opengl 渲染(v 3.3)并尝试使用顶点着色器使其像 xray 效果一样透明:

#version 330

attribute vec3 coord3d;
attribute vec2 texcoord;
varying vec2 f_texcoord;

uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;

layout (location = 0) in vec3 inPosition;
layout (location = 1) in vec4 inColor;

smooth out vec4 theColor;

void main()
{
gl_Position = projectionMatrix*modelViewMatrix*vec4(inPosition, 1.0);
theColor = vec4(0.0,0.2,0.4,0.4);
f_texcoord = texcoord;

}

该模型在编辑器中进行了三角剖分并使用:
glDrawArrays(GL_TRIANGLE_FAN, 0, (vertices.at(i)->size()/3));

如果我使用
glEnable(GL_ALPHA_TEST);
glEnable( GL_BLEND );
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glEnable(GL_DEPTH_TEST);
glClearDepth(1.0);

我看到一些不需要的三角形或线条:



如果我在没有深度测试的情况下这样做,我会看到多个三角形内面(我不想要):


我如何消除不需要的效果并实现像 Google Sketchup 那样的 X 射线效果

如果我希望所有模型都透明,我应该实现深度排序吗?

我该如何实现:

GS

最佳答案

问题一:

首先,不要禁用深度测试。在混合之前执行深度测试以确保正确丢弃片段,即使启用了混合也是如此。有关每个片段操作及其执行顺序的更多信息,请参阅 第 17.3 节 OpenGL 4.4 核心规范。

当您禁用深度测试时,除非绘制调用的顺序绝对正确,否则您将获得意想不到的结果,从而违背了深度缓冲的真正目的。即使你的顺序是正确的,你也不能期望所有的副作用都会消失,并且试图按照你需要的方式对每个命令进行排序,除了最简单的程序之外,它对任何东西都不起作用。

考虑以下非常简单的示例:

enter image description here

你可以看到 3 个四边形,最远的可视化通常的 tex 坐标空间 (s,t E [0, 1]),一个与后者混合的蓝色四边形,以及一个不透明的红色四边形,它是 应该在前面 .显然,红色四边形不在前面,尽管深度值另有说明。同样明显的是,目的是不将蓝色四边形与红色四边形混合。在蓝色四边形之后渲染红色四边形似乎可以解决问题,但是如果您绘制另一个应该在蓝色和红色四边形后面的四边形,它只会出现在禁用深度测试的顶部。这都是错误的。

enter image description here

黄色四边形遮挡了一切,尽管它应该在红色和蓝色四边形后面。正确的图像如下,它纯粹是通过启用深度测试获得的:

enter image description here

我的一般建议是:除非您有充分的理由禁用深度测试,例如在渲染叠加层并且不想麻烦深度缓冲区时,请启用深度测试。

注:深度缓冲不能解决您通常必须从后到前排列非不透明几何体才能获得正确结果的问题!如果您想在尝试模拟透明度时完全独立于排序,请在众多关于排序独立透明度的论文中寻找常见的嫌疑人。

问题2:

从它的外观来看,我假设您使用以下混合函数:
gl::BlendFunc (gl::ONE, gl::ONE);
或任何导致稳定、连续累积的值,例如
gl::BlendFunc (gl::SRC_ALPHA, gl::ONE);
以及 RGB 和 alpha 分量的默认混合方程:
gl::BlendEquation (gl::FUNC_ADD);
如果不是这种情况,请添加说明实际值的评论,以便我可以重新检查并可能编辑我的建议。以下仍然适用,因为颜色不会说谎。 ;)

您的第二个问题是由于投影下的 z-fighting。有些片段被正确丢弃,有些则没有。由于您显然有在某些地方完全重合的重复面,因此对于一个片段,可能会为第一个面生成略高的深度值。当渲染第二个面时,会生成一个稍低的深度值并且片段通过,导致在实际上应该没有的地方过度绘制。

第一个片段已经完成了所有的魔法,一个混合值被写入帧缓冲区,深度值被写入深度缓冲区,即你有一个通过所有测试并与背景混合的面部片段。现在是第二个片段,它没有被丢弃,因为深度值略低,并再次与帧缓冲区中已经混合的颜色混合。由于添加剂混合,您会得到观察到的结果。我在以下示例中使用您使用的相同颜色和 alpha 值重现了这种情况:

enter image description here

问题三:你的模型似乎有很多重复的面孔,一般来说,三角剖分看起来很可怕。你真的应该重做。理解和使用混合已经足够困难了。不要用次优数据使其复杂化。

关于c++ - 完全透明的OpenGL模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18895431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com