OpenGL ES20 - Wavefront - > glDrawElements - >没有金字塔,但形状怪异?

时间:2014-03-13 13:40:24

标签: android opengl-es-2.0 wavefront

编辑2:

解决方案:复制粘贴错误:将颜色缓冲区作为位置缓冲区发送。


解析代表金字塔的.obj(波前),在需要的地方进行三角测量,将其全部传递到缓冲区。缓冲区如下所示:

顶点缓冲区:

private FloatBuffer mPositionBuffer = null;
// from looping through buffer + print:
#0 = -0.5, 0.0, -0.5
#3 = 0.5, 0.0, -0.5
#6 = 0.5, 0.0, 0.5
#9 = -0.5, 0.0, 0.5
#12 = 0.5, 0.0, 0.5
#15 = 0.5, 0.0, -0.5
#18 = 0.0, 1.0, 0.0
#21 = 0.5, 0.0, -0.5
#24 = -0.5, 0.0, -0.5
#27 = 0.0, 1.0, 0.0
#30 = -0.5, 0.0, -0.5
#33 = -0.5, 0.0, 0.5
#36 = 0.0, 1.0, 0.0
#39 = -0.5, 0.0, 0.5
#42 = 0.5, 0.0, 0.5
#45 = 0.0, 1.0, 0.0

色彩缓冲:

private ByteBuffer mColorBuffer = null;
#0 = 1, 1, 1, 1
#4 = 1, 1, 1, 1
#8 = 1, 1, 1, 1
#12 = 1, 1, 1, 1
#16 = 1, 1, 1, 1
#20 = 1, 1, 1, 1
#24 = 1, 1, 1, 1
#28 = 1, 1, 1, 1
#32 = 1, 1, 1, 1
#36 = 1, 1, 1, 1
#40 = 1, 1, 1, 1
#44 = 1, 1, 1, 1
#48 = 1, 1, 1, 1
#52 = 1, 1, 1, 1
#56 = 1, 1, 1, 1
#60 = 1, 1, 1, 1

正常缓冲液:

private FloatBuffer mNormalBuffer = null;



#0 = 0.0, 0.0, 0.0
#3 = 1.0, 0.0, 0.0
#6 = 1.0, 1.0, 0.0
#9 = 0.0, 1.0, 0.0
#12 = 0.0, 0.0, 0.0
#15 = 1.0, 0.0, 0.0
#18 = 0.5, 1.0, 0.0
#21 = 0.0, 0.0, 0.0
#24 = 1.0, 0.0, 0.0
#27 = 0.5, 1.0, 0.0
#30 = 0.0, 0.0, 0.0
#33 = 1.0, 0.0, 0.0
#36 = 0.5, 1.0, 0.0
#39 = 0.0, 0.0, 0.0
#42 = 1.0, 0.0, 0.0
#45 = 0.5, 1.0, 0.0

指数缓冲区:

private ShortBuffer mIndexBuffer = null;
#0 = 0, 1, 3
#3 = 1, 2, 3
#6 = 4, 5, 6
#9 = 7, 8, 9
#12 = 10, 11, 12
#15 = 13, 14, 15

在我的脑海中组合顶点+面部时,它等于金字塔,就像它应该的那样。简单的模型。 我的描述如下:

// data above are put in these buffers





    mColorBuffer.position(0);
    mNormalBuffer.position(0);
    mIndexBuffer.position(0);
    mPositionBuffer.position(0);

    GLES20.glVertexAttribPointer(mShader.getGLLocation(BaseShader.A_POSITION), 3, GLES20.GL_FLOAT, false,
            0, mColorBuffer);

    GLES20.glEnableVertexAttribArray(mShader.getGLLocation(BaseShader.A_POSITION));

    GLES20.glVertexAttribPointer(mShader.getGLLocation(BaseShader.A_COLOR), 4, GLES20.GL_BYTE, false,
                0, mColorBuffer);

    GLES20.glEnableVertexAttribArray(mShader.getGLLocation(BaseShader.A_COLOR));

    GLES20.glVertexAttribPointer(mShader.getGLLocation(BaseShader.A_NORMAL), 3, GLES20.GL_FLOAT, false,
                0, mNormalBuffer);

    GLES20.glEnableVertexAttribArray(mShader.getGLLocation(BaseShader.A_NORMAL));

    Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);
    GLES20.glUniformMatrix4fv(mShader.getGLLocation(BaseShader.U_MVPMATRIX), 1, false, mMVPMatrix, 0);
    GLES20.glDrawElements(GLES20.GL_TRIANGLE_FAN, mIndexBuffer.capacity(), GLES20.GL_UNSIGNED_SHORT, mIndexBuffer);

但是有一个对象,它看起来并不像金字塔,结果是“摇摇欲坠”,即如果我翻译它(没有旋转,但代码看起来像这样(并且在绘图之前执行) ):

    Matrix.translateM(mModelMatrix, 0, mTranslation[0], mTranslation[1], mTranslation[2]);
    Matrix.scaleM(mModelMatrix, 0, mScale[0], mScale[1], mScale[1]);

    Matrix.rotateM(mModelMatrix, 0, mRotation[0], 0, 1, 0);
    Matrix.rotateM(mModelMatrix, 0, mRotation[1], 1, 0, 0);
    Matrix.rotateM(mModelMatrix, 0, mRotation[2], 0, 0, 1);
    Matrix.multiplyMM(mMVMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);

向我看,好像指数没有正确传输?不幸的是,只有一个金字塔的边被绘制。

我是否必须为glDrawElements函数使用其他值?如果需要,我可以发布翻译动画的屏幕截图或屏幕截图。非常感谢您的帮助!

编辑:

如果这与它有关:

我在说这些:

    GLES20.glClearColor(0, 0, 0, 1);
    GLES20.glEnable(GLES20.GL_DEPTH_TEST);
    GLES20.glDepthFunc(GLES20.GL_LEQUAL);

1 个答案:

答案 0 :(得分:1)

我不太确定,但它看起来像是一个淘汰问题(你有没有设置剔除?我不知道什么是默认值)。 ...你还确定GL_TRIANGLE_FAN是你的指数排列的吗?看起来更像是GL_TRIANGLE_STRIP安排。

编辑: 现在我看看你的顶点,我认为你需要使用GL_TRIANGLES,所以我第一次错了。对不起。

现在让我们看一下不同索引排列如何工作的示例:让我们采用最简单的三维形式,一个四面体。还可以使用一些非常简单的坐标,您可以根据需要选择它们:

(0,0,0, // point0
,1,0,0, // point1
,0,1,0, // point2
,0,0,1) // point3

这样我们就会得到一个带有4组坐标的12长数组,现在我们的指数如果我们使用GL_TRIANGLE_STRIP就会看起来如何:

(0,1,2,3,0,1) 

这意味着我们绘制第一个三角形 - (0,1,2),然后在(3)旁边添加一个三角形,然后返回到(0),依此类推。

如果我们使用GL_TRIANGLES,则会出现以下情况:

(0,1,2,
2,1,3,
3,1,0,
0,2,3)

正如您在GL_TRIANGLES中看到的那样,我们只是在没有订单的情况下一个接一个地列出三角形。 (我已经选择那些逆时针方式,不确定这是否是默认的剔除值)

在你的情况下,似乎你有重复的顶点,所以墙可以有正常的法线,看起来平坦。因此,即使它们与下一个墙重合,每个墙也有不同的顶点。同样,我的建议是留下一个三角形 - 三个顶点,三个索引,并逐个添加更多,直到你得到完整的数字。