夜凌云 發表於 2014-7-14 14:44:50

Delphi下OpenGL2d绘图之画线的方法

<p><strong>一、前言:</strong></p>
<p><strong>Delphi画线方法与画点基本上是相同的。区别在于glBegin()的参数。</strong>绘制的框架代码可以参考Delphi下OpenGL2d绘图初始化中的代码,地址为https://www.jb51.net/article/52141.htm。修改的部份为 Draw 函数的内容。</p>
<p><strong>二、画线步骤:</strong></p>
<p>GL_LINES:把每一个顶点作为一个独立的线段,顶点2n-1和2n之间共定义了n条线段,总共绘制N/2条线段<br />
GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,总共绘制n-1条线段<br />
GL_LINE_LOOP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,然后最后一个顶点和第一个顶点相连,第n和n+1个顶点定义了线段n,总共绘制n条线段</p>
<p>画线可能用到以下函数:</p>
<p>glLineWidth() 设置<span style="color: #0000ff">线条宽度<br />
</span>glShadeModel() 设置<span style="color: #0000ff">颜色过渡模式<br />
</span>glColor3f() 设置<span style="color: #0000ff">线条颜色</span></p>
<div class="jb51code">
<pre class="brush:delphi;">
procedure TForm1.Draw;<br />begin<br />&nbsp; // 清空缓冲区<br />&nbsp; glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);<br />&nbsp; // ----------- GL_LINES -----------<br />&nbsp; // 设置线宽<br />&nbsp; glLineWidth(5);<br />&nbsp; // 两点间渐变色<br />&nbsp; glShadeModel(GL_SMOOTH);<br />&nbsp; glBegin(GL_LINES);&nbsp; // 画线<br />&nbsp; // 设置起点线的颜色<br />&nbsp; glColor3f(1, 0, 0);<br />&nbsp; // 绘制起点<br />&nbsp; glVertex2f(50, 50);<br />&nbsp; // 设置末点线的颜色<br />&nbsp; glColor3f(0, 0, 1);<br />&nbsp; // 绘画末点<br />&nbsp; glVertex2f(200, 200);<br />&nbsp; glEnd;<br />&nbsp; // 两点间同颜色<br />&nbsp; glShadeModel(GL_FLAT);<br />&nbsp; glBegin(GL_LINES);<br />&nbsp; glColor3f(0, 1, 0);<br />&nbsp; glVertex2f(200, 50);<br />&nbsp; glColor3f(1, 1, 0);<br />&nbsp; glVertex2f(50, 200);<br />&nbsp; glEnd;<br />&nbsp; // ----------- GL_LINE_LOOP -----------<br />&nbsp; // 三个点闭环形成一个三角形&nbsp; glShadeModel(GL_SMOOTH); 不起作用<br />&nbsp; glLineWidth(1);<br />&nbsp; glBegin(GL_LINE_LOOP);<br />&nbsp; glColor3f(0, 0, 1);<br />&nbsp; glVertex2f(250, 50);<br />&nbsp; glVertex2f(250, 200);<br />&nbsp; glVertex2f(280, 150);<br />&nbsp; glEnd;<br />&nbsp; // ----------- GL_LINE_STRIP -----------<br />&nbsp; // 多点折线&nbsp;&nbsp;&nbsp; glShadeModel(GL_SMOOTH); 不起作用<br />&nbsp; glLineWidth(1);<br />&nbsp; glBegin(GL_LINE_STRIP);<br />&nbsp; glColor3f(1, 0, 255);<br />&nbsp; glVertex2f(350, 50);<br />&nbsp; glVertex2f(400, 200);<br />&nbsp; glVertex2f(480, 150);<br />&nbsp; glVertex2f(490, 60);<br />&nbsp; glEnd;<br />&nbsp; SwapBuffers(FDC); //交换双缓冲区内容,这将把刚绘制的图形翻印到屏幕上。<br />end;</pre>
</div>
<p>可以看到第一个X线条颜色渐变的,OpenGL默认情况下是这种样式。opengl中提供了一个函数glShadeModel来决定如何处理这种不同颜色的情况。</p>
<div class="jb51code">
<pre class="brush:delphi;">
glShadeModel(GL_SMOOTH); // 平滑方式,这也是opengl的默认处理方式,实现颜色渐变的效果
glShadeModel(GL_FLAT);// 单色方式,线段的颜色以某一个顶点的颜色为准,由具体实现决定。为了避免不确定性,应尽量在多边形中使用同一种颜色

</pre>
</div>
<p>经过测试后发现,在GL_LINE_LOOP与GL_LINE_STRIP样式下,渐变效果无效!具体原因有待进一步查明。</p>
<p>另外,OpenGL提供了抗锯齿的功能,函数为</p>
<div class="jb51code">
<pre class="brush:delphi;">
glEnable(GL_LINE_SMOOTH); //启用
glHint(GL_LINE_SMOOTH,GL_NICEST);
glDisable(GL_LINE_SMOOTH); //关闭

</pre>
</div>
<p>使用后发现抗锯齿效果不明显。有待进一步继续再研究。</p>
<p>完整代码点此下载</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Delphi下OpenGL2d绘图之画四边形的方法</li><li>Delphi下OpenGL2d绘图之画点的方法</li><li>Delphi使用OpenGL2d绘图之画图片Bmp的方法</li><li>opengl实现任意两点间画圆柱体</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Delphi下OpenGL2d绘图之画线的方法