三角条

时间:2017-01-19 05:41:13

标签: c# performance opengl gl-triangle-strip

我的程序是3D Spectrum处理器,它将显示信号强度(y)与频率(x)对时间(z)的关系。它基本上绘制了一个三维高度图,顶点的高度对应于信号强度。 基本程序流程是创建具有固定x和z坐标的高度图,并计算索引。在此之后,获得新的Y坐标并使用GL.BufferSubData调用更新整个3D表面。基本上新的光谱数据进入,它被放置在所有其他光谱数据的前面,其余的用循环缓冲器向后移动。新数据的数据处理相当快,大约需要20ms。

现在数据量相当大。我绘制了2048个点,我有50到100行。所以大约有100,000到200,000个顶点。这些都是用单个GL.DrawElements绘制的,顶点是VBO,索引是VBO。

现在,我有一个测试程序,如果数据可用,它会向openGL程序生成顶点和信号。如果是,它将数据传输到顶点数组。如果没有更多的sdata可用,它只是绘制。

绘图似乎很慢但我不确定我要求太多。我们需要绘制大约300,000个三角形,然后用2D着色器对它们进行着色,它基本上只使用顶点的高度来选择颜色。

所以我看到2.3 GHz的四核Core i7采用nVidia 540m显卡,每帧大约150 ms。这很慢。如果我使窗口变小,速度会大大提高,如果是全屏则会变得更糟。

我在这里期待太多了吗?或者我的代码中有问题吗?

这是问题陈述。为什么程序这么慢?

我正在使用带有opengl4Csharp库的c#。

这是代码: GLUT空闲回调具有:

        Gl.Viewport(0, 0, width, height);
        Gl.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

        // use our vertex shader program
        Gl.UseProgram(plottingProgram);

        Gl.BindTexture(myTexture); //this is the 2D texture
        Gl.TexParameteri(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, TextureParameter.ClampToEdge);
        Gl.TexParameteri(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, TextureParameter.ClampToEdge);

        plottingProgram["model_matrix"].SetValue(Matrix4.CreateRotationY(yangle) * Matrix4.CreateRotationX(xangle));

        if (dataAvailable)
        {
            CircularBuffer.UpdateVertexArray(); //this updates the y vertex values

            spectrumVBO.BufferSubData(vertexBuffer); //vertexBuffer is an array with x,y,z data.  x, is always the same

            dataAvailable = false;
        }

        Gl.BindBufferToShaderAttribute(spectrumVBO, plottingProgram, "vertexPosition");

        Gl.BindBuffer(spectrumIndicesVBO);
        Gl.DrawElements(BeginMode.TriangleStrip, spectrumIndicesVBO.Count, DrawElementsType.UnsignedInt, IntPtr.Zero);

以下是着色器:

    public static string VertexShader = @"
    #version 130

    in vec3 vertexPosition;

    out vec2 textureCoordinate;

    uniform mat4 projection_matrix;
    uniform mat4 view_matrix;
    uniform mat4 model_matrix;

    void main(void)
    {
        textureCoordinate = vertexPosition.xy;
        gl_Position = projection_matrix * view_matrix * model_matrix * vec4(vertexPosition, 1);           
    }
    ";

    public static string FragmentShader = @"
    #version 130

    uniform sampler2D texture;

    in vec2 textureCoordinate;

    out vec4 fragment;

    void main(void)
    {
        fragment = texture2D(texture,textureCoordinate);
    }
    ";

0 个答案:

没有答案