[OpenGL+FreeType]模拟黑客帝国数码雨

头像
523066680
Administrator
Administrator
帖子: 340
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 30 times
Been thanked: 27 times
联系:

[OpenGL+FreeType]模拟黑客帝国数码雨

帖子 #1 523066680 » 2016年12月04日 17:16

还在完善中

初版 Demo



此版通过 freetype 提取汉字轮廓,线绘。

第三阶段完成后开始发代码 (代码有点乱啊)

头像
523066680
Administrator
Administrator
帖子: 340
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 30 times
Been thanked: 27 times
联系:

Re: [OpenGL+FreeType]模拟黑客帝国数码雨

帖子 #2 523066680 » 2016年12月04日 17:59

第二阶段
图片

随机找一些代码
图片

搞明白了二次 Bezier、三次 Bezier 曲线,自己写函数计算轮廓细节。
其次使用现成的 tessellation 函数对轮廓进行三角形细分、填充。

完整程序,以及编译运行所需的库,目标程序在 XP32位 以及 WIN764位平台 测试无误
Demo32_64.7z
(1.66 MiB) 下载 72 次
Demo32_64.7z
(1.66 MiB) 下载 72 次

头像
523066680
Administrator
Administrator
帖子: 340
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 30 times
Been thanked: 27 times
联系:

Re: [OpenGL+FreeType]模拟黑客帝国数码雨

帖子 #3 523066680 » 2016年12月05日 11:07

在第三阶段出来之前,对前面的效果又做了改善

图片

Code: [全选] [展开/收缩] [Download] (Rain025.c)
  1. // Matrix.c, v2.5
  2. // CodeBy: 523066680
  3. // 2016-11
  4.  
  5. #include <GL/glut.h>
  6. #include <unistd.h>
  7. #include <stdio.h>
  8. #include <time.h>
  9.  
  10. #include <ft2build.h>
  11. #include <freetype/ftbbox.h>
  12. #include <freetype/ftoutln.h>
  13. #include FT_FREETYPE_H
  14.  
  15. #define SIZE_X 500
  16. #define SIZE_Y 500
  17. #define N_RAIN 50
  18. #define N_TEXT 30
  19.  
  20. int winID;
  21. FT_Library      library;
  22. FT_Face         face;
  23.  
  24. FT_GlyphSlot    slot;
  25. FT_Error        error;
  26. FT_Outline      outline;
  27. FT_BBox         box;
  28.  
  29. GLUtesselator   *tobj;
  30.  
  31. static double vtx[5000][3];
  32. static int    vtx_contours[100];
  33. static int    Vi;
  34. static int    vtx_ctsi;
  35. static float  red = 0.0;
  36. static int    PARTS = 3.0;  //曲线细分程度
  37. static long   code;
  38.  
  39. typedef struct
  40. {
  41.     float x;
  42.     float y;
  43. }
  44. point;
  45.  
  46. void GetDatafromOutline(void);
  47. int LoadGlyph(long symbol);
  48.  
  49. float angx = 0.0;
  50. float angy = 0.0;
  51. float angz = 0.0;
  52. float progress[N_RAIN];
  53. float speed[N_RAIN];
  54. float bright[N_RAIN];
  55. float RXlist[N_RAIN];
  56. float RYlist[N_RAIN];
  57. float RZlist[N_RAIN];
  58. //char uni[] = "    abcdefghijklmnopqrstuvwxyz,ABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$%&*+-={}[];'<>,.?";
  59.  
  60. long uni[] = {
  61.    32, 30721, 26080, 30721, 20197, 21450, 20154, 20043, 30721, 65292,
  62. 22825, 20043, 36947, 65292, 25439, 26377, 20313, 32780, 34917, 19981,
  63. 36275, 65292, 26159, 25925, 34394, 32988, 23454, 65292, 19981, 36275,
  64. 32988, 26377, 20313, 12290, 20854, 24847, 21338, 65292, 20854, 29702,
  65. 22885, 65292, 20854, 36259, 28145, 65292, 22825, 22320, 20043, 35937,
  66. 20998, 65292, 38452, 38451, 20043, 20505, 21015, 65292, 21464, 21270,
  67. 20043, 30001, 34920, 65292, 27515, 29983, 20043, 20806, 24432, 65292,
  68. 19981, 35851, 32780, 36951, 36857, 33258, 21516, 65292, 21247, 32422,
  69. 32780, 24189, 26126, 26031, 22865, 65292, 31293, 20854, 35328, 26377,
  70. 24494, 65292, 39564, 20043, 20107, 19981, 24530, 65292, 35802, 21487,
  71. 35859, 33267, 36947, 20043, 23447, 65292, 22857, 29983, 20043, 22987,
  72. 30691, 12290, 20551, 33509, 22825, 26426, 36805, 21457, 65292, 22937,
  73. 35782, 29572, 36890, 65292, 25104, 35851, 34429, 23646, 20046, 29983,
  74. 30693, 65292, 26631, 26684, 20134, 36164, 20110, 27835, 35757, 65292,
  75. 26410, 23581, 26377, 34892, 19981, 30001, 36865, 65292, 20986, 19981,
  76. 30001, 20135, 32773, 20134, 12290, 28982, 21051, 24847, 30740, 31934,
  77. 65292, 25506, 24494, 32034, 38544, 65292, 25110, 35782, 22865, 30495,
  78. 35201, 65292, 21017, 30446, 29275, 26080, 20840, 65292, 25925, 21160,
  79. 21017, 26377, 25104, 65292, 29369, 39740, 31070, 24189, 36190, 65292,
  80. 32780, 21629, 19990, 22855, 26480, 65292, 26102, 26102, 38388, 20986,
  81. 28937, 12290, 86, 73, 67, 26472
  82. };
  83. static int n_char;
  84. static int arr[N_RAIN][N_TEXT];
  85. static float alpha[N_RAIN][N_TEXT];
  86.  
  87. void beginCallback(GLenum which)
  88. {
  89.     glBegin(which);
  90. }
  91.  
  92. void endCallback(void)
  93. {
  94.     glEnd();
  95. }
  96.  
  97. void errorCallback(GLenum errorCode)
  98. {
  99.     const GLubyte *estring;
  100.  
  101.     estring = gluErrorString(errorCode);
  102.     fprintf(stderr, "Tessellation Error: %s\n", estring);
  103.     exit(0);
  104. }
  105.  
  106. void vertexCallback(GLdouble *vertex)
  107. {
  108.     //const GLdouble *pointer;
  109.     //pointer = (GLdouble *) vertex;
  110.     glNormal3f(0.0, 0.0, 1.0);
  111.     glVertex3dv(vertex);
  112. }
  113.  
  114. void CALLBACK combineCallback(GLdouble coords[3], GLdouble *data[4],
  115.                      GLfloat weight[4], GLdouble **dataOut )
  116. {
  117.    GLdouble *vertex;
  118.    vertex = (GLdouble *) malloc(3 * sizeof(GLdouble));
  119.  
  120.    vertex[0] = coords[0];
  121.    vertex[1] = coords[1];
  122.    vertex[2] = coords[2];
  123.    *dataOut = vertex;
  124. }
  125.  
  126. void PointOnQuadBeizer(point cp[3], double t, double *vt )
  127. {
  128.     double cx, bx, ax, cy, by, ay;
  129.  
  130.     ax = cp[1].x - cp[0].x;
  131.     ay = cp[1].y - cp[0].y;
  132.  
  133.     bx = cp[2].x - cp[1].x;
  134.     by = cp[2].y - cp[1].y;
  135.  
  136.     cx = (bx * t + cp[1].x) - (ax * t + cp[0].x);
  137.     cy = (by * t + cp[1].y) - (ay * t + cp[0].y);
  138.  
  139.     vt[0] = cx*t + (ax * t + cp[0].x);
  140.     vt[1] = cy*t + (ay * t + cp[0].y);
  141.     vt[2] = 0.0;
  142. }
  143.  
  144. void display(void)
  145. {
  146.     int errcode;
  147.     int bgn;
  148.     int i, j;
  149.     int start;
  150.     // 清理颜色缓冲区
  151.     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  152.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  153.  
  154.     glPushMatrix();
  155.     glRotatef(angy, 0.0, 0.5, 0.0);
  156.     glRotatef(angx, 1.0, 0.0, 0.0);
  157.     glRotatef(angz, 0.0, 0.0, 1.0);
  158.  
  159.     glColor3f(0.3, 0.8, 0.3);
  160.  
  161.     for (int m = 0; m < N_RAIN; m++)
  162.     {
  163.         glPushMatrix();
  164.        
  165.         //glTranslatef(-12000.0 + RXlist[m], 5000.0 + RYlist[m],  RZlist[m]);
  166.         glTranslatef(RXlist[m], RYlist[m]+6000.0, RZlist[m]);
  167.         glRotatef( (float)m/(float)N_RAIN * 60.0 , 0.0, 1.0, 0.0 );
  168.         for (int n = 0; n < N_TEXT ; n++ )
  169.         {
  170.             //向下移位
  171.             glTranslatef(0.0, -1000.0, 0.0);
  172.  
  173.             //Matrix for scale
  174.             glPushMatrix();
  175.             // glRotatef(90.0, 0.0, 0.0, 1.0);
  176.             if ( n == bright[m] )
  177.             {
  178.                 glScalef(1.1, 1.1, 1.1);
  179.                 glColor4f(0.2, 0.8, 0.2, 1.0);
  180.             }
  181.             else
  182.             {
  183.                 glColor4f(0.1, (float)n/(float)N_TEXT+0.5, 0.5, alpha[m][n] );
  184.             }
  185.  
  186.             alpha[m][n] -= 0.03;
  187.             glCallList( arr[m][n] );
  188.             glPopMatrix();
  189.         }        
  190.         glPopMatrix();
  191.  
  192.     }
  193.     glPopMatrix();
  194.  
  195.     // glPushMatrix();
  196.     // glTranslatef(-15000.0, 15000.0, 0);
  197.     // glColor3f(0.3, 0.7, 0.5);
  198.     // for (i = 3; i >=0; i--)
  199.     // {
  200.     //     glCallList( n_char - i );
  201.     //     glTranslatef(1000.0, 0.0, 0.0);
  202.     // }
  203.     // glPopMatrix();
  204.  
  205.     glutSwapBuffers();
  206. }
  207.  
  208. void idle(void)
  209. {
  210.     usleep(30000);
  211.     angy += 0.3;
  212.     //angz += 1.0;
  213.  
  214.     int r;
  215.     for (int i = 0; i < N_RAIN; i++ )
  216.     {
  217.         if ( progress[i] < n_char  )
  218.         {
  219.             progress[i] += speed[i];
  220.             arr[i][ (int)progress[i] % N_TEXT ] = (int)progress[i];
  221.             alpha[i][ (int)progress[i] % N_TEXT ] = 1.0;
  222.         }
  223.         else
  224.         {
  225.             progress[i] = 1.0;
  226.             RYlist[i] = (float)(rand() % 20 - 10) * 1000.0;
  227.         }
  228.         bright[i] = (int)progress[i] % N_TEXT;
  229.     }
  230.  
  231.  
  232.     glutPostRedisplay();
  233. }
  234.  
  235. void reshape(int Width, int Height)
  236. {
  237.     const float fa = 20000.0;
  238.     const float half = 8000.0;
  239.  
  240.     float w = (float)Width;
  241.     float h = (float)Height;
  242.  
  243.     glViewport(0, 0, Width, Height);     //视口范围
  244.     glMatrixMode(GL_PROJECTION);         // 投影视图矩阵
  245.     glLoadIdentity();
  246.     //glOrtho(-half, half, -half, half, 0.0, 40000.0);
  247.     gluPerspective(80.0, w/h, 100.0, 40000.0);
  248.     glMatrixMode(GL_MODELVIEW);         // 模型视图矩阵
  249.     glLoadIdentity();
  250.     gluLookAt(0.0,0.0,fa, 0.0,0.0,0.0, 0.0,1.0,fa);
  251.             // 观察点,   朝向的坐标, 观察点向上坐标
  252. }
  253.  
  254. void keypress(unsigned char key, int mousex, int mousey)
  255. {
  256.     int errcode;
  257.     switch (key)
  258.     {
  259.         case 'q':
  260.         case 'Q':
  261.             glutDestroyWindow(winID);
  262.             exit(0);
  263.             break;            
  264.         case 'w':
  265.         case 'W':
  266.             angx += 1.0;
  267.             glutPostRedisplay();
  268.             break;
  269.         case 's':
  270.         case 'S':
  271.             angx -= 1.0;
  272.             glutPostRedisplay();
  273.             break;
  274.         case 'a':
  275.         case 'A':
  276.             angz += 1.0;
  277.             glutPostRedisplay();
  278.             break;
  279.         case 'd':
  280.         case 'D':
  281.             angz -= 1.0;
  282.             glutPostRedisplay();
  283.             break;
  284.         case 'j':
  285.         case 'J':
  286.             angy += 2.0;
  287.             glutPostRedisplay();
  288.             break;
  289.         case 'k':
  290.         case 'K':
  291.             angy -= 2.0;
  292.             glutPostRedisplay();
  293.             break;
  294.     }
  295. }
  296.  
  297. void init(void)
  298. {
  299.     int errcode;
  300.     Vi = 0;
  301.     vtx_ctsi = 0;
  302.     int bgn;
  303.     int next;
  304.     int base;  //for Display List
  305.  
  306.     //glutFullScreen();
  307.     srand( time(NULL) );
  308.     glClearColor(0.0, 0.0, 0.0, 0.0);
  309.     glLineWidth( 1.0 );
  310.     glPointSize( 2.0 );
  311.     glEnable(GL_BLEND);
  312.     glEnable(GL_DEPTH_TEST);
  313.     glEnable(GL_POINT_SMOOTH);
  314.     glEnable(GL_LINE_SMOOTH);
  315.     //glEnable(GL_POLYGON_SMOOTH);
  316.  
  317.     tobj = gluNewTess();
  318.     //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  319.     gluTessCallback(tobj, GLU_TESS_VERTEX, glVertex3dv);
  320.     gluTessCallback(tobj, GLU_TESS_BEGIN,  beginCallback);
  321.     gluTessCallback(tobj, GLU_TESS_END,    endCallback);
  322.     gluTessCallback(tobj, GLU_TESS_ERROR,  errorCallback);
  323.     gluTessCallback(tobj, GLU_TESS_COMBINE,combineCallback);
  324.     //gluTessProperty(tobj, GLU_TESS_BOUNDARY_ONLY, GL_TRUE);
  325.     gluTessProperty(tobj, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD);
  326.    
  327.     for (int i = 0; i < N_RAIN; i++)
  328.     {
  329.         //制造参差效果
  330.         RXlist[i] = (float)(rand() % 20 - 10) * 1500.0;
  331.         RYlist[i] = (float)(rand() % 20 - 10) * 500.0;
  332.         RZlist[i] = (float)(rand() % 20 - 10) * 1000.0;
  333.  
  334.         //随机进度、递进速度
  335.         progress[i] = (float) ((rand()%50 + 1) * 1);
  336.         speed[i]    = (float) ( rand()%5 + 2) / 10.0;
  337.        
  338.         //填入空白;显示列表的索引,从1开始
  339.         for (int j = 0; j < N_TEXT; j++)
  340.         {
  341.             arr[i][j] = 1;
  342.             alpha[i][j]    = 1.0;
  343.         }
  344.     }
  345.  
  346.     // 创建显示列表
  347.     n_char = sizeof(uni)/sizeof(uni[0]);
  348.     base = glGenLists( n_char );
  349.  
  350.     //每个字符的点数据(已经对曲线求值了的)整理到 glyph 数组
  351.     for (int code = 0; code < n_char; code++ )
  352.     {
  353.         errcode = LoadGlyph( uni[code] );
  354.         //处理坐标、曲线数据到vtx数组
  355.         GetDatafromOutline();
  356.  
  357.         glNewList(base+code, GL_COMPILE);
  358.         gluTessBeginPolygon(tobj, NULL);
  359.         for (int cti = 0; cti < vtx_ctsi ; cti++ )
  360.         {
  361.             gluTessBeginContour(tobj);
  362.             int pti = (cti == 0 ? 0 : vtx_contours[cti-1] + 1 );
  363.             for (; pti <= vtx_contours[cti]; pti++ )
  364.             {
  365.                 gluTessVertex(tobj, vtx[pti], vtx[pti] );
  366.             }
  367.             gluTessEndContour(tobj);    
  368.         }
  369.         gluTessEndPolygon(tobj);
  370.  
  371.         for (int cti = 0; cti < vtx_ctsi; cti++ )
  372.         {
  373.             glBegin(GL_QUAD_STRIP);
  374.             int pti = (cti == 0 ? 0 : vtx_contours[cti-1] + 1 );
  375.             for (; pti <= vtx_contours[cti]; pti++ )
  376.             {
  377.                 glVertex3f( vtx[pti][0], vtx[pti][1], 0.0 );
  378.                 glVertex3f( vtx[pti][0], vtx[pti][1], -20.0 );
  379.             }
  380.             glEnd();
  381.         }
  382.  
  383.         glEndList();
  384.     }
  385.  
  386. }
  387.  
  388. void ftinit(void)
  389. {
  390.     char*   filename;
  391.     filename = "C:/windows/fonts/STXingKa.ttf";
  392.  
  393.     error = FT_Init_FreeType( &library );
  394.     error = FT_New_Face( library, filename, 0, &face );  /* create face object */
  395. }
  396.  
  397. int LoadGlyph(long symbol)
  398. {
  399.     //这里可以是unicode编码值,字体必须支持才行
  400.     FT_UInt index = FT_Get_Char_Index(face, symbol);
  401.  
  402.     if (index <= 0)
  403.     {
  404.         printf("Error in %d\n", symbol);
  405.         return 1;
  406.     }
  407.     else
  408.     {
  409.         //printf("no problem in %d\n", symbol);
  410.         FT_Error error = FT_Load_Glyph(face,
  411.                                        index,
  412.                                        FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP);
  413.         slot = face->glyph;
  414.         outline = slot->outline;
  415.         FT_Outline_Get_BBox( &outline, &box );
  416.         return 0;
  417.     }
  418. }
  419.  
  420. //Function by 523066680
  421. void GetDatafromOutline(void)
  422. {
  423.     Vi = 0;
  424.     vtx_ctsi = 0;
  425.     int bgn;
  426.     int next;
  427.     point lastpt;
  428.     point cp[3];
  429.  
  430.     for (int cts = 0; cts < outline.n_contours; cts++ )
  431.     {
  432.         bgn = ( cts == 0 ? 0 : outline.contours[cts-1] + 1 );
  433.  
  434.         for (int i = bgn; i <= outline.contours[cts] ; i++)
  435.         {
  436.             //i==终点时,next回到某个轮廓的起点
  437.             next = ( i == outline.contours[cts] ? bgn : i+1 );
  438.  
  439.             if ( outline.tags[i] == 0 )
  440.             {
  441.                 cp[1].x = (double)outline.points[i].x;
  442.                 cp[1].y = (double)outline.points[i].y;
  443.  
  444.                 if ( outline.tags[i-1] == 1 )            //1, 0
  445.                 {
  446.                     cp[0].x = (double)outline.points[i-1].x;
  447.                     cp[0].y = (double)outline.points[i-1].y;
  448.  
  449.                     if (outline.tags[next] == 1)         //1, 0, 1      
  450.                     {
  451.                         cp[2].x = (double) outline.points[next].x;
  452.                         cp[2].y = (double) outline.points[next].y;
  453.  
  454.                         for (float i = 0.0; i < PARTS; i+=1.0 )
  455.                         {
  456.                             PointOnQuadBeizer(cp, i/PARTS, vtx[Vi]);
  457.                             Vi++;
  458.                         }
  459.                     }
  460.                     else                                 //1, 0, 0
  461.                     {
  462.                         cp[2].x = (double)(outline.points[i].x + outline.points[next].x)/2;
  463.                         cp[2].y = (double)(outline.points[i].y + outline.points[next].y)/2;
  464.  
  465.                         for (float i=0.0; i <PARTS; i+=1.0 )
  466.                         {
  467.                             PointOnQuadBeizer(cp, i/PARTS, vtx[Vi]);
  468.                             Vi++;
  469.                         }
  470.                     }
  471.                 }
  472.                 else                                     //0, 0
  473.                 {
  474.                     //起点为上一段曲线的终点 而上一段曲线终点可能是计算出来的
  475.                     cp[0].x = lastpt.x;
  476.                     cp[0].y = lastpt.y;
  477.  
  478.                     if ( outline.tags[next] == 0 )       //0, 0, 0
  479.                     {
  480.                         cp[2].x = (double)(outline.points[i].x + outline.points[next].x)/2 ;
  481.                         cp[2].y = (double)(outline.points[i].y + outline.points[next].y)/2 ;
  482.  
  483.                         for (float i=0.0; i < PARTS; i+=1.0 )
  484.                         {
  485.                             PointOnQuadBeizer(cp, i/PARTS, vtx[Vi]);
  486.                             Vi++;
  487.                         }
  488.                     }
  489.                     else                                 //0, 0, 1
  490.                     {
  491.                         cp[2].x = (double)outline.points[next].x ;
  492.                         cp[2].y = (double)outline.points[next].y ;
  493.  
  494.                         for (float i=0.0; i < PARTS; i+=1.0 )
  495.                         {
  496.                             PointOnQuadBeizer(cp, i/PARTS, vtx[Vi]);
  497.                             Vi++;
  498.                         }
  499.                     }
  500.                 }
  501.                 lastpt.x = cp[2].x;
  502.                 lastpt.y = cp[2].y;
  503.             }
  504.             else
  505.             {
  506.                 //直线线段  只记录当前点
  507.                 if ( outline.tags[next] == 1 )           //1, 1
  508.                 {  
  509.                     vtx[Vi][0] = outline.points[i].x;
  510.                     vtx[Vi][1] = outline.points[i].y;
  511.                     vtx[Vi][2] = 0.0;
  512.                     Vi++;
  513.                 }
  514.             }
  515.         }
  516.  
  517.         vtx_contours[vtx_ctsi] = Vi-1;
  518.         vtx_ctsi++;
  519.     }
  520.     //printf("vtx_ctsi: %d, nvtx: %d\n", vtx_ctsi, Vi);
  521. }
  522.  
  523. int main( int argc, char** argv )
  524. {
  525.  
  526.     ftinit();
  527.     LoadGlyph(code);
  528.     GetDatafromOutline();
  529.  
  530.     printf("font-name: %s, style: %s\n", face->family_name, face->style_name);
  531.     printf("n_faces:%d, face_index:%d, face_flags:%d, style_flags:%d\n",
  532.             face->num_faces,
  533.             face->face_index,
  534.             face->face_flags,
  535.             face->style_flags
  536.         );
  537.  
  538.     printf("numglyphs :%d, fixed_sizes: %d, generic: %d\n",
  539.             face->num_glyphs,
  540.             face->num_fixed_sizes,
  541.             face->generic
  542.         );
  543.  
  544.     printf("bbox x: %d - %d, y: %d - %d, ascender %d, descender %d, height %d \n",
  545.             face->bbox.xMin,face->bbox.xMax,face->bbox.yMin,face->bbox.yMax,
  546.             face->ascender,
  547.             face->descender,
  548.             face->height
  549.         );
  550.  
  551.     printf("n_contours: %d \n n_points: %d \n flags: %d\n",
  552.                         outline.n_contours,
  553.                         outline.n_points,
  554.                         outline.flags
  555.                     );
  556.    
  557.     for (int i=0; i<outline.n_contours; i++  )
  558.     {
  559.         printf("Contour %d: %d\n", i, outline.contours[i]);
  560.     }
  561.     printf("\n");
  562.  
  563.     // for (int i = 0; i<outline.n_points ; i++)
  564.     // {
  565.     //     printf("%2d : %4d %4d %d\n",
  566.     //                             i,
  567.     //                             outline.points[i].x,
  568.     //                             outline.points[i].y,
  569.     //                             outline.tags[i]
  570.     //                         );
  571.     // }
  572.  
  573.     glutInit(&argc, argv);
  574.                     //显示模式     双缓冲          RGBA
  575.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA |GLUT_DEPTH | GLUT_MULTISAMPLE );
  576.     glutInitWindowSize(SIZE_X, SIZE_Y);            //窗口大小
  577.     glutInitWindowPosition(200, 200);              //位置
  578.     winID = glutCreateWindow("ViANG_5230");       //窗口句柄
  579.     init();
  580.     glutDisplayFunc(display);                    //显示
  581.     glutKeyboardFunc(keypress);                  //按键事件响应
  582.     glutReshapeFunc(reshape);                    //窗口事件响应
  583.     glutIdleFunc(idle);                          //闲时回调函数
  584.     glutMainLoop();                              //开始主循环
  585.  
  586.     FT_Done_Face        ( face );
  587.     FT_Done_FreeType( library );
  588.  
  589.     return 0;
  590. }


:Compile
gcc -std=c11 "%1" -o "%~n1" ^
-ID:\Lib\freeglut-MinGW-3.0.0-1.mp\include -ID:/lib/freetype-2.7/include ^
-LD:\Lib\freeglut-MinGW-3.0.0-1.mp\lib\x64 -LD:/lib/freetype-2.7/objs/.libs ^
-lfreeglut -lopengl32 -lglu32 -lfreetype -lpng -lz

头像
523066680
Administrator
Administrator
帖子: 340
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 30 times
Been thanked: 27 times
联系:

Re: [OpenGL+FreeType]模拟黑客帝国数码雨

帖子 #4 523066680 » 2016年12月06日 00:27

V3.0 开发中

mtx-part3.png

happy886rr
渐入佳境
渐入佳境
帖子: 45
注册时间: 2016年09月27日 16:11
拥有现金: 锁定
储蓄: 锁定
Has thanked: 14 times
Been thanked: 14 times
联系:

Re: [OpenGL+FreeType]模拟黑客帝国数码雨

帖子 #5 happy886rr » 2016年12月06日 10:08

牛啊,这个怎么玩,需要下载freetype吗?

头像
523066680
Administrator
Administrator
帖子: 340
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 30 times
Been thanked: 27 times
联系:

Re: [OpenGL+FreeType]模拟黑客帝国数码雨

帖子 #6 523066680 » 2016年12月06日 10:20

happy886rr 写了:牛啊,这个怎么玩,需要下载freetype吗?


是的需要 freetype 库的支持,相关的帖子:
[Freetype]MinGW编译 FreeType2.4 以及 示例代码
[FreeType]获取字符点阵的最小示例代码
[FreeType]提取、绘制字体的字形轮廓

MinGW + FreeGLUT 环境配置(glfw glew 可以暂时不管)
MinGW+OpenGL+freeglut+glew+glfw 环境配置

为了写这个效果也着实是做了不少准备工作,Bezier曲线、Freetype提取文字轮廓,OpenGL的多边形细分+填充,都是现学现用。

happy886rr
渐入佳境
渐入佳境
帖子: 45
注册时间: 2016年09月27日 16:11
拥有现金: 锁定
储蓄: 锁定
Has thanked: 14 times
Been thanked: 14 times
联系:

Re: [OpenGL+FreeType]模拟黑客帝国数码雨

帖子 #7 happy886rr » 2016年12月06日 10:24

好的,我也需要下载个最新的mingw了。我一直用的精简版mingw各种头文件缺失。

echo
初来炸道
初来炸道
帖子: 1
注册时间: 2016年08月30日 03:19
拥有现金: 锁定
储蓄: 锁定

Re: [OpenGL+FreeType]模拟黑客帝国数码雨

帖子 #8 echo » 2016年12月06日 16:40

哈哈,我不喜欢用所谓各种精简软件的原因。 :crazylaugh2
碰到意外问题还在浪费时间来处理。

happy886rr
渐入佳境
渐入佳境
帖子: 45
注册时间: 2016年09月27日 16:11
拥有现金: 锁定
储蓄: 锁定
Has thanked: 14 times
Been thanked: 14 times
联系:

Re: [OpenGL+FreeType]模拟黑客帝国数码雨

帖子 #9 happy886rr » 2016年12月06日 17:49

523066680 写了:是的需要 freetype 库的支持,相关的帖子:
[Freetype]MinGW编译 FreeType2.4 以及 示例代码


freetype2.7都编译好了,exe也生成了,但是一运行就崩溃,断点发现在 glutDisplayFunc(display); //显示出了问题,是不是还需要和字符文件放一起,需要libpng.lib的库是哪个版本。我现在估计问题就在png或者是字库。

头像
523066680
Administrator
Administrator
帖子: 340
注册时间: 2016年07月19日 12:14
拥有现金: 锁定
储蓄: 锁定
Has thanked: 30 times
Been thanked: 27 times
联系:

Re: [OpenGL+FreeType]模拟黑客帝国数码雨

帖子 #10 523066680 » 2016年12月06日 17:56

happy886rr 写了:
523066680 写了:是的需要 freetype 库的支持,相关的帖子:
[Freetype]MinGW编译 FreeType2.4 以及 示例代码


freetype2.7都编译好了,exe也生成了,但是一运行就崩溃,断点发现在 glutDisplayFunc(display); //显示出了问题,是不是还需要和字符文件放一起,需要libpng.lib的库是哪个版本。我现在估计问题就在png或者是字库。


我也遇到过,一般是缺少 freeglut.dll,或者 dll 的32位、64位版本不对


回到 “OpenGL”

在线用户

用户浏览此论坛: 没有注册用户 和 0 访客