根据这个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都禁止掉,不然可能看不见。