【问题标题】:Drawing face colors with array glDrawElements OpenGL ES 2.0使用数组 glDrawElements OpenGL ES 2.0 绘制面颜色
【发布时间】:2014-04-27 22:32:02
【问题描述】:

我使用 Blender 和 .obj.mtl 为 android OpenGL ES 2.0 导出文件

下图描述了我想用顶点和面绘制的内容..

ObjParse obje = new ObjParse(context,R.raw.sample_obj,R.raw.sample_mtl);
float[] koordinates = obje.getVertexKoordinates();
byte[] indicies = obje.getIndicies();
float[] colors = obje.getColors();

这段代码给我带来了一些用于绘图的数组数据。 我制作了FLoatBufferByteBuffer 这个数组..

GLES20.glVertexAttribPointer(position, 3, GLES20.GL_FLOAT, false, stride,floatBufKoor);
GLES20.glEnableVertexAttribArray(position);
GLES20.glVertexAttribPointer(color, 4, GLES20.GL_FLOAT, false, stride, floatBufColors);
GLES20.glEnableVertexAttribArray(color);

GLES20.glDrawElements(GLES20.GL_TRIANGLES,cizilecek,GLES20.GL_UNSIGNED_BYTE,byteBufIndicies);

最后我得到了渐变色,但我想要每个面的纯色.. 我该怎么做?

编辑:

当我编译应用程序时,我得到了这个截图:

【问题讨论】:

  • 你的截图和这个问题有什么关系?那些是平坦的阴影,几乎正是你所说的你想要的。 .obj 格式也允许您在每个顶点上拥有离散的颜色。 v3 可以在所有这些形状之间共享,但它会在 1 个位置有 3 种不同的颜色,这可能是您没有正确解析文件。
  • 这一切都取决于您使用的着色器,如果您使用照明。关于渐变,你是什么意思?你能分享一下你得到的结果的截图吗?
  • @AndonM.Coleman 解析.obj 文件我得到了一个由.mtl 文件生成的浮点数,只有无阴影颜色信息。我如何解析单个面色?
  • @MaurizioBenedetti 我编辑并添加了截图到问题

标签: android opengl-es opengl-es-2.0


【解决方案1】:

有一种有限的方法可以通过三角形(如 Blender 中所示)而不是顶点(如下图所示)为 glDrawElements 网格的面着色:

  1. 将位置属性作为 vec4 而不是 vec3 传递,对 float[] 坐标使用步幅 4。
  2. 将每个顶点的第四个 (w) 值设置为与每种颜色对应的“字典”值。例如。 0.0f = 黄色,0.5f = 红色,1.0f = 白色。 中间值将是“默认值”。
  3. 在顶点着色器中,将 w 值作为变量传递给片段着色器,然后在执行透视等矩阵变换之前将 w 重置为 1.0。由于插值,请使用 0.5f。
  4. 在片段着色器中,将变化值与固定值进行比较,并将片段颜色设置为预定义值,然后再执行着色调整。

您可以使用更多创意(二进制掩码?)来索引更多颜色,但每个策略仅限于使用单个 w 作为颜色(不能在 ES2.0 中的 glDrawElements 中使用 mat3 作为属性) .您还可以将 float[] 颜色(每种颜色只有一个条目)作为统一的 vec3 数组传递,并从那里读取颜色值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 2014-07-27
    • 2015-04-08
    • 2012-09-29
    • 1970-01-01
    • 2012-11-10
    相关资源
    最近更新 更多