使用世界单位而不是(0f,1f)值的Feed Shader程序

时间:2014-10-28 07:39:53

标签: java libgdx opengl-es-2.0

我使用libgdx渲染一个简单的矩形网格,以及其他简单相似的几何元素。 Therse将与我在游戏中设置的精灵互动。精灵'位置和其他属性以世界单位设置,在每次精灵绘制会话之前,我设置相机如下:

    camera.update();        
    batch.setProjectionMatrix(camera.combined);

一切运作良好,但我需要使用世界单位绘制网格。如何根据我的游戏世界数据而不是(0f,1f)范围提供着色器程序世界坐标(12.5f,30f等)?我想绘制几个纹理网格,所以我需要与游戏中其他元素相关的坐标。

以下是绘制简单矩形网格的方法:

    mesh = new Mesh(true, 4, 6, 
            new VertexAttribute(Usage.Position, 3, "a_position"),
            new VertexAttribute(Usage.TextureCoordinates, 2, "a_texCoords"));   
    mesh.setVertices(new float[] {
            -1.0f, -1.0f, 0, 0,1,
            0.0f, -1.0f, 0,1,1,
            0.0f, 0.0f, 0, 1,0,
            -1.0f, 0.0f, 0,  0,0 });   
    mesh.setIndices(new short[] { 0, 1, 2, 2, 3, 0});   


    Gdx.graphics.getGL20().glEnable(GL20.GL_TEXTURE_2D);
    Gdx.gl20.glActiveTexture(GL20.GL_TEXTURE);    
    createShader();
    shader.begin();
    mesh.render(shader, GL20.GL_TRIANGLES);
    shader.end();

有什么方法可以将世界单位输入网格顶点数组?

1 个答案:

答案 0 :(得分:2)

您可以在顶点着色器中变换顶点。这允许您将世界坐标投影到渲染所需的-1到1范围。这通常通过将位置顶点属性与(投影)矩阵相乘来完成。请查看default spritebatch shader,了解如何实现此目的。

您可以使用camera.combined矩阵在顶点着色器中乘以这些顶点。就像在为spritebatch指定投影矩阵时所做的那样。您必须将此矩阵指定给您在顶点着色器中使用的制服。如何执行此操作的示例也可以在default spritebatch implementation中找到。

但是,您可能想重新考虑一下您的方法。由于您使用的是spritebatch,因此可以通过使用spritebatch而不是手动渲染来获得性能提升。这也将简化您的渲染,因为您不必自己弄乱着色器和矩阵。 Spritebatch包含一个方法(javadoc),它允许您指定手动创建的网格(或实际顶点)。每个顶点的大小应为5个浮点数(x,y,u,v,color),并且必须提供四个顶点的倍数(不一定是矩形)(可以使用Color.WHITE.toFloatBits()为了颜色)。

但是,既然你试图渲染一个简单的矩形,你也可以使用一种更方便的方法来渲染一个矩形,而不必一起创建一个网格(javadocs)。或者,更简单,通过为矩形(wiki page)创建一个Sprite来设计它的设计方式。

现在,如果您仍然确定您想要手动创建网格和着色器,那么我建议您使用例如一个教程,而不是潜入它。例如。 these tutorials可能会帮助您入门。维基还包含描述如何执行此操作的an article,包括在顶点着色器中转换顶点。