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,遇到动态绘制问题,无法理解其无法渲染的原因。这是绑定代码 public void GenerateAttributesPolygonDynamic(ref int VBO, ref int VAO, ref int EBO, int ArrayLength, int IndiciesLength) { VBO = GL.GenBuffer(); VAO = GL.GenVertexArray(); EBO = GL.GenBuffer();

遇到动态绘制问题,无法理解其无法渲染的原因。这是绑定代码

public void GenerateAttributesPolygonDynamic(ref int VBO, ref int VAO, ref int EBO, int ArrayLength, int IndiciesLength)
    {
        VBO = GL.GenBuffer();
        VAO = GL.GenVertexArray();
        EBO = GL.GenBuffer();
        GL.BindVertexArray(VAO);
        GL.BindBuffer(BufferTarget.ArrayBuffer, VBO);
        GL.BufferData(BufferTarget.ArrayBuffer, sizeof(float) * ArrayLength, IntPtr.Zero, BufferUsageHint.DynamicDraw);
        GL.BindBuffer(BufferTarget.ElementArrayBuffer, EBO);
        GL.BufferData(BufferTarget.ElementArrayBuffer, sizeof(uint) * IndiciesLength, IntPtr.Zero, BufferUsageHint.DynamicDraw);
        GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, 6 * sizeof(float), 0);
        GL.EnableVertexAttribArray(0);
        GL.VertexAttribPointer(1, 4, VertexAttribPointerType.Float, false, 6 * sizeof(float), 2 * sizeof(float));
        GL.EnableVertexAttribArray(1);
    }
VBO由2个浮点XY坐标和4个RGBA浮点组成。在这个绑定之后,我调用了draw函数,在画布上看不到任何东西

public void Draw()
    {
        float[] Verticies = new float[]
        {
             -0.5f,  0.5f,   Color4.Red.R,Color4.Red.G,Color4.Red.B,Color4.Red.A,
              0.5f,  0.5f,   Color4.Red.R,Color4.Red.G,Color4.Red.B,Color4.Red.A,
              0.5f,  -0.5f,  Color4.Red.R,Color4.Red.G,Color4.Red.B,Color4.Red.A,
             -0.5f,  -0.5f,  Color4.Red.R,Color4.Red.G,Color4.Red.B,Color4.Red.A
        };
        uint[] Indicies = new uint[]
        {
            0, 1, 3,
            1, 2, 3
        };
        GL.BindBuffer(BufferTarget.ArrayBuffer, VBO);
        GL.BufferSubData(BufferTarget.ArrayBuffer, IntPtr.Zero, sizeof(float) * Verticies.Length, Verticies);
        GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
        GL.BindBuffer(BufferTarget.ElementArrayBuffer, EBO);
        GL.BufferSubData(BufferTarget.ElementArrayBuffer, IntPtr.Zero, sizeof(uint) * Indicies.Length, Indicies);
        GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0);
        GL.BindVertexArray(VAO);
        GL.UseProgram(ProgramID);
        GL.DrawElements(PrimitiveType.Triangles, Indicies.Length, DrawElementsType.UnsignedInt, 0);
        GL.BindVertexArray(0);

    }
希望有人能帮助我。着色器简单而正确,在绑定静态绘制类型时工作良好。在动态渲染对象时,我需要使用Dynamic_Draw方法和BufferSubData来解决其他问题,这段代码就是我一直坚持的示例。非常感谢您的帮助

存储在中。调用
GL.BindBuffer(BufferTarget.ElementArrayBuffer,0)时(VAO已绑定),绑定已断开

除去

GL.BindBuffer(BufferTarget.ElementArrayBuffer,0)

当缓冲区绑定到目标
BufferTarget.ElementArrayBuffer
时,该缓冲区将与当前绑定的顶点数组对象相关联。其行为与
缓冲目标.ArrayBuffer
不同

初始化索引时,绑定VAO就足够了,因为在
GenerateAttributesPolygonDynamic
中,索引缓冲区已分配给VAO:

GL.BindVertexArray(VAO);
总账BufferSubData(BufferTarget.ElementArrayBuffer,IntPtr.Zero,
尺寸(单位)*标记、长度、标记);
存储在中。调用
GL.BindBuffer(BufferTarget.ElementArrayBuffer,0)时(VAO已绑定),绑定已断开

除去

GL.BindBuffer(BufferTarget.ElementArrayBuffer,0)

当缓冲区绑定到目标
BufferTarget.ElementArrayBuffer
时,该缓冲区将与当前绑定的顶点数组对象相关联。其行为与
缓冲目标.ArrayBuffer
不同

初始化索引时,绑定VAO就足够了,因为在
GenerateAttributesPolygonDynamic
中,索引缓冲区已分配给VAO:

GL.BindVertexArray(VAO);
总账BufferSubData(BufferTarget.ElementArrayBuffer,IntPtr.Zero,
尺寸(单位)*标记、长度、标记);

找到了解决方案。调用方法
GenerateAttributesPolygonDynamic
时,我设置了不正确的ArrayLength参数,没有颜色字节。非常感谢你们所有人。主题需要关闭。

找到了解决方案。调用方法
GenerateAttributesPolygonDynamic
时,我设置了不正确的ArrayLength参数,没有颜色字节。非常感谢你们所有人。主题需要关闭。

useage提示只是一个提示,无论您指定哪个提示,实际输出都应该完全相同(不过性能可能会有所不同)。因此,如果您只需将提示更改回
STATIC\u DRAW
,您的代码就能正常工作,那么您可能有一些奇怪的驱动程序错误,或者您的代码中可能有一些错误,很可能是一些未定义的行为。谢谢您的回答!我认为bug是可能的,但是这个方法只运行一次(在做一些严肃的事情之前编写过),并且调用了Render,但没有元素buffer,它可以正确地渲染(在鼠标光标周围画一条简单的线,效果很好)。我真的很困惑到底是什么问题。这里没有任何GL错误检查代码的迹象。运行时可能会告诉您问题出在哪里,但您没有听。尝试将GL.GetError()放入Draw方法中,但在VBO绑定后获得InvalidValue。在EBO绑定后也进行了检查,未发现错误。困惑如何解决问题:/useage提示只是一个提示,无论您指定哪个提示,实际输出都应该完全相同(尽管性能可能不同)。因此,如果您只需将提示更改回
STATIC\u DRAW
,您的代码就能正常工作,那么您可能有一些奇怪的驱动程序错误,或者您的代码中可能有一些错误,很可能是一些未定义的行为。谢谢您的回答!我认为bug是可能的,但是这个方法只运行一次(在做一些严肃的事情之前编写过),并且调用了Render,但没有元素buffer,它可以正确地渲染(在鼠标光标周围画一条简单的线,效果很好)。我真的很困惑到底是什么问题。这里没有任何GL错误检查代码的迹象。运行时可能会告诉您问题出在哪里,但您没有听。尝试将GL.GetError()放入Draw方法中,但在VBO绑定后获得InvalidValue。在EBO绑定后也进行了检查,未发现错误。困惑如何解决问题:/谢谢您的帮助,但仍然从GL.drawerelements进行渲染没有帮助。但是当我完全移除ElementsBuffer时,DynamicDraw工作得很好,但它不是一个解决方案,它需要制作更多的垂直并为每个元素放置RGBAthem@AlexanderMan我懂了。无论如何,这是应用程序中的一个bug。可能还有一些。谢谢你的帮助,但是仍然从GL.DrainElements进行渲染没有帮助。但是当我完全移除ElementsBuffer时,DynamicDraw工作得很好,但它不是一个解决方案,它需要制作更多的垂直并为每个元素放置RGBAthem@AlexanderMan我懂了。无论如何,这是应用程序中的一个bug。可能还有一些。