Объект исчезает при увеличении - Opengl - PullRequest
1 голос
/ 19 апреля 2020

Я пытаюсь построить 2D-график с 20 миллионами точек, используя OpenTK. Мне нужно иметь возможность увеличивать, уменьшать масштаб и панорамировать. Все работало, когда я пытался протестировать его на графике 50K точек, но когда я пытался построить 20 миллионов, объект графика, кажется, исчезает после увеличения в несколько раз. Я абсолютно не понимаю, почему это исчезает. Я увеличиваю и уменьшаю масштаб, изменяя значение fovy в матрице проекции в зависимости от события OnMouseWheel. Я не трогал панорамирование, когда тестировал увеличение.

    fov = 55.0f;
    public GraphWIndow (float [] Xpoints, float[][] YPoints ) : base(800, 600, default, "Data Analyzer", GameWindowFlags.Default, default,4,0, default)
            {
                Y1Vertices[10][2M] = Ypoints;
                X1Vertices[2M] = Xpoints
            }

         protected override void OnLoad(EventArgs e)
        {
            CursorVisible = true;
            shader = new Shader("shader.vert", "shader.frag");
            shader.Use();
            CameraPos = new Vector3(0.0f, 0.0f, 2.0f);
            CameraUp = new Vector3(0.0f, 1.0f, 0.0f);
            CameraFront = new Vector3 (0.0f, 0.0f, -1.0f);
            base.OnLoad(e);
        }

 private void CreateAndPlotData(float[] YVertices, int color)
        {
            VertexBufferObjectX = GL.GenBuffer();
            GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferObjectX);
            GL.BufferData(BufferTarget.ArrayBuffer, XVertices.Count() * sizeof(float), XVertices, BufferUsageHint.StaticDraw);
            var vertexLocationX = shader.GetAttribLocation("aPositionX");
            VertexBufferObjectY = GL.GenBuffer();
            GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferObjectY);
            GL.BufferData(BufferTarget.ArrayBuffer, YVertices.Count() * sizeof(float), YVertices, BufferUsageHint.StaticDraw);
            var vertexLocationY = shader.GetAttribLocation("aPositionY");
            VertexArrayObject = GL.GenVertexArray();
            GL.BindVertexArray(VertexArrayObject);
            GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferObjectX);
            GL.VertexAttribPointer(vertexLocationX, 1, VertexAttribPointerType.Float, false, 0, 0);
            GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferObjectY);
            GL.VertexAttribPointer(vertexLocationY, 1, VertexAttribPointerType.Float, false, 0, 0);
            GL.EnableVertexAttribArray(vertexLocationX);
            GL.EnableVertexAttribArray(vertexLocationY);
            GL.BindVertexArray(0);
            SetUpShaderAndView(color);
            GL.BindVertexArray(VertexArrayObject);
            GL.DrawArrays(PrimitiveType.LineStrip, 0, YVertices.Count());
            GL.BindVertexArray(0);
            GL.BindBuffer(BufferTarget.ArrayBuffer, 0);

            shader.Unbind();

        }

        private void SetUpShaderAndView(int color)
        {
            Matrix4 view, projection;
            projection = Matrix4.CreatePerspectiveFieldOfView(((float)fov * (float)Math.PI) /(float)180, (float)Width / (float)Height, 0.01f, 100f);
            view = Matrix4.LookAt(CameraPos,
            CameraPos + CameraFront, CameraUp);
            shader.Use();
            shader.SetMatrix4("model", Matrix4.Identity);
            shader.SetMatrix4("view", view);
            shader.SetMatrix4("projection", projection);
            SwapBuffers();
            base.OnRenderFrame(e);
        }



  protected override void OnRenderFrame(FrameEventArgs e)
    {
        GL.ClearColor(Color4.DarkBlue);
        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
        for (int j=0; j < 10; j++)
        {
            CreateAndPlotData(Y1Vertices[j], j);
        }
        SwapBuffers();
        base.OnRenderFrame(e);
    }

     protected override void OnMouseWheel(MouseWheelEventArgs e)
        {

           if (fov > 90.0f)
            {
               fov = 90.0f;
            }
            else if (fov <5.0f)
            {
                fov = 5.0f;
            }
            else 
            {
                fov -= e.DeltaPrecise;
            }

            base.OnMouseWheel(e);
        }

shader.vert

#version 400 core
in float aPositionX;
in float aPositionY;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
    gl_Position = vec4(aPositionX, aPositionY, 0.0f, 1.0f)*model*view*projection;
}

Shader.cs

public void SetMatrix4(string name, Matrix4 data)
{
    GL.UseProgram(Handle);
    var uniform_loc = GL.GetUniformLocation(Handle, name);
    GL.UniformMatrix4(GL.GetUniformLocation(Handle,name), true, ref data);

}

1 Ответ

1 голос
/ 19 апреля 2020

Может быть несколько причин. Поскольку вы не предоставляете исполняемый образец, я могу указать только возможные причины.

  • Вы установили область просмотра GL.ViewPort(0,0, WindowWidth, WindowHeight)?
  • Вы не объясняете, что именно исчезает. Итак, вы проверили, что поток рендеринга и обновления все еще работает? (В вашем случае Update и Render-Thread совпадают, как я вижу в вашем примере кода).
  • Проверяли ли вы на ошибку? Как я вижу, вы используете версию OpenTK3.1. Существует ошибка для регистрации обработчика ошибок. Поэтому вы должны попытаться использовать ApiTrace или RenderDo c для проверки ошибок и проверки каждого шага вашего конвейера.
  • И последнее, но не менее важное: проблема с ближней или дальней плоскостью матрицы камеры.

Есть много причин, по которым вещи могут исчезнуть. Если бы вы могли предоставить больше информации, я уверен, что смогу помочь более подробно.

...