1

需要帮助,因为我是 OpenGL 新手。因此,我的任务是创建一个控件,该控件将实时绘制在 CNC 机床上切割工件的过程。

我尝试通过 glBegin、glEnd 经典地做到这一点,一切正常,但由于顶点数量众多,它在最后开始缓慢工作。因此,我决定尝试使用 VertexBufferArray () 和 VertexBuffer () - 这也有效,但在这种情况下,我不明白如何更改线宽及其类型(具体来说,我有两种类型 - 常规线和破折号-虚线)。

这是我使用数组的方法

                private void CreateBufferAndDraw(OpenGL GL)
    {
        try
        {
            if (shaderProgram == null && vertexBufferArray == null)
            {
                var vertexShaderSource = ManifestResourceLoader.LoadTextFile("vertex_shader.glsl");
                var fragmentShaderSource = ManifestResourceLoader.LoadTextFile("fragment_shader.glsl");
                shaderProgram = new ShaderProgram();
                shaderProgram.Create(gL, vertexShaderSource, fragmentShaderSource, null);
                attribute_vpos = (uint)gL.GetAttribLocation(shaderProgram.ShaderProgramObject, "vPosition");
                attribute_vcol = (uint)gL.GetAttribLocation(shaderProgram.ShaderProgramObject, "vColor");
                shaderProgram.AssertValid(gL);
            }

            if (_data == null)
            {
                _data = new vec3[_Points.Count];
            }
            else
            {
                if (_data.Length != _Points.Count)
                {
                    _data = (vec3[])ResizeArray(_data, _Points.Count);
                }
            }

            if (_dataColor == null)
            {
                _dataColor = new vec3[_Points.Count];
            }
            else
            {
                if (_dataColor.Length != _Points.Count)
                {
                    _dataColor = (vec3[])ResizeArray(_dataColor, _Points.Count);
                }
            }

            for (int i = _dataTail; i < _Points.Count; i++)
            {
                _data[i].y = _Points[i].Y;
                _data[i].x = _Points[i].X;
                _data[i].z = _Points[i].Z;

                _dataColor[i] = new vec3(_Points[i].ToolColor.R / 255.0f, _Points[i].ToolColor.G / 255.0f, _Points[i].ToolColor.B / 255.0f);
            }

            _dataTail = _Points.Count;

            //  Create the vertex array object.
            vertexBufferArray = new VertexBufferArray();
            vertexBufferArray.Create(GL);
            vertexBufferArray.Bind(GL);

            //  Create a vertex buffer for the vertex data.
            var vertexDataBuffer = new VertexBuffer();
            vertexDataBuffer.Create(GL);
            vertexDataBuffer.Bind(GL);
            vertexDataBuffer.SetData(GL, attribute_vpos, _data, false, 3);

            //  Now do the same for the colour data.
            var colourDataBuffer = new VertexBuffer();
            colourDataBuffer.Create(GL);
            colourDataBuffer.Bind(GL);
            colourDataBuffer.SetData(GL, attribute_vcol, _dataColor, false, 3);

            //  Unbind the vertex array, we've finished specifying data for it.
            vertexBufferArray.Unbind(GL);

            //  Bind the shader, set the matrices.
            shaderProgram.Bind(GL);

            // Set matrixs for shader program
            float rads = (90.0f / 360.0f) * (float)Math.PI * 2.0f;
            mat4 _mviewdata = glm.translate(new mat4(1f), new vec3(_track_X, _track_Y, _track_Z));
            mat4 _projectionMatrix = glm.perspective(rads, (float)this.trackgl_control.Height / (float)this.trackgl_control.Width, 0.001f, 1000f);
            mat4 _modelMatrix = glm.lookAt(new vec3(0, 0, -1), new vec3(0, 0, 0), new vec3(0, -1, -1));

            shaderProgram.SetUniformMatrix4(GL, "projectionMatrix", _projectionMatrix.to_array());
            shaderProgram.SetUniformMatrix4(GL, "viewMatrix", _modelMatrix.to_array());
            shaderProgram.SetUniformMatrix4(GL, "modelMatrix", _mviewdata.to_array());

            //  Bind the out vertex array.
            vertexBufferArray.Bind(GL);

            GL.LineWidth(5.0f);
            //  Draw the square.
            GL.DrawArrays(OpenGL.GL_LINE_STRIP, 0, _dataTail);

            //  Unbind our vertex array and shader.
            vertexBufferArray.Unbind(GL);
            shaderProgram.Unbind(GL);
        }
        catch (Exception ex) { MessageBox.Show("CreateAndPlotData" + "\n" + ex.ToString()); }
    }

这就是我得到的
在此处输入图像描述

如您所见,所有线条的宽度都相同。所以,我的问题是:有人知道我能做些什么吗?还有一个:如果我需要显示仪器当前位置的一个点怎么办?我应该用一个 Vertex 创建另一个数组吗?

ps对不起我的英语,这里是我用glBegin/glEnd得到的图片
在此处输入图像描述


没有标签垃圾邮件的意图。
我正在做这个项目,部分由 C++ 和 C# 中的教程指导。因此,如果有人知道如何在 C++ 中做到这一点,那么在这种情况下,我将尝试在 C# 中实现相同的功能。

4

0 回答 0