(现代)立方体上的 OpenGL 不同颜色的面 - 使用着色器

(Modern) OpenGL Different Colored Faces on a Cube - Using Shaders

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

我读到为了创建一个具有不同颜色面的立方体,我应该为立方体创建 24 个顶点而不是 8 个顶点 - 换句话说,(我将其想象为 6 个不太接触的正方形).

也许是另一种(更好的?)解决方案来使用真正简单的纹理来为立方体的表面纹理化——平面颜色——也许是 1x1 像素纹理?

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

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

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

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

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

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

此外..

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