【问题标题】:Feed Shader Program with World Units instead of (0f,1f) values使用世界单位而不是 (0f,1f) 值的饲料着色器程序
【发布时间】:2014-10-28 07:39:53
【问题描述】:

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

    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();

有什么方法可以将世界单位提供给网格顶点数组?

【问题讨论】:

    标签: java libgdx opengl-es-2.0


    【解决方案1】:

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

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

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

    但是,由于您正在尝试渲染一个简单的矩形,您不妨使用一种更方便的方法,该方法允许您渲染一个矩形,而不必一起创建一个网格 (javadocs)。或者,更简单的是,通过为您的矩形创建一个 Sprite (wiki page) 来使用它的设计方式。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-29
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多