【问题标题】:(Modern) OpenGL Different Colored Faces on a Cube - Using Shaders(现代)立方体上的 OpenGL 不同颜色的面 - 使用着色器
【发布时间】:2015-11-08 03:28:01
【问题描述】:

在中间模式下具有不同颜色面的立方体非常简单。但是用着色器做同样的事情似乎是一个很大的挑战。

我已经读过,为了创建一个具有不同颜色面的立方体,我应该为立方体创建 24 个顶点而不是 8 个顶点 - 换句话说,(我将其可视化为 6 个不完全接触的正方形)。

也许是另一种(更好的?)解决方案,使用真正简单的纹理来纹理立方体的面,纯色 - 也许是 1x1 像素纹理?

我的纹理想法对我来说似乎更简单 - 从编码人员的角度来看..但从 GPU/显卡的角度来看,哪种方法最有效?

【问题讨论】:

  • 你能详细说明你的纹理创意吗?我不清楚使用单色单像素纹理如何帮助您在立方体的每一侧使用不同的颜色。 (例如,你会将六个面分解为六个不同的绘制调用吗?)
  • @Kaganar:我可能会提出一些不可能的事情,因为我以前没有玩过纹理。我所知道的是,纹理(某种位图图像)通常会转换为 3D 面。所以如果该位图是一种单一颜色的图像,那么也许这可以工作?

标签: opengl shader cube


【解决方案1】:

我不确定您的总体目标是什么(例如,您要长期学习做什么)​​,但通常对于高性能应用程序(例如游戏),您的目标是减少 GPU 负载。每次切换某些状态(例如更改纹理、渲染目标、着色器统一值等)时,GPU 都会停止重新配置以满足您的需求。

因此,您可以为每个面传递一个 1x1 像素的纹理,但是您需要六个绘制调用(通常不是那么糟糕,但有一些准备工作和潜在的缓存未命中)和六个纹理集(可以是非常糟糕,通常与更改着色器统一值一样糟糕)。

假设您想传入一个纹理并将其用作立方体的纹理贴图。这并不像听起来那么简单——您需要以一种映射到顶点的方式来表达纹理上的每个纹理面。通常您需要为每个顶点传递一个纹理坐标,并且由于纹理的空间配置,这通常不会最终意味着一个空间顶点的一个纹理坐标。

但是,如果您使用environmental/reflection map,则可以为您处理映射的复杂性。通过这种方式,您可以在立方体的所有侧面绘制单个纹理。 (或者在你的球体上,或者你想要的任何球体映射形状。)我不确定我是否会更容易地调用它,因为你必须仔细地形成环境纹理,并且你仍然必须为每种新颜色设置不同的纹理您想通过 GPU 或与 GPU 同步来表示或更改纹理,这很棘手,而且通常性能不佳。

这让我们回到了您提到的规范做法:使用顶点值——它们很快,您可以通过仅指定不同的顶点数据非常快速地绘制很多很多立方体,而且很容易理解。这确实是最好的方法,而且 GPU 的设计目的是快速运行。

另外..

是的,你可以只用着色器来做到这一点......但它会很丑而且很慢,而且 GPU 最终会按每个像素计算它......将对象空间坐标传递给片段着色器,然后在片段着色器测试您在哪一侧并输出相应的颜色。强烈不推荐,它不是特别容易,而且对于 GPU 来说肯定不会更快 - 改变颜色你最终会再次改变着色器的统一值。

【讨论】:

  • 谢谢 - 我会坚持使用顶点。我正在尝试从一个旧的(90 年代)3D 游戏中获取模型,该游戏根据顶点、顶点索引(面)和面颜色来描述对象。我必须首先将所有遗留对象顶点转换为更多顶点(例如,获取 8 个立方体顶点的列表,创建 4 个顶点和一组新的面顶点定义)。我希望有一种更简单的方法可以用单一颜色为简单图形对象的面着色。
猜你喜欢
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多