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

时间:2015-11-08 03:28:01

标签: opengl shader cube

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

假设您想传入一个纹理并将其用作多维数据集的纹理贴图。这听起来有点微不足道 - 你需要以映射到顶点的方式表达纹理上的每个纹理面。通常你需要传递每个顶点的纹理坐标,并且由于纹理的空间配置,这通常不会意味着一个空间顶点的一个纹理坐标。

但是,如果使用environmental/reflection map,则会为您处理映射的复杂性。这样,您可以在多维数据集的所有边上绘制单个纹理。 (或者在你的球体上,或者你想要的任何球形映射的形状。)我不确定我会称之为更容易,因为你必须小心地形成环境纹理,你仍然需要为每种新颜色设置不同的纹理你想表示 - 或者通过GPU或者与GPU一起改变纹理,这很棘手,而且通常不具备性能。

这让我们回到你所提到的规范的做法:使用顶点值 - 它们很快,你可以通过仅指定不同的顶点数据非常快速地绘制许多立方体,并且它很容易理解。这真的是最好的方式,以及GPU如何设计为快速运行。

此外..

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