opengl超级宝典笔记—Using OpenGL(二)

<p><b>OpenGL数据类型 <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c3484e03-3c82-47ba-9eed-e7b3e1fe8bc1" class="wlWriterEditableSmartContent">Technorati 标记: <a href="http://technorati.com/tags/opengl" rel="tag">opengl</a></div> </b></p> <p><a href="http://static.oschina.net/uploads/img/201309/04220303_EYrW.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201309/04220304_lE2M.png" width="1032" height="381" /></a></p> <p><b>函数命名约定</b></p> <p><b> <br /></b></p> <p>&lt;函数库前缀&gt;&lt;命令名称&gt;&lt;可选的参数个数&gt;&lt;可选的参数类型&gt;</p> <p>例子:</p> <p>glColor3f 代表是gl函数库里的 color命令,此命令有3个参数,参数类型是f</p> <p><b>平台独立性</b></p> <p>openGL没有创建窗口,处理按键输入,鼠标点击事件等函数。创建和管理窗口是操作系统本身应支持的功能。OpenGL是平台独立的图形硬件的抽象接口库。</p> <p><b>使用OpenGL画图</b></p> <p><b> <pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 650px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 1: #include &lt;gl/glut.h&gt; </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 2: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 3: #include &lt;gl/GL.h&gt; </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 4: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 5: <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> RenderScenceCB() </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 6: { </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 7: glClear( GL_COLOR_BUFFER_BIT ); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 8: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 9: glColor3f( 0.0f, 1.0f, 0.0f ); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 10: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 11: glRectf( -25.0f, 25.0f, 25.0f, -25.0f ); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 12: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 13: glFlush(); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 14: } </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 15: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 16: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 17: <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> CreateWindow() </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 18: { </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 19: glutInitWindowPosition( 200, 200 ); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 20: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 21: glutInitWindowSize( 200, 200 ); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 22: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 23: glutCreateWindow( &quot;<span style="color: #8b0000">opengl step 1</span>&quot; ); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 24: } </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 25: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 26: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 27: <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> ChangeSize( GLsizei w, GLsizei h ) </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 28: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 29: { </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 30: <span style="color: #008000">/* 设置视口 */</span> </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 31: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 32: glViewport( 0, 0, w, h ); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 33: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 34: glMatrixMode( GL_PROJECTION ); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 35: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 36: glLoadIdentity(); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 37: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 38: <span style="color: #0000ff">if</span> ( h == 0 ) </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 39: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 40: { </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 41: h = 1; </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 42: } </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 43: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 44: GLfloat aspectRatio = (GLfloat) w / (GLfloat) h; </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 45: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 46: <span style="color: #0000ff">if</span> ( w &lt;= h ) </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 47: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 48: { </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 49: glOrtho( -100.0f, 100.0f, -100.0f / aspectRatio, 100.0f / aspectRatio, 1.0, -1.0 ); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 50: }<span style="color: #0000ff">else</span> { </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 51: glOrtho( -100.0f * aspectRatio, 100.0f * aspectRatio, -100.0f, 100.0f, 1.0, -1.0 ); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 52: } </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 53: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 54: glMatrixMode( GL_MODELVIEW ); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 55: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 56: glLoadIdentity(); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 57: } </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 58: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 59: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 60: <span style="color: #0000ff">int</span> main( <span style="color: #0000ff">int</span> args, <span style="color: #0000ff">char</span> *argc[] ) </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 61: { </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 62: glutInit( &amp;args, argc ); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 63: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 64: glutInitDisplayMode( GLUT_SINGLE | GLUT_RGBA ); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 65: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 66: CreateWindow(); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 67: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 68: glutDisplayFunc( RenderScenceCB ); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 69: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 70: glutReshapeFunc( ChangeSize ); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 71: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 72: glClearColor( 1.0f, 0.0f, 0.0f, 0.0f ); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 73: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 74: glutMainLoop(); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 75: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 76: <span style="color: #0000ff">return</span>(0); </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 77: } </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 78: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 79: </pre><pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,&#39;Courier New&#39;,courier,monospace; font-size: 12px"> 80: </pre></pre>

<br /></b></p>

<p><a href="http://static.oschina.net/uploads/img/201309/04220305_ngK9.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Image(1)" border="0" alt="Image(1)" src="http://static.oschina.net/uploads/img/201309/04220305_m762.png" width="232" height="244" /></a></p>

<p><b>画一个矩形</b></p>

<p>设置当前使用的颜色</p>

<p>glColor3f(0.0f, 1.0f, 0.0f);</p>

<p>画一个矩形,并用当前颜色填充</p>

<p>glRectf(-25.0f, 25.0f, 25.0f, -25.0f);</p>

<p>这两个函数的使用方式参考,官方函数文档</p>

<p><a href="http://www.opengl.org/sdk/docs/man2/xhtml/glColor.xml">http://www.opengl.org/sdk/docs/man2/xhtml/glColor.xml</a></p>

<p><a href="http://www.opengl.org/sdk/docs/man2/xhtml/glRect.xml">http://www.opengl.org/sdk/docs/man2/xhtml/glRect.xml</a></p>

<p>openGL是如何把这些坐标映射到真是的窗体的位置的。这个就是使用了ChangeSize这个回调函数。</p>

<p>通过glutReshapeFunc设置这个回调函数,当窗体的大小发生改变时,就会调用你设置的回调函数。</p>

<p>每次窗体大小的改变,我们都应该重新定义视口和裁剪区域以适应新的窗口尺寸。我们希望绘制的图像能够适应窗体的大小。</p>

<p><b>设置视口(ViewPort)和裁剪区域(Clipping volume)</b></p>

<p>视口和裁剪区域是如何影响坐标系范围,以及2D和3D的图像在屏幕上显示的。如下图:</p>

<p><a href="http://static.oschina.net/uploads/img/201309/04220305_Oym4.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Image(2)" border="0" alt="Image(2)" src="http://static.oschina.net/uploads/img/201309/04220306_IOHL.png" width="740" height="369" /></a></p>

<p><a href="http://static.oschina.net/uploads/img/201309/04220309_YEYn.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Image(3)" border="0" alt="Image(3)" src="http://static.oschina.net/uploads/img/201309/04220309_WwSp.png" width="745" height="347" /></a></p>

<p><b>定义视口</b></p>

<p><b> <br /></b></p>

<p><b>void glViewPort(GLint x, GLint y, GLint width, GLint height);</b></p>

<p>参数x,y制定了左下角的坐标。width和height参数制定了尺寸以像素为单位。</p>

<p><a href="http://static.oschina.net/uploads/img/201309/04220309_93MX.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Image(4)" border="0" alt="Image(4)" src="http://static.oschina.net/uploads/img/201309/04220311_dS1U.png" width="786" height="392" /></a></p>

<p><b>定义裁剪区域</b></p>

<p><code>void <b>glOrtho</b>(</code>

<br />GLdouble   <br /><var>left</var>,</p>

<p>GLdouble&#160;&#160; <br /><var>right</var>,</p>

<p>GLdouble&#160;&#160; <br /><var>bottom</var>,</p>

<p>GLdouble&#160;&#160; <br /><var>top</var>,</p>

<p>GLdouble&#160;&#160; <br /><var>nearVal</var>,</p>

<p>GLdouble&#160;&#160; <br /><var>farVal</var><code>)</code>;</p>

<h4>Parameters</h4> <dl><dt><em><code>left</code></em>, <em><code>right</code></em></dt><dd> <p>Specify the coordinates for the left and right vertical clipping planes.</p>

</dd><dt><em><code>bottom</code></em>, <em><code>top</code></em></dt><dd> <p>Specify the coordinates for the bottom and top horizontal clipping planes.</p>

</dd><dt><em><code>nearVal</code></em>, <em><code>farVal</code></em></dt><dd> <p>Specify the distances to the nearer and farther depth clipping planes. These values are negative if the plane is to be behind the viewer.</p> </dd></dl>

<p>这个函数重新定义了裁剪区域,使得纵横比不变。纵横比就是在垂直方向上的一个单位长度内的像素个数与水平方向上一个单位长度内的像素个数的比值。上面的例子使用的是正投影。</p>

<p>在调用glOrtho之前,要注意调用下面两个函数</p>

<p>glMatrixMode(GL_PROJECTION);</p>

<p>glLoadIdentity();</p>

<p>投影矩阵是定义可视区域的地方。glOrtho并不建立新的裁剪区域,而是对之前的裁剪区域进行修改。它把当前裁剪区域的矩阵与参数所提供的矩阵相乘,得到新的裁剪区域。glLoadIdentity();就是对当前的坐标系系统进行重置。</p>

<p>下面的代码可以使得正方形保持正方形</p>

<p><code></code><code>if</code> <code>(w &lt;= h)</code></p>

<p><code></code><code>{</code></p>

<p><code></code><code>glOrtho(-100.0f, 100.0f, -100.0f/aspectRatio, 100.0f/aspectRatio, 1.0, -1.0);</code></p>

<p><code></code><code>}</code></p>

<p><code></code><code>else</code></p>

<p><code></code><code>{</code></p>

<p><code></code><code>glOrtho(-100.0f*aspectRatio, 100.0f*aspectRatio, -100.0f, 100.0f, 1.0, -1.0);</code></p>

<p><code></code><code>}</code></p>

<p><code> <br /></code></p>

<p><code>这个函数调用使得裁剪区域 左边总是位于-100,右边则扩展到100除非窗口的宽度大于高度,此时水平范围则会根据纵横比进行缩放。同理当高度大于宽度时,上下要进行缩放。这样就可以保持一个200X200的正方形(中心为(0,0))与窗口的形状无关。如下图:</code></p>

<p>&#160;</p>

<a href="http://static.oschina.net/uploads/img/201309/04220311_dJyk.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Image" border="0" alt="Image" src="http://static.oschina.net/uploads/img/201309/04220312_Gtfr.png" width="927" height="379" /></a>

转载于:https://my.oschina.net/sweetdark/blog/159209

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值