我有一个由许多三角形面定义的曲面。整个表面都有单色。
到目前为止,我分别绘制了每个三角形。对于每个三角形,我传递3个顶点,3个指数,3个颜色值(相同颜色)和3个正常值(均等于三角形的表面法线)。然后我将所有这些数组推送到VBO并渲染曲面。
最近我意识到与渲染的纹理方法相比,这是非常浪费的。现在我用2x2像素数组创建一个纹理(所有颜色都是我想要的曲面)。然后我计算曲面上所有顶点的纹理坐标(s,t)。因此,我有效地拉伸2x2像素纹理以适应我的曲面。对于某些表面,这非常好用。此外,这需要更小的缓冲区(因为现在顶点只有单个法线和颜色值,因此它们只需要提到一次)。然而,通过这种方法,有时弯曲表面根本不会呈现。我的怀疑是我计算纹理坐标的方式。如果表面略微弯曲,那就没关系,但是当表面围绕轴旋转并形成闭合边界时,纹理坐标似乎会混淆图形卡。
我的问题是,在OpenGL ES中推荐使用单色绘制表面的方法是什么?
更新 - 接受答案的说明
我花了一些时间来了解genpfault的答案是如何运作的。所以这是一个解释。上面我描述了两种绘制普通彩色表面的方法 - 1.使用rgba颜色值,2。使用具有单一颜色的纹理。 genpfault的答案解释了如何有效地完成方法1.
我通过多次传递每个顶点相同的rgba颜色值来实现第一种方法。因此,我在顶点着色器代码中将此颜色值作为属性读取。在genpfault的方法中,我们在调用drawArray / Elements之前将颜色设置为一个统一变量。这将需要更改顶点着色器以从统一变量而不是属性中读取值。