【问题标题】:glDrawElements display issueglDrawElements 显示问题
【发布时间】:2016-12-13 19:25:33
【问题描述】:

我想在 openGL ES 2 中用纹理绘制对象(立方体),但得到了奇怪的结果(就我而言)。

我想要绘制的对象 - 从 FBX 文件中提取并具有类似的数据(我也可以提取法线,但我不使用它们,所以跳过):

----Indices----24
0
1
2
3
4
7
6
5
0
4
5
1
1
5
6
2
2
6
7
3
4
0
3
7

----Coordinates(Vertises)----72
1 1 -1 
1 -1 -1 
-1 -1 -1 
-1 1 -1 
1 0.999999 1 
-1 1 1 
-1 -1 1 
0.999999 -1 1 
1 1 -1 
1 0.999999 1 
0.999999 -1 1 
1 -1 -1 
1 -1 -1 
0.999999 -1 1 
-1 -1 1 
-1 -1 -1 
-1 -1 -1 
-1 -1 1 
-1 1 1 
-1 1 -1 
1 0.999999 1 
1 1 -1 
-1 1 -1 
-1 1 1 

----Texture UV----48
0.499999 9.7692e-05
0.499999 0.333364
0.250049 0.333364
0.250049 9.78112e-05
0.250049 0.666633
0.499999 0.666633
0.499999 0.9999
0.250049 0.9999
0.74995 0.333366
0.74995 0.666633
0.5 0.666633
0.5 0.333367
0.499998 0.333366
0.499998 0.666632
0.250048 0.666633
0.250048 0.333366
0.25005 0.333367
0.25005 0.666633
0.000100091 0.666633
0.000100024 0.333367
0.749953 0.666639
0.749953 0.333373
0.999903 0.333373
0.999903 0.666639

所以我绑定了缓冲区:

- (void)bindBuffer
{
    glGenVertexArraysOES(1, &_vertextArray);
    glBindVertexArrayOES(_vertextArray);
    //vertises
    glGenBuffers(1, &_vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * _drawModel.numberOfVertices, _drawModel.vertices, GL_STATIC_DRAW);

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, NULL);
    //textures
    glGenBuffers(1, &_indexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, _indexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * _drawModel.numberOfTextCoords, _drawModel.texCoords, GL_STATIC_DRAW);

    glEnableVertexAttribArray(attributes[ATTRIBUTES_TEXTURE_COORDINATE]);
    glVertexAttribPointer(attributes[ATTRIBUTES_TEXTURE_COORDINATE], 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 2, NULL);
    //indises
    glGenBuffers(1, &_indisesBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indisesBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * _drawModel.numberOfIndises, _drawModel.indises, GL_STATIC_DRAW);

    glBindVertexArrayOES(0);
}

画出来

- (void)draw
{
    glDisable(GL_DEPTH_TEST);
    glDepthMask(GL_FALSE);
    glDisable(GL_CULL_FACE);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glClearColor(0.65f, 0.65f, 0.65f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glUseProgram(_programm);
    glBindVertexArrayOES(_vertextArray);

    glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _mvpMatrix.m);
    glUniform1i(uniforms[UNIFORM_TEXTURE], 0);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, _texture.name);
    glDrawElements(GL_TRIANGLES, _drawModel.numberOfIndises, GL_UNSIGNED_INT, 0);
}

结果我得到了下一个:

如果我使用GL_LINES模式(仅供参考):

如果我使用GL_TRIANGLES:

纹理(供参考)

所以看起来gl machine 没有画一些额外的三角形,但我堆叠了它发生的原因以及如何解决它...... 有什么建议吗?

---- 更新-----

问题在于不正确的索引索引并且缺少部分索引,经过更正后我得到了(感谢@codetiger

【问题讨论】:

    标签: ios objective-c iphone opengl-es fbx


    【解决方案1】:

    您有 24 个顶点,但索引仅引用前 7 个顶点。这意味着,索引是错误的。

    尝试按顺序输入索引

     0,  1,  2,  0,  2,  3,   //front
     4,  5,  6,  4,  6,  7,   //right
     8,  9,  10, 8,  10, 11,  //back
     12, 13, 14, 12, 14, 15,  //left
     16, 17, 18, 16, 18, 19,  //upper
     20, 21, 22, 20, 22, 23
    

    【讨论】:

    • 我还尝试按照您的建议(从 1 到 23)使用索引进行测试 - 结果它稍微好一点,但不如预期......,我想我应该有 8 个索引索引(因为立方体有8个verises),所以这应该是0到8范围内三角形的组合,对吗?
    • @gbk 我已经更正了顶点的顺序,这应该适合你。
    • 谢谢,你是对的,我认为索引适用于三角形,而不是垂直 - 我的秋天,非常感谢你的建议,请参阅更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 2012-07-24
    • 1970-01-01
    • 2014-12-18
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多