Java 使用世界单位而不是(0f,1f)值馈送着色器程序

Java 使用世界单位而不是(0f,1f)值馈送着色器程序,java,libgdx,opengl-es-2.0,Java,Libgdx,Opengl Es 2.0,我正在使用libgdx和其他简单性类似的几何元素渲染一个简单的矩形网格。他们将与我在游戏中设置的精灵互动。精灵的位置和其他属性是以世界单位设置的,在每次精灵绘制会话之前,我会按如下方式设置相机: camera.update(); batch.setProjectionMatrix(camera.combined); 这一切都很好,但我需要绘制网格使用世界单位。如何根据游戏世界数据为着色器程序世界坐标(12.5f、30f等)而不是(0f、1f)范围提供数据?我想画

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

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

下面是我如何绘制一个简单的矩形网格:

    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到1范围。这通常通过将“位置顶点”属性与(投影)矩阵相乘来实现。请查看,以获取如何实现此功能的示例

您可以使用
摄影机.combined
矩阵在顶点着色器中乘以这些顶点。就像为spritebatch指定投影矩阵时所做的那样。您必须将此矩阵指定给在顶点着色器中使用的一致性。有关如何执行此操作的示例,请参见

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

但是,由于您正试图渲染一个简单的矩形,您最好使用一种更方便的方法来渲染矩形,而不必一起创建网格()。或者,更简单的是,通过为矩形创建精灵()来使用它的设计方式

现在,如果您仍然确定要手动创建网格和着色器,那么我建议您使用教程来学习,而不仅仅是深入学习。例如,可能会帮助您开始。wiki还包含描述如何执行此操作的内容,包括在顶点着色器中变换顶点