- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找一种用颜色“填充”三维几何体的方法,并且很可能在稍后的某个时间填充纹理。
假设你可以将头撞到混凝土墙上,从逻辑上讲你只会看到黑暗。然而,在 OpenGL 中,当您执行此操作时,由于剔除以及几何图形的绘制方式,世界自然是中空且透明的。我想模拟其中的黑暗/颜色/纹理。
我知道有些游戏通过将纹理/颜色直接覆盖在HUD上来实现这一点——从而使玩家失明。
还有其他方法可以做到这一点吗?假设玩家半站在水中;他们可以看到部分海浪下方的情况。您将如何填充它以防止他们能够清楚地看到现在屏幕一半的下方?
这个概念叫什么?
最佳答案
相机前纹理方法的一个问题是纹理是 2D,但您想要可视化 3D 体积的切片。对于您谈论的第一件事,即“头在墙内”的想法,我将向您介绍“3D/体积纹理”。对于半站在水中,您需要“体积渲染”和“吸收”(由@user3670102讨论)。
这里的总体思路是你有一些函数可以定义 3D 空间中各处的颜色,而不仅仅是在表面上(与常规纹理映射一样)。这很好,因为您可以将几何图形放置在任何位置,并根据 3D 位置在片段着色器中为其着色。想象一下对体积进行切片并查看交叉点的颜色。
对于“头撞墙”效果,您可以在玩家前面绘制一个全屏多边形(就在近裁剪平面上,尽管您可能希望将其向前推一点,使其不会太小)并且基于 3D 函数为其着色。现在,它看起来非常坚固,并且可以移动玩家的 Action ,而不是像您廉价地将纹理贴在屏幕上一样。
实际的函数可以用 3D 纹理来定义,但这非常占用内存。相反,您可以研究任一程序 3D 颜色(例如,程序木材或砖着色器很常见)。即使假设 2D 纹理是通过体积“挤出”的,或者更好的是,根据您正在绘制的交叉点/表面的角度对 3 个纹理(每个轴一个)进行加权。
检测与几何体和近剪裁平面的相交可能是这里最难的部分。如果我是你,我会研究 z 缓冲区的技巧,并确保将所有内容绘制为实体非自相交几何体。一个简单的想法可能是仅在绘制带有正面的所有内容后才绘制背面。如果您可以看到背面,则近平面的部分一定位于某物内部。对于这些像素,您可以计算世界空间中的近剪裁平面位置并应用 3D 纹理。尽管我怀疑有比将所有内容绘制两次更快的方法。
实际上,您所看到的内容可能没有光线,它应该是黑色的,但我想忽略这一点并直接渲染颜色,不发光。
这听起来比实际困难得多。如果你有一些透明的固体,它都是一种颜色(“同质”),那么它会消除光线,进一步的光线必须穿过它。考虑许多 alpha 透明表面,取极限,你就得到了指数。剩余的光线接近 1/exp(dist)
或 exp(-dist)
。谷歌“啤酒定律”。来自 here ,
vec3 Absorbance = WaterColor * WaterDensity * -WaterDepth;
vec3 Transmittance = exp(Absorbance);
查找某物距离的一个好方法是使用着色器通过附加混合来渲染背面(或海底/水底),该着色器绘制到浮点纹理的距离。然后切换到减色混合并渲染所有正面(或水面)。您将得到一个包含上述方程的距离/深度的纹理。
结合这两种想法,该 Material 是透明的固体,但颜色(可能还有密度)在整个体积中变化。如果您有大量数据并且希望速度更快,这就会变得非常复杂。渲染此效果的一种直接方法是通过 3D 纹理(或程序函数,无论您使用什么)对光线进行数字积分,同时应用吸收函数。基本的强力欧拉积分可能会为近平面上的每个像素启动一条光线,然后以均匀的距离向前行进。当你行进的每一步中,你假设颜色保持不变并应用吸收,记录你还剩下多少光。快速谷歌显示this .
关于OpenGL/OpenTK 填充内部空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29741899/
这是顶点着色器: uniform mat4 projection; uniform mat4 view; uniform mat4 model; void main(void) { gl_Po
我有一个问题,我是需要二次幂 (POT) 纹理并且似乎无法使用 NPOT 的幸运者之一。 通常,这不会让我太烦恼,因为我只会确保我需要使用的任何纹理都是 POT。但是,我在尝试将光标 X 和 Y 位置
我最近在我的游戏中实现了视锥体剔除,并且为了从渲染周期中挤出最后一滴,我还决定实现遮挡剔除。它工作得很好,但是,我很痛苦地发现,如果我不看游戏中的任何东西(如果我向虚空看,远离我的游戏对象),我的显卡
我正在寻找一种用颜色“填充”三维几何体的方法,并且很可能在稍后的某个时间填充纹理。 假设你可以将头撞到混凝土墙上,从逻辑上讲你只会看到黑暗。然而,在 OpenGL 中,当您执行此操作时,由于剔除以及几
警告:总的 OpenGL/TK 新手,请善待。我可能咬得太多了。 规范: 2017 年 Visual Studio 社区 C# .Net 4.6.1(使用 WPF、WindowsFormsHost 控
我正在寻找一种跨平台(Win 和 MacOS)方法来检测 C# 中 OpenGL 应用程序的按键。 以下有效,但仅适用于字母数字字符。 protected override void OnKeyPre
我在 http://viewport3d.com/trackball.htm 上使用教程编程轨迹球。我计算了轴和角度,但因为我只是 OpenTK 和 OpenGL 的初学者,所以我不知道如何将旋转应用
我有两张图片。我必须找到第一张图像中强度大于 0.8 的点。同时,我必须在相同点上找到第二张图像的强度,并且需要使用阈值/ slider 值(范围从 0 到 1)调整相同点上第二张图像上的光线。我做了
有没有人知道如何使用 OpenTK 框架滚动(动画化)2D 文本,或者在哪里可以找到一些好的示例。我需要新闻电视 channel 底部(顶部)滚动代码之类的东西。 谢谢。 最佳答案 有许多可能的文本渲
尝试制作游戏,但纹理从未出现在屏幕上。 只为四边形使用颜色是可行的,但是当我尝试为四边形添加纹理时,它只是显示为黑色方 block 。 基本片段着色器: #version 300 es precisi
有没有办法在另一个线程中使用 OpenTK/OpenGL 绘制到屏幕上?我尝试使用的代码是 GL.Clear(ClearBufferMask.ColorBufferBit); GL.ClearColo
它是 tao 框架中已弃用的 OpenTK.Graphics.Glu 的替代品吗?尤其是对几何渲染的需求。 最佳答案 OpenTK 是 Tao 的演变。而且,老实说,我没有听说过 glut 被贬低了。
我是 opengl 的新手,我正在努力让 stencilbuffer 为一个简单的案例工作;我有两种纹理,一种是位图,另一种是“ mask ”,我试图用它来隐藏位图中的某些部分。 我似乎无法让它工作,
我正在尝试在我的 OpenTK 项目中旋转 2D 对象。 发生的事情是旋转对象之后的对象正在旋转,我不希望它们这样做。 我已经旋转了一个对象后如何重置旋转? protected overr
我正在为 OpenGL 和 C# 使用 OpenTK。 我需要使用模板缓冲区,目前想知道如何设置 StencilBuffer 深度。 我之前知道的是 TaoFramework,它的控件具有可以设置此深
我在进行视锥体剔除的方式上遇到了一些问题。当前的方法确实解决了剔除问题,但效果确实很奇怪。当我离我的主要父对象太近时,我正在使用场景图来渲染所有内容,对象开始非常快速地闪烁。当我离开时,它就消失了。我
我正在使用 OpenTK 和 C#,我在 3D 空间中定义了一个平面,如下所示: GL.Begin(BeginMode.Quads); GL.Color3(Color.Magenta); GL.Ver
我不确定为什么这段代码不是简单地在屏幕上绘制一个三角形(正交)。我正在使用与 OpenGL 1.1 相同的 OpenTK 1.1。 List simpleVertices = new List();
我正在尝试找到一种方法来使窗口始终位于顶部。 (必须是窗口模式)我目前正在使用 OpenTk.NetCore 库在 .net 核心中制作一个窗口。是否可以使用 OpenTk 将此窗口保持在顶部或是否有
我目前正在开发一款使用 OpenTK 进行渲染的游戏; C#、.Net 4.0、OpenGL 2。 在 1280x1024 分辨率下最大化运行(不是全屏,而是占用所有可用的屏幕空间),我看到平均帧率为
我是一名优秀的程序员,十分优秀!