OpenTK ES 1.1纹理渲染

时间:2014-06-12 18:00:08

标签: opentk opengl-es-1.1

我有一个方法,我用它来渲染使用瓷砖的小地图,但是当我完成渲染并且我想要改变翻译时," transY"变量使用不同的方法没有任何反应,所以我必须再次调用RenderTesture()来实现它。我怎么能做这个没有不必要的渲染,因为当我使用更多的瓷砖时它会减慢应用程序的速度?

void RenderTexture ()
{
    MakeCurrent ();
    GL.Clear((int)All.ColorBufferBit | (int)All.DepthBufferBit);
    GL.MatrixMode(All.Modelview);
    GL.LoadIdentity();

    GL.Translate(-transX, transY, -10);

    for (int i = 0; i < tileRows; i++) 
    {
        for (int j = 0; j < tileColumns; j++)
        {
            GL.BindTexture(All.Texture2D, textureIds [i*tileColumns + j]);
            GL.EnableClientState(All.VertexArray);
            GL.EnableClientState(All.TextureCoordArray);
            GL.PushMatrix ();
            GL.Translate(j*2, -i*2, 0);
            GL.VertexPointer(3, All.Float, 0, frontV);
            GL.TexCoordPointer(2, All.Float, 0, frontT);
            GL.DrawArrays (All.TriangleFan, 0, 4);
            GL.PopMatrix ();
        }
    }
    GL.DisableClientState(All.VertexArray);
    GL.DisableClientState(All.TextureCoordArray);

    SwapBuffers ();
}

如果有人为我提供建议,我将非常感激!

提前致谢!

2 个答案:

答案 0 :(得分:0)

瓶颈最有可能在于状态变化量(GL.BindTexture)和您正在进行的绘制调用量(GL.DrawArrays)。通常,您应该在一次绘制调用中尽可能多地绘制。

最简单的方法是使用“纹理图集”:

  1. 将所有瓷砖纹理合并为一个大纹理(这是“纹理图集”)
  2. 将所有平铺顶点组合成单个顶点数组
  3. 调用GL.BindTexture一次绑定纹理图集
  4. 调用GL.DrawArrays一次以渲染所有图块
  5. 那你如何渲染不同的瓷砖纹理?简单:您将顶点纹理坐标更改为指向纹理图集内的正确图块。

    单个1024x1024可以容纳256个不同的64x64磁贴。根据游戏中不同图块的数量,您可能必须使用多个纹理图集。此外,根据地图的大小,您可能希望将其拆分为“区域”,每个区域都有不同的顶点数组(如果您的显示器只能显示1000个图块,则不希望每帧渲染100万个图块。)< / p>

    就其本身而言,这将带来可衡量的性能提升。一旦这个工作,你可以通过顶点缓冲对象(VBO)将顶点数组存储在GPU上来获得第二次大的提升。

答案 1 :(得分:0)

非常感谢!

“纹理图集”策略可能是非常好的主意。昨晚我实现了它,看起来渲染速度越来越快。我使用单独的纹理减少NxM图块的加载,通过使用单个纹理加载一个大的NxM图块位图,我实现了更改顶点数组的方法(关于新的位图尺寸 - NxM)

    public void UpdateFrontVertex(int rowNumber, int columnsNumber)
    {
        for (int i = 0; i < 12; i++) {
            if (i % 3 == 0)
                frontVertex [i] = defaultFrontVertex[i] * rowNumber;    // x-axis
            else if (i % 3 == 1)
                frontVertex [i] = defaultFrontVertex[i] * columnsNumber;    // y-axis
            else if (i % 3 == 2)
                frontVertex [i] = defaultFrontVertex[i];    // z-axis
        }
    }

之后,我有了我的地图!!!

我仍然无法在实现之前比较性能,现在因为我必须对平移和缩放功能进行更改才能使用新的渲染策略。 例如,我用过

//zoom in
transY = (transY * 2 + 1);
transX = (transX * 2 + 1);

//zoom out
transX = ((transX - 1) / 2);
transY = ((transY - 1) / 2);

用于缩放计算,以确定哪个图块是我的中心图块,然后加载所有舍入图块。

再次感谢您的大力帮助,我现在将继续进行平移和缩放实施。