【原创】OPENGL ES显示字符串
使用OPENGL ES开发一个应用,显示字符串都那么麻烦,虽然POWERVR等基于OPENGL ES的SDK提供了APPPRINT3D这样的封装类来处理字符串显示,但鉴于开发中我用的不是POWERVR。网上还有一个封装好的类,glfonts for WINCE,把这个类放到程序中,也不知道是否自己的使用是否正确,反正没啥效果。最后发现可以通过这么一种方式实现,首先把字符串打印在dc上,然后生成位图,最后位图纹理贴图。All works are done.
1 void glTextShow(WCHAR *fontname, int fontsize, int style, int x, int y, const WCHAR *string)
2 {
3 int len, xx = 0, yy = 0, nbpoints = 0, i;
4 GLshort *points;
5 GLushort *indices;
6 HFONT font;
7 LOGFONTW lf;
8 RECT rect;
9 static HBITMAP bmp;
10 static BYTE *img;
11 static HDC hdc = NULL;
12 static BITMAPINFO bi;
13 SIZE sz;
14 static EGLint width, height;
15
16 if(!fontname || !string)
17 return;
18 if(!string[0])
19 return;
20
21 if(!hdc)
22 {
23 hdc = CreateCompatibleDC(GetDC(hWnd));
24
25 eglQuerySurface(eglDisplay, eglSurface, EGL_WIDTH, &width);
26 eglQuerySurface(eglDisplay, eglSurface, EGL_HEIGHT, &height);
27
28
29 ZeroMemory(&bi, sizeof(BITMAPINFO));
30 bi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
31 bi.bmiHeader.biWidth = width;
32 bi.bmiHeader.biHeight = height;
33 bi.bmiHeader.biBitCount = 8;
34 bi.bmiHeader.biPlanes = 1;
35 bi.bmiHeader.biCompression = BI_RGB;
36
37 bmp = CreateDIBSection(hdc, &bi, DIB_RGB_COLORS, &img, NULL, 0);
38
39 SelectObject(hdc, bmp);
40
41 SelectObject(hdc, GetStockObject(BLACK_BRUSH));
42
43 SetBkMode(hdc, TRANSPARENT);
44 SetTextColor(hdc, RGB(255, 255, 255));
45 }
46
47 Rectangle(hdc, 0, 0, width, height);
48 ZeroMemory(img, width * height);
49
50 lf.lfCharSet = DEFAULT_CHARSET;
51 lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
52 lf.lfEscapement = 0;
53 wcscpy(lf.lfFaceName, fontname);
54 lf.lfHeight = -(fontsize * GetDeviceCaps(GetDC(hWnd), LOGPIXELSY) / 72);
55 lf.lfItalic = (style & 1) ? TRUE : FALSE;
56 lf.lfOrientation = 0;
57 lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
58 lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
59 lf.lfQuality = DEFAULT_QUALITY;
60 lf.lfStrikeOut = FALSE;
61 lf.lfUnderline = (style & 4) ? TRUE : FALSE;
62 lf.lfWidth = 0;
63 lf.lfWeight = (style & 2) ? FW_BOLD : FW_NORMAL;
64
65 font = CreateFontIndirectW(&lf);
66
67 SelectObject(hdc, font);
68
69 len = wcslen(string);
70
71 GetTextExtentPointW(hdc, string, len, &sz);
72
73 rect.left = max(0, min(x, width));
74 rect.top = max(0, min(y, height));
75 rect.right = min(rect.left + sz.cx, width);
76 rect.bottom = min(rect.top + sz.cy, height);
77
78 DrawTextW(hdc, string, len, &rect, DT_LEFT | DT_BOTTOM);
79
80 points = (GLshort*)malloc(sz.cx * sz.cy * 2 * sizeof(short));
81
82 for(yy = rect.top; yy < rect.bottom; yy++)
83 {
84 for(xx = rect.left; xx < rect.right; xx++)
85 {
86 if(img[xx + (height - yy) * width] != 0)
87 {
88 points[nbpoints * 2 + 0] = xx - x;
89 points[nbpoints * 2 + 1] = (short)(rect.top + sz.cy - (yy - rect.top)) - y;
90 nbpoints++;
91 }
92 }
93 }
94 DeleteObject(font);
95
96 indices = (GLushort*)malloc(nbpoints * sizeof(GLushort));
97 for(i = 0; i < nbpoints; i++)
98 indices[i] = i;
99
100 glMatrixMode(GL_PROJECTION);
101 glPushMatrix();
102 glLoadIdentity();
103
104 glOrthox(0, _INT2FIXED(width),
105 0, _INT2FIXED(height),
106 0, _INT2FIXED(1));
107
108
109 glMatrixMode(GL_MODELVIEW);
110 glPushMatrix();
111 glLoadIdentity();
112
113 glDisable(GL_DEPTH_TEST);
114
115 glTranslatex(_INT2FIXED(x), _INT2FIXED(y), 0);
116
117 glEnable(GL_ALPHA_TEST);
118 glAlphaFuncx(GL_NOTEQUAL, 0);
119 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
120 glDisableClientState(GL_COLOR_ARRAY);
121 glDisableClientState(GL_NORMAL_ARRAY);
122 glEnableClientState (GL_VERTEX_ARRAY);
123 glVertexPointer(2, GL_SHORT, 0, points);
124
125 glDrawElements(GL_POINTS,
126 nbpoints,
127 GL_UNSIGNED_SHORT,
128 indices);
129
130 glDisable(GL_ALPHA_TEST);
131
132 glEnable(GL_DEPTH_TEST);
133
134 glPopMatrix();
135 glMatrixMode(GL_PROJECTION);
136 glPopMatrix();
137 glMatrixMode(GL_MODELVIEW);
138
139 free(indices);
140 free(points);
141 }
3 int len, xx = 0, yy = 0, nbpoints = 0, i;
4 GLshort *points;
5 GLushort *indices;
6 HFONT font;
7 LOGFONTW lf;
8 RECT rect;
9 static HBITMAP bmp;
10 static BYTE *img;
11 static HDC hdc = NULL;
12 static BITMAPINFO bi;
13 SIZE sz;
14 static EGLint width, height;
15
16 if(!fontname || !string)
17 return;
18 if(!string[0])
19 return;
20
21 if(!hdc)
22 {
23 hdc = CreateCompatibleDC(GetDC(hWnd));
24
25 eglQuerySurface(eglDisplay, eglSurface, EGL_WIDTH, &width);
26 eglQuerySurface(eglDisplay, eglSurface, EGL_HEIGHT, &height);
27
28
29 ZeroMemory(&bi, sizeof(BITMAPINFO));
30 bi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
31 bi.bmiHeader.biWidth = width;
32 bi.bmiHeader.biHeight = height;
33 bi.bmiHeader.biBitCount = 8;
34 bi.bmiHeader.biPlanes = 1;
35 bi.bmiHeader.biCompression = BI_RGB;
36
37 bmp = CreateDIBSection(hdc, &bi, DIB_RGB_COLORS, &img, NULL, 0);
38
39 SelectObject(hdc, bmp);
40
41 SelectObject(hdc, GetStockObject(BLACK_BRUSH));
42
43 SetBkMode(hdc, TRANSPARENT);
44 SetTextColor(hdc, RGB(255, 255, 255));
45 }
46
47 Rectangle(hdc, 0, 0, width, height);
48 ZeroMemory(img, width * height);
49
50 lf.lfCharSet = DEFAULT_CHARSET;
51 lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
52 lf.lfEscapement = 0;
53 wcscpy(lf.lfFaceName, fontname);
54 lf.lfHeight = -(fontsize * GetDeviceCaps(GetDC(hWnd), LOGPIXELSY) / 72);
55 lf.lfItalic = (style & 1) ? TRUE : FALSE;
56 lf.lfOrientation = 0;
57 lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
58 lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
59 lf.lfQuality = DEFAULT_QUALITY;
60 lf.lfStrikeOut = FALSE;
61 lf.lfUnderline = (style & 4) ? TRUE : FALSE;
62 lf.lfWidth = 0;
63 lf.lfWeight = (style & 2) ? FW_BOLD : FW_NORMAL;
64
65 font = CreateFontIndirectW(&lf);
66
67 SelectObject(hdc, font);
68
69 len = wcslen(string);
70
71 GetTextExtentPointW(hdc, string, len, &sz);
72
73 rect.left = max(0, min(x, width));
74 rect.top = max(0, min(y, height));
75 rect.right = min(rect.left + sz.cx, width);
76 rect.bottom = min(rect.top + sz.cy, height);
77
78 DrawTextW(hdc, string, len, &rect, DT_LEFT | DT_BOTTOM);
79
80 points = (GLshort*)malloc(sz.cx * sz.cy * 2 * sizeof(short));
81
82 for(yy = rect.top; yy < rect.bottom; yy++)
83 {
84 for(xx = rect.left; xx < rect.right; xx++)
85 {
86 if(img[xx + (height - yy) * width] != 0)
87 {
88 points[nbpoints * 2 + 0] = xx - x;
89 points[nbpoints * 2 + 1] = (short)(rect.top + sz.cy - (yy - rect.top)) - y;
90 nbpoints++;
91 }
92 }
93 }
94 DeleteObject(font);
95
96 indices = (GLushort*)malloc(nbpoints * sizeof(GLushort));
97 for(i = 0; i < nbpoints; i++)
98 indices[i] = i;
99
100 glMatrixMode(GL_PROJECTION);
101 glPushMatrix();
102 glLoadIdentity();
103
104 glOrthox(0, _INT2FIXED(width),
105 0, _INT2FIXED(height),
106 0, _INT2FIXED(1));
107
108
109 glMatrixMode(GL_MODELVIEW);
110 glPushMatrix();
111 glLoadIdentity();
112
113 glDisable(GL_DEPTH_TEST);
114
115 glTranslatex(_INT2FIXED(x), _INT2FIXED(y), 0);
116
117 glEnable(GL_ALPHA_TEST);
118 glAlphaFuncx(GL_NOTEQUAL, 0);
119 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
120 glDisableClientState(GL_COLOR_ARRAY);
121 glDisableClientState(GL_NORMAL_ARRAY);
122 glEnableClientState (GL_VERTEX_ARRAY);
123 glVertexPointer(2, GL_SHORT, 0, points);
124
125 glDrawElements(GL_POINTS,
126 nbpoints,
127 GL_UNSIGNED_SHORT,
128 indices);
129
130 glDisable(GL_ALPHA_TEST);
131
132 glEnable(GL_DEPTH_TEST);
133
134 glPopMatrix();
135 glMatrixMode(GL_PROJECTION);
136 glPopMatrix();
137 glMatrixMode(GL_MODELVIEW);
138
139 free(indices);
140 free(points);
141 }
posted on 2009-12-25 22:07 IamEasy_Man 阅读(2426) 评论(0) 编辑 收藏 举报