opengl-es - 如何在 OpenGL ES 中绘制纯色曲面?

标签 opengl-es 3d texture-mapping

我有一个由多个三角形面定义的曲面。整个表面为单色。

到目前为止,我分别绘制了每个三角形。对于每个三角形,我传递了 3 个顶点、3 个索引、3 个颜色值(相同颜色)和 3 个法线值(全部等于三角形的表面法线)。然后我会将所有这些数组推送到 VBO 并渲染曲面。

最近我意识到,与纹理渲染方法相比,这是相当浪费的。现在,我用 2x2 像素阵列创建纹理(所有颜色与我想要的曲面颜色相同)。然后我计算曲面上所有顶点的纹理坐标 (s,t)。因此,我有效地拉伸(stretch) 2x2 像素纹理以适合我的曲面。对于某些表面来说,这非常有效。此外,这还需要更小的缓冲区(因为现在顶点只有单个法线值和颜色值,因此只需提及一次)。然而,通过这种方法,有时曲面根本不渲染。我的怀疑在于我计算纹理坐标的方式。如果表面稍微弯曲是可以的,但是当表面绕轴旋转并形成闭合边界时,纹理坐标似乎会混淆显卡。

我的问题是,OpenGL ES 中使用单一颜色绘制表面的推荐方法是什么?

更新 - 接受答案的说明

我花了一段时间才理解 genpfault 的答案是如何工作的。所以这里有一个解释。上面我描述了绘制纯色表面的两种方法 - 1. 使用 rgba 颜色值,2. 使用单色纹理。 genpfault 的回答解释了如何有效地执行方法 1。

我通过多次传递每个顶点相同的 rgba 颜色值来实现第一种方法。因此,我在顶点着色器代码中读取此颜色值作为属性。在genpfault的方法中,我们在调用drawArray/Elements之前将颜色设置为统一变量。这将需要更改顶点着色器以从统一变量而不是属性中读取值。

最佳答案

只需通过glColor()设置当前颜色在渲染每个补丁之前。

这样您就不必传入每个顶点的颜色组件。

关于opengl-es - 如何在 OpenGL ES 中绘制纯色曲面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6815066/

相关文章:

java - 如何计算一个长方体与其相邻长方体的接触面积

android - 渲染一个正方形

ios - gl_PointSize OpenGLES 说明

javascript - Three.js - 地面/地板上的反射

silverlight - Windows Phone 7 中使用 Silverlight 的 3D 模型

javascript - Three.js MeshBasicMaterial 无法按预期工作

opengl - 如何使用 GL_REPEAT 仅重复选择纹理图集? (OpenGL)

iphone - 如何在OpenGL应用程序中响应didReceiveMemoryWarning

android - OpenGL ES 2.0 是否需要着色器来进行任何顶点渲染?

opengl - 在OpenGL中将纹理映射为具有正方形纹理的梯形