全透明OpenGL模型

2023-12-06

解释一下我做错了什么。我已将 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));

If i use

glEnable(GL_ALPHA_TEST);
glEnable( GL_BLEND );
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glEnable(GL_DEPTH_TEST);
glClearDepth(1.0); 

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

If i do it without depth test i see multiple triangless inside faces (which i don't want):

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

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

我怎样才能实现这个:

GS


问题一:

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

当你禁用深度测试时,你会得到意想不到的结果unless绘制调用的顺序是绝对正确的,因此违背了深度缓冲的目的。即使您的顺序正确,您也不能指望所有副作用都会消失,并且尝试按照您需要的方式对每个命令进行排序,除了最简单的程序之外,它对任何其他命令都不起作用。

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

enter image description here

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

enter image description here

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

enter image description here

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

Note:深度缓冲并不能解决你通常必须安排的问题不透明的从后到前的几何图形以获得正确的结果!如果您想在尝试模拟透明度时完全独立于顺序,请在以下许多论文中寻找常见的嫌疑人顺序独立的透明度.

问题2:

从它的外观来看,我假设您使用以下混合函数:

gl::BlendFunc (gl::ONE, gl::ONE);

或任何能够导致稳定、连续的价值观积累的事物,例如

gl::BlendFunc (gl::SRC_ALPHA, gl::ONE);

以及 RGB 和 alpha 分量的默认混合方程:

gl::BlendEquation (gl::FUNC_ADD);

如果情况并非如此,请添加一条评论,说明实际值,以便我可以重新检查并可能编辑我的建议。以下内容仍然适用,因为颜色不会说谎。 ;)

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

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

enter image description here

问题3:你的模型似乎有很多重复的面孔,而且一般来说,三角测量看起来很糟糕。你真的应该重做一次。理解和使用混合本身就已经足够困难了。不要用次优数据使其复杂化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

全透明OpenGL模型 的相关文章

  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif

随机推荐

  • 我可以使用 allocate 来复制对象的对象吗?

    我有一个从 TPersistent 三级继承的对象 我想使用Assign程序 MyFirstObj GrandSonOfPersistent Create I modify the objects inside MyFirstObj MyS
  • 如何使用GridBagConstraints创建布局?

    我想像这样布局我的 JPane 这样 顶部部分比底部部分更大 更高 顶部部分由另一个 JPanel 组成 并使用 Graphics 对象来显示图像 而底部部分也由另一个 JPanel 组成 但使用 Graphics 对象来绘制一些线条和文字
  • sqlite是否缓存查询结果以进行优化?

    我在 sqlite 中注意到了这种行为 当我重新使用游标对象时 任务管理器中的工作集内存不断增加 直到我的程序抛出内存不足异常 我重构了代码 以便每次查询时我都会打开一个到 sqlite 文件的连接 查询我想要的内容 然后关闭连接 后者似乎
  • 如何从 Wix 安装程序将自签名 SSL 证书安装到商店中?

    我找不到任何有关如何针对当前版本的 Wix Toolset 3 11 1 2318 执行此操作的文档 鉴于我有一个cert cer文件在我的SourceDir and INSTALLDIR如何在安装时将其放入 Windows 受信任的根证书
  • 无法读取 dotnet core 中链接的 appsettings.json 文件中的值

    在一个 aspnetcore 2 0 项目中 我尝试在我的 Web 应用程序和几个 xunit 测试项目中设置一个共享的 appsettings json 文件 首先 当我 定期 将 appsettings json 单独添加到我的项目中时
  • 定期 JobScheduler 不尊重约束

    使用JobScheduler 我设置了一个简单的JobService如下 TargetApi 21 public class SimpleJobService extends JobService private static final
  • wxpython菜单栏不显示

    我正在尝试使用 wxpython for gui 编写一个时间表程序 并使用 wxpython wiki 上的入门教程来加快 wxpython 的速度 但是当我尝试向 wxFrame 添加菜单栏时 菜单栏不显示 有什么想法为什么会发生这种情
  • 如何在 Intel 环形和网状架构上选择引导处理器 (BSP)

    第2 13 2节提到仲裁 ID 用于确定哪个处理器首先发出无操作周期 我在多个来源和英特尔手册上看到了这一点 引用 MP 初始化序列的英特尔手册仅在存在 系统总线 时以及在此之前最初存在 APIC 总线 时解决 Pentium 4 我的印象
  • 在 iOS (Flutter) 中使用 Firebase 和 Geolocator(或任何 Swift 插件)构建错误

    我正在尝试创建一个使用 Firebase 和 Geolocator 插件的 flutter 应用程序 我将使用的 Firebase 插件认证 使用RTDB and FCM The 地理定位器显然是一个非常可靠的位置感知插件 在 Androi
  • 如何在 Windows 上通过内置命令使用 subprocess.Popen

    在我的旧 python 脚本中 我使用以下代码来显示 Windows cmd 命令的结果 print os popen dir c read 正如 python 2 7 文档所说os popen已经过时并且subprocess被推荐 我按照
  • 实例成员“view”不能在类型“GameScene”上使用

    我最近更新到 Xcode 7 Beta 现在收到一条错误消息 实例成员 视图 无法在第 5 行的 GameScene 类型上使用 有人知道如何解决此问题吗 另外 如果您想提供额外帮助 请参阅我的另一个问题 ConvertPointToVie
  • 在智能卡上上传 .cap 文件?

    我有一张新卡 其 ATR 代码如下 3B 68 00 00 00 73 C8 40 12 00 90 00 我在谷歌上搜索了这张ATR 最后我知道这是一张 巴西电子公积金卡 问题是我该如何使用这张卡 我的意思是它支持哪些 APDU 有它的数
  • PHP - 使用表单输入中的 id 制作 switch 语句

    我正在用 PHP 做一个简短的测验 根据 4 个是 否问题告诉你你想到的生物是什么 我这样做是为了根据您对每个问题的回答 您会遇到不同的问题 我主要使用 switch 语句来完成此操作 我的问题是有什么方法可以使用条件作为表单提交按钮的 i
  • Flutter 蓝牙热敏打印机集成

    我有一个 flutter 食品配送应用程序 除此之外 我还有一个单独的餐厅应用程序 我可以在其中接受和拒绝订单 我很长一段时间以来一直在尝试做一些事情 以便当餐厅接受订单时 蓝牙热敏打印机会自动打印出一张收据 我找到了很多代码 但我不明白如
  • Powershell:将 pracl 命令的输出通过管道传输到数组

    pracl 是一个 sysinternal 命令 可用于列出目录的 ACL 我有一个共享列表 我想创建一个 csv 文件 这样对于每个 ACL 条目 我希望共享路径位于一列中 共享权限位于下一列中 我试图通过使用以下代码来做到这一点 inp
  • 数组到 SVG,使用 PHP 的灵活算法

    问题 我有几个不同的数组 例如 0 21 0 001 0 0245 0 31 0 05 1234 1342 1232 1625 2200 2205 1804 5 12 42 2 32 42 my problem now is I m loo
  • 在 Python 中索引浮点值

    我有一个从数据结构生成的浮点数列表 它是一个字典列表 即我已经迭代了整个列表并选择了给定字典中的某些值 现在 我想实际对这些数据点做一些事情 为此我需要对原始位置的一些参考 我尝试简单地使用数据点作为关键 但在尝试和失败之后 我进行了一些挖
  • Google VR Unity Divider、设置和后退按钮隐藏在 v0.9 中

    有谁知道如何禁用最新的 google vr sdk for unity 中的分隔符 设置和后退按钮 我尝试将 NativeUILayerSupported 设置为 false 并将返回值放入旧的 DrawUILayer 中 但它仍然显示 看
  • Web Api - 使用 [FromBody] 属性和 POST 方法时操作参数为空

    我有这个控制器 但我不明白为什么name参数为空 public class DeviceController ApiController HttpPost public void Select FromBody string name pr
  • 全透明OpenGL模型

    解释一下我做错了什么 我已将 3D 模型加载到自编码的 opengl 渲染 v 3 3 中 并尝试使用顶点着色器使其像 xray 效果一样透明 version 330 attribute vec3 coord3d attribute vec