我正在使用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;
}
答案 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