Libgdx SpriteBatch.draw()指定4个顶点

时间:2012-08-14 14:49:34

标签: java opengl sprite draw libgdx

我正在使用libGdx来创建一个2D游戏,我正在尝试使用这种特殊的方法来绘制一个简单的2D纹理,并指定4个顶点;

draw(Texture texture, float[] spriteVertices, int offset, int length)

描述说明:使用给定的顶点绘制一个矩形。必须有4个顶点,每个顶点按此顺序由5个元素组成:x,y,color,u,v。

其他绘制方法工作正常,但我不能让这个工作。我正在尝试的是这个;

batch.draw(boxTexture, new float[] {-5, -5, 0, Color.toFloatBits(255, 0, 0, 255), 0, 0, 
                5, -5, 0, Color.toFloatBits(255, 255, 255, 255), 1, 0, 
                5, 5, 0, Color.toFloatBits(255, 255, 255, 255), 1, 1, 
                -5, 5, 0, Color.toFloatBits(255, 255, 255, 255), 0, 1}, 3, 3);

我不太熟悉OpenGL的工作原理,特别是偏移量和长度应该是多少。有没有更有知识的人知道如何使这个工作?

更新:

它使用网格工作,但后来发现没有透明度,这很烦人。最后,我刚刚为SpriteBatch添加了一个自定义方法,因为它更容易理解。顶点顺时针绘制;

public void drawQuad (Texture texture, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float col) {
        if (!drawing) throw new IllegalStateException("SpriteBatch.begin must be called before draw.");

        if (texture != lastTexture) {
            switchTexture(texture);
        } else if (idx == vertices.length) //
            renderMesh();

        final float u = 0;
        final float v = 1;
        final float u2 = 1;
        final float v2 = 0;

        vertices[idx++] = x1;
        vertices[idx++] = y1;
        vertices[idx++] = col;
        vertices[idx++] = u;
        vertices[idx++] = v;

        vertices[idx++] = x2;
        vertices[idx++] = y2;
        vertices[idx++] = col;
        vertices[idx++] = u;
        vertices[idx++] = v2;

        vertices[idx++] = x3;
        vertices[idx++] = y3;
        vertices[idx++] = col;
        vertices[idx++] = u2;
        vertices[idx++] = v2;

        vertices[idx++] = x4;
        vertices[idx++] = y4;
        vertices[idx++] = col;
        vertices[idx++] = u2;
        vertices[idx++] = v;
    }

3 个答案:

答案 0 :(得分:3)

Offset是数组中的起始位置(对于你0),length是数组需要经过多少个索引。对于您的情况:4分,每个点有5个数据:4 * 5 = 20。

Draw永远不会开始渲染过程,因为值3浮动并不足以形成三角形(15是最小值)。

至于P.T。的答案,这个特殊功能可以进行风扇渲染,所以正确的顺序是顺时针或逆时针。

此外: 您放置这些点和纹理的顺序将使纹理颠倒(我不知道这是否是预期的。)

答案 1 :(得分:2)

偏移和长度用于获取spriteVertices数组的切片。在您的情况下,它们应该是0数组 .length(将顶点放在局部变量中以计算长度)。

另外,我不确定它是否必需,但我强烈怀疑顶点应该以三角形友好的方式传递。您目前正在进行逆时针枚举。通常对于四边形,您应该使用这样的Z模式:

3-4
 \
1-2  

(这是因为OpenGL在列表中获取每组3个顶点并渲染得到的三角形,因此顶点1,2,3和2,3,4都应该生成有用的三角形。)

答案 2 :(得分:-2)

3-4

 \

1-2*

这是错的,需要像这样:

4-3

1-2