根据这个http://yarin.blog.51cto.com/blog/1130898/381955 修改的。
原理是: 在内存DC上写字符串,然后获取DC像素数据,判断数据不为0的,就是写字的像素,获取像素所在位置。
在OpenGLES根据位置画点。
开始直接搬那个函数不知道怎么显示不了,就乱改一通,估计那个设置不对吧。
对GLES不懂,几天没看,函数都忘光光。
void COpenGLES::glTextShow(int fontsize, int style, int x, int y, const WCHAR *string)
{ //显示不正确
int len, xx = 0, yy = 0, nbpoints = 0, i;
GLfloat *points;
HFONT font;
LOGFONTW lf;
RECT rect;
static HBITMAP bmp;
static BYTE *img;
static HDC hdc = NULL;
static BITMAPINFO bi;
SIZE sz;
static EGLint width = 800, height = 480;
if(!string)
return;
if(!string[0])
return;
if(!hdc)
{
hdc = CreateCompatibleDC(GetDC(NULL));
ZeroMemory(&bi, sizeof(BITMAPINFO));
bi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bi.bmiHeader.biWidth = width;
bi.bmiHeader.biHeight = height;
bi.bmiHeader.biBitCount = 8;
bi.bmiHeader.biPlanes = 1;
bmp = CreateDIBSection(hdc, &bi, DIB_RGB_COLORS, (void**)&img, NULL, 0);
SelectObject(hdc, bmp);
SelectObject(hdc, GetStockObject(BLACK_BRUSH));
SetBkMode(hdc, TRANSPARENT);
SetTextColor(hdc, RGB(255, 255, 255));
}
Rectangle(hdc, 0, 0, width, height);
ZeroMemory(img, width * height);
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lf.lfEscapement = 0;
wcscpy(lf.lfFaceName, L"GLES");
lf.lfHeight = fontsize;
lf.lfItalic = (style & 1) ? TRUE : FALSE;
lf.lfOrientation = 0;
lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
lf.lfQuality = DEFAULT_QUALITY;
lf.lfStrikeOut = FALSE;
lf.lfUnderline = (style & 4) ? TRUE : FALSE;
lf.lfWidth = 0;
lf.lfWeight = (style & 2) ? FW_BOLD : FW_NORMAL;
font = CreateFontIndirectW(&lf);
SelectObject(hdc, font);
len = wcslen(string);
GetTextExtentPointW(hdc, string, len, &sz);
y = 480 - y - sz.cy;
rect.left = max(0, min(x, width));
rect.top = max(0, min(y, height));
rect.right = min(rect.left + sz.cx, width);
rect.bottom = min(rect.top + sz.cy, height);
DrawTextW(hdc, string, len, &rect, DT_LEFT | DT_BOTTOM);
HDC dc= GetDC(NULL);
points = (GLfloat*)malloc(sz.cx * sz.cy * 2 * sizeof(GLfloat));
for(yy = rect.top; yy < rect.bottom; yy++)
{
for(xx = rect.left; xx < rect.right; xx++)
{
if(img[xx + (height - yy) * width] != 0)
{
points[nbpoints * 2 + 0] = xx - x;
points[nbpoints * 2 + 1] = (float)(rect.top + sz.cy - (yy - rect.top)) - y;
nbpoints++;
}
}
}
DeleteObject(font);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0, (800.0f),0, (480.0f), -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);
glColor4f(1.0f,0,0,1.0f);
glDisable(GL_BLEND);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);//禁用颜色数组、
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2,GL_FLOAT,0,points);
glPushMatrix();
glTranslatef(x,y,-0.010001f);
glPointSize(1.0f);
glDrawArrays(GL_POINTS,0,nbpoints);
glPopMatrix();
glFinish();
EGLFlush();
free(points);
}
不管怎么做,终于写上字了,貌似速度挺慢的。
我的屏幕800*480的,直接写死了,字体名字也改的写死了
原来博主的顶点坐标都是用GL_SHORT型的,我都改成float的了
画点也改成了glDrawArrays,
设置投影矩阵的时候也用浮点型函数glOrthof
指定顶点数组也就用了浮点型,glVertexPointer(2,GL_FLOAT,0,points);
单纯画点之前把,纹理矩阵、颜色矩阵、ALPHA、BLEND都禁止掉,不然可能看不见。
貌似投影矩阵指定的时候用的函数类型与顶点不一样会画不上去
所以设置模型的时候用浮点型函数,画图的时候最好也用浮点的坐标
,要用x型的都用x型,原因不知,但还是先不较真了。
glFrustumf对应GL_FLOAT
glFrustumx对应GL_FIX
用的时候
直接调用
gl.glTextShow(25,NULL,0,480,L"OpenGL编程指南");
就可以显示
这一个函数就会刷整个屏幕,具体使用,还得修改。估计就改成原来博主那种写法了。。。。
好久没看,竟然对以前看的东西又怀疑了,最后又发现以前是对的。。。
投影矩阵函数设置一个投影矩阵
在模型视图矩阵中画东西的时候,glLoadIdentity();之后,模型视图矩阵默认的z原点在屏幕上
要看见画的物体,要将模型视图矩阵移动到投影矩阵中。
通过函数:glTranslatef(x,y,-0.010001f);移动。
再学到更多之前,投影矩阵设置用f型函数,都用浮点型
顶点也用浮点型的数据表示
设置投影矩阵的时候,就设置成屏幕大小的,方便坐标使用。
glOrthof(0, (800.0f),0, (480.0f), -1.0f, 1.0f); 平行投影
glFrustumf(-0.0f, 800.0f, -0.0f, 480.0f, 0.01f,1000.0f); 透视投影
单纯画点之前把,纹理矩阵、颜色矩阵、ALPHA、BLEND都禁止掉,不然可能看不见。