网格的VBO不正确:某些三角形已连接且不应[2D]

时间:2012-08-28 14:34:26

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

我用这段代码生成我的VBO

    int SCREEN_WIDTH = 800;
    int SCREEN_HEIGHT = 480;
    int PIXEL_PER_VERTEX = 4;
    int CAVERN_TEXTURE_WIDTH = 1024;
    int CAVERN_TEXTURE_HEIGHT = 512;

    final int vertexCount = ((SCREEN_WIDTH / PIXEL_PER_VERTEX) +1 ) * 2;
    final float[] bufferDataLowerCave = new float[vertexCount * CavernBoundMesh.VERTEX_SIZE];

    for(int i=0; i < vertexCount; i += 2) {
        bufferDataLowerCave[i * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.VERTEX_INDEX_X] = PIXEL_PER_VERTEX * i / 2.f;
        bufferDataLowerCave[i * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.VERTEX_INDEX_Y] = 200;
        bufferDataLowerCave[i * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.TEXTURECOORDINATES_INDEX_U] = ( (float) PIXEL_PER_VERTEX * i / 2.f) / SCREEN_WIDTH;
        bufferDataLowerCave[i * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.TEXTURECOORDINATES_INDEX_V] = 0.f;

        bufferDataLowerCave[(i + 1 ) * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.VERTEX_INDEX_X] = PIXEL_PER_VERTEX * i / 2;
        bufferDataLowerCave[(i + 1 ) * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.VERTEX_INDEX_Y] = 0;
        bufferDataLowerCave[(i + 1 ) * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.TEXTURECOORDINATES_INDEX_U] = ( (float) PIXEL_PER_VERTEX * i / 2.f) / SCREEN_WIDTH;
        bufferDataLowerCave[(i + 1 ) * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.TEXTURECOORDINATES_INDEX_V] = 0.5f;
    }

我正在使用TRIANGLE_STRIP绘制网格(以原点为中心)。

抱歉,由于我使用的是引擎(AndEngine),因此没有openGL代码。但如果你真的需要,我可以尝试追踪它.. Incorrect mesh displayed

正如你在图像中看到的那样,最后2个顶点与原点中的顶点连接。我调试了VBO的创建,这是第一个和最后一个顶点

//X       Y       U        V
[0.0,    200.0,  0.0,     0.0,
 0.0,    0.0,    0.0,     0.5,
 4.0,    200.0,  0.0050,  0.0,
 4.0,    0.0,    0.0050,  0.5,
 8.0,    200.0,  0.01,    0.0,
 8.0,    0.0,    0.01,    0.5,
 12.0,   200.0,  0.015,   0.0,
 12.0,   0.0,    0.015,   0.5,
 16.0,   200.0,  0.02,    0.0,
 16.0,   0.0,    0.02,    0.5
 [..]
 780.0,  200.0,  0.975,   0.0,
 780.0,  0.0,    0.975,   0.5,
 784.0,  200.0,  0.98,    0.0,
 784.0,  0.0,    0.98,    0.5,
 788.0,  200.0,  0.985,   0.0,
 788.0,  0.0,    0.985,   0.5,
 792.0,  200.0,  0.99,    0.0,
 792.0,  0.0,    0.99,    0.5,
 796.0,  200.0,  0.995,   0.0,
 796.0,  0.0,    0.995,   0.5]

这是我使用的顶点着色器

uniform mat4 u_modelViewProjectionMatrix;
uniform float u_elapsedSeconds;

attribute vec4 a_position;
attribute vec2 a_textureCoordinates;

varying vec2 v_textureCoordinates;

void main(void)
{
    v_textureCoordinates = a_textureCoordinates;
    vec4 temp_position = u_modelViewProjectionMatrix * a_position;

    float variation = 0.3*sin((u_elapsedSeconds + 1.5 * temp_position.x))*(1.0 + temp_position.y);
    temp_position.y += variation;

    gl_Position = temp_position;
}

我对这些东西很新,所以我不太了解规格及其工作原理,但我无法真正了解产生这种奇怪效果的原因。你能救我一下吗?

EDIT1:

我做了一些测试.. 即使使用标准顶点和片段着色器,它只是设置位置和从纹理中获取颜色,它会产生奇怪的结果。

EDIT2: 还有一些图像,这次只有2个标准的vert和frag着色器用于位置和纹理颜色(这些图像来自平板电脑,而第一个来自手机)

wrong image 1 2° wrong image 3° wrong image my favourite wrong image

2 个答案:

答案 0 :(得分:2)

我很确定你为绘图代码指定了错误数量的图元,因为顶点本身看起来不错。当您对openGL或任何其他3D基本绘图进行绘图调用时,不要指定要绘制的顶点数,而是指定基元的数量。在你的情况下,一个基元是一个三角形。

因为它是一个三角形条带,所以在你的通话中它总是numberOfVertices - 2原语。如果它是三角形列表,它将是numberOfVertices/3,对于三角形扇形,它再次为numberOfVertices - 2

由于您可能指定要绘制的三角形比要绘制的数据多,所以它可能使用了一些默认的(0,0,0,0),这说明它试图在左下角绘制两个退化三角形,这也是引用纹理坐标0,0。这也是有道理的,因为甚至没有顶点在列表中具有位置0,0和T / U 0,0,因此最后一个顶点必须是某个默认值。

答案 1 :(得分:0)

好的,我解决了。

尝试libgdx后(我真的不喜欢它,它接缝很多实用功能都缺失了,我还没有真正掌握它背后的概念,例如它如何处理纹理,如何管理实体等等。 )并用jni实现了一个非常小的本地语言渲染器,并且还设置了cocos-2d-x(但是没有尝试过,因为我第一次使用jni代码并编写了上面提到的渲染器)我又回到了AndEngine。

我成功地设法用VBO和IBO实现网格,但最后我通过在VBO的开始和结束处复制(添加2个相同的顶点)来解决我的问题,以便其他三角形退化并且是没画。所以,这是最常见的解决方法,但只要它有效..