Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对象在放大时消失-Opengl_C#_Opengl_Opentk - Fatal编程技术网

C# 对象在放大时消失-Opengl

C# 对象在放大时消失-Opengl,c#,opengl,opentk,C#,Opengl,Opentk,我正在尝试使用OpenTK绘制一个包含2000万个点的2d图形。我需要能够放大、缩小和平移。当我尝试在50K点图形上测试它时,一切都正常,但当我尝试绘制2000万点图形时,图形对象在放大几次后似乎消失了。我完全不知道它为什么会消失。我通过根据onmouseheel事件更改投影矩阵中的fovy值来放大和缩小。在测试放大时,我没有触摸平移 fov = 55.0f; public GraphWIndow (float [] Xpoints, float[][] YPoints ) :

我正在尝试使用OpenTK绘制一个包含2000万个点的2d图形。我需要能够放大、缩小和平移。当我尝试在50K点图形上测试它时,一切都正常,但当我尝试绘制2000万点图形时,图形对象在放大几次后似乎消失了。我完全不知道它为什么会消失。我通过根据
onmouseheel
事件更改投影矩阵中的fovy值来放大和缩小。在测试放大时,我没有触摸平移

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

}

可能有几个原因。因为您没有提供可执行的示例,所以我只能说明可能的原因

  • 是否设置了视口
    GL.视口(0,0,窗宽,窗高)
  • 你没有确切地解释什么正在消失。那么,您是否检查了渲染和更新线程是否仍在工作?(在您的例子中,更新和渲染线程是相同的,正如我在代码示例中看到的)
  • 你检查错误了吗?如我所见,您使用的是OpenTK3.1版本。注册错误处理程序时出现错误。因此,您应该尝试使用或检查错误,并检查管道的每个步骤
  • 最后但并非最不重要的是,相机矩阵的近平面或远平面可能存在问题

东西会消失的原因有很多。如果你能提供更多的信息,我相信我能提供更深入的帮助。

我会转置它。我编辑了这个问题。@rabbi76,你认为它会因为分数太多而崩溃吗?我不确定VAO和VBO是否会产生影响。我更改了问题以显示我到底是如何做的。一旦我停止在渲染循环中重新启动VAO,问题就得到了解决。现在,我在OnLoad事件中启动它一次,然后在渲染循环中绑定和解除绑定它。我认为在渲染循环中重新创建VAO是昂贵的。既然你想帮忙,我就把你的答案投了赞成票。非常感谢。
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);

}