opengl - 大纲(OpenGL 2.0)
问题描述
据我所知,有两种方法可以勾勒出一组顶点,使用着色器或使用模板缓冲区。
示例 1:模板缓冲区:在此图像中,img1 的轮廓相互重叠,但您可以更改每个轮廓的颜色。
示例 2:着色器:在此图像中,img2 的轮廓不重叠,但您无法更改每个轮廓的颜色。
有没有办法将这两者结合起来,比如改变每个轮廓的颜色但防止它们重叠?
(也忽略我从我的世界中获取图像的事实)
解决方案
添加轮廓的最简单方法是绘制相同的网格两次:一次正常绘制,一次使用纯色着色器,使用相同的变换(意味着相同的位置,相同的旋转),但稍微放大,并通过更改来翻转其面绘制模型之前的缠绕顺序glFrontFace(GL_CW)
(默认为GL_CCW
- 逆时针方向)。这会在模型周围创建一种“外壳”,只有其背面可见。正面是透明的(剔除)。
模板方法是“屏蔽”框架的一部分。在这里描述得更好。基本上,您启用模板蒙版,绘制模型(它在模板缓冲区中创建一个与模型形状相同的“孔”,以后不绘制片段的位置),然后在框架中再次绘制相同的模型,相同的变换,但略微放大,并带有纯色着色器(例如黄色)。在模板缓冲区中的那个“洞”所在的地方,它会被切割,只留下放大的黄色网格的轮廓部分(或你想要的任何颜色)。
另一种方法是使用有符号距离场 (SDF),通过使用纯色着色器将模型渲染到单独的纹理,然后将其转换为 SDF 并在片段着色器中使用统一来控制放置轮廓的“范围” (例如在 0.0 和 0.05 之间)。零就在模型的边缘,负值在它里面。它通常用于渲染文本,但它可以用于任何东西。该视频解释了它们的工作原理。
所有的轮廓方法都可以让您轻松更改颜色。你想开发一个作弊器吗?如果您无法访问游戏的源代码,我无法帮助您。
推荐阅读
- node.js - 如何在 React + Node 中正确存储信息?
- admob - IOS 中不再报告 admob 点击次数
- vba - VBA 使用 value 来计算避免 activecell.column 的列
- scala - 如何在 Scala 3 / Dotty 中实现 MapK 之类的类型?
- flutter - 有人可以解释为什么浮动操作按钮不起作用。我是新手
- image - 谷歌反向图片搜索
- javascript - 使用传递参数的函数删除 foreach 中的事件侦听器
- c++ - 如何从 Windows 注册表中获取值?
- python - TypeError:在 selenium 中使用 xpath 时,node.ownerDocument 为空
- css - 将 li 元素的样式更改为 V 形