【问题标题】:OpenGL ES mesh problems on AndroidAndroid上的OpenGL ES网格问题
【发布时间】:2011-11-16 21:50:18
【问题描述】:

我已经完成了很多关于网格的 DirecX 工作,但我无法理解我在 OpenGL ES 中的三角形发生了什么。 我尝试使用网络上的一些示例框以及我在旧项目中使用的框的数据,但它们总是出错,而且通常不可见。

这是一个例子。

与顶点:

-25.0 -25.0 25.0 
25.0 -25.0 25.0 
-25.0 25.0 25.0 
25.0 25.0 25.0 

和索引(从 0 开始):

2 1 3 

如果我使用索引,我得到一个三角形,它的直角指向屏幕的一个完全不同的角:

3 1 2

根据我的理解,如果顶点在我当前的配置中以 CW 顺序列出,它甚至不应该显示三角形。 关于这些顶点发生了什么的任何线索???

顺便说一句,这是我的绘图代码:

gl.glFrontFace(GL10.GL_CCW);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glCullFace(GL10.GL_BACK);

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
//gl.glColor4f(1.0f,0.0f,1.0f,1.0f);
gl.glDrawElements(GL10.GL_TRIANGLES, indexCount, GL10.GL_UNSIGNED_SHORT, indexBuffer);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisable(GL10.GL_CULL_FACE);

编辑:

3 1 2 绘制一个指向左上角的角,2 1 3 绘制一个指向右上角的角,但只绘制最先列出的那个。 越来越奇怪了……

{
public void initAndStuff(...)
{
    try{
        //
        ...
        They get initialized up here...
        This is also where the external data is fed in (but is erased below)
        //

        ////////////////////////////////
        vertexBuffer.clear();
        indexBuffer.clear();

        vertexBuffer.put(-25.0f);
        vertexBuffer.put(-25.0f);
        vertexBuffer.put(25.0f);

        vertexBuffer.put(25.0f);
        vertexBuffer.put(-25.0f);
        vertexBuffer.put(25.0f);

        vertexBuffer.put(-25.0f);
        vertexBuffer.put(25.0f);
        vertexBuffer.put(25.0f);

        vertexBuffer.put(25.0f);
        vertexBuffer.put(25.0f);
        vertexBuffer.put(25.0f);


        indexBuffer.put(3);
        indexBuffer.put(1); // points toward top left
        indexBuffer.put(2);
        indexBuffer.put(2);
        indexBuffer.put(1); // points toward top right
        indexBuffer.put(3);


        indexIndex = 6;
        //////////////////////////////////


        // wrap things up
        vertexBuffer.position(0);
        indexBuffer.position(0);

    }
    catch(Exception e)
    {
        e.printStackTrace();
        Toast.makeText(context,"exception in loadfile",Toast.LENGTH_LONG).show();
        return false;
    }
    return true;
}

public final void draw(GL10 gl)
{
    gl.glFrontFace(GL10.GL_CCW);
    gl.glEnable(GL10.GL_CULL_FACE);
    gl.glCullFace(GL10.GL_BACK);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    //gl.glColor4f(1.0f,0.0f,1.0f,1.0f);
    gl.glDrawElements(GL10.GL_TRIANGLES, indexIndex, GL10.GL_UNSIGNED_SHORT, indexBuffer);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisable(GL10.GL_CULL_FACE);

}
}

【问题讨论】:

  • vertexBufferindexBuffer 包含哪些数据?当然我们可以猜到,但看到它会确保它们包含正确的数据并且是正确的类型。其余的代码也可能很有趣。
  • 我实际上已经检查了缓冲区,它们确实按列出的顺序包含正确的数据。我会把我所有的代码都放在这里,但是在我为从文件中读取数据而编写的大量程序中很容易迷失(我已经进行了广泛的测试)。我也尝试过手动将数据加载到缓冲区中(而不是从单独的文件中),结果同样令人困惑。
  • 但在这种情况下,您可能不得不对未回答的问题感到满意,因为我可以看到的代码看起来很合理。重现问题的最小示例就足够了。
  • 我发现由于某种原因,列出三角形的顺序似乎会影响渲染... 继续试验...
  • 更新了孤立的示例和更多信息

标签: opengl-es indexing vertex


【解决方案1】:

这是因为我将我的短缓冲区初始化为 int 缓冲区。

【讨论】:

  • 我实际上是在猜这个,这就是我想查看整个初始化代码的原因。也许我应该说出来。
猜你喜欢
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多