الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

رسم outline fonts في اسقاط ثنائي الابعاد، كيف ؟

بدأه OsamaHosamEldeen في 24 مايو 2010 · 2 رد · 1,134 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

هل استطيع رسم outline font في شاشة ثنائية الابعاد، حيث اني اعمل على gluOrtho2D وحاولت رسم خطوط اوتلاين ولكنها لا تظهر على الشاشة، حاولت تصغير وتكبير الخط باستخدام الدلة glScale دون فائدة الخط لا يظهر اطلاقا. في حين ان رسمه في الاسقاط الثلاثي الابعاد سهل جدا دون اي عناء. ارجو ممن لديه الخبرة اعطائي مثال بسيط على ذلك ، فقط كود بسيط لعمل شاشة اوبن جل باسقاط ثنائي الابعاد مع كلمة في داخلها مرسومة باستخدام outline font

تحياتي

#2

وعليكم السلام ،

لا أرى علاقة بين outline font و بين نوعية الاسقاط ..

قد يكون لديك مشكلة بتحديد القيم المناسبة لـ glOrtho ، عموماً هناك مقال قد يفيدك ، وهو يستخدم المكتبة FTGL لرسم النص ، بأي شكل تريده ومنها Outline /

http://www.arabteam2...howtopic=137459

وهذا الهيكل العظمي للمثال ، تستطيع استبدال أوامر المكتبة FTGL بأوامر رسم النصوص التي كتبتها بنفسك ، علماً أن المثال يفترض أن نقطة الأصل هي النقطة اليسرى السفلية :

void display(void)
{
 glClear (GL_COLOR_BUFFER_BIT);
 glLoadIdentity();


 glColor3f(1,1,0);

// replace the following two lines by your own functions
 glRasterPos2i( 100,100 );
 font->Render("hello world ");

 glutSwapBuffers();
}

void reshape (int w, int h)
{
 glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
 glMatrixMode (GL_PROJECTION);
 glLoadIdentity ();

 gluOrtho2D(0,w,0,h);

 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 }

int main(int argc, char** argv)
{

 glutInit(&argc, argv);
 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
 glutInitWindowSize (500, 500); 
 glutInitWindowPosition (100, 100);
 glutCreateWindow (argv[0]);
 glutSetWindowTitle("FTGL 1 ");
 glutDisplayFunc(display); 
 glutReshapeFunc(reshape);
 glutMainLoop();
 return 0;
}

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

الاخ الشمري ،

شكرا على ردك ، لطالما انتظرت الرد. في الحقيقة اني اعمل على مشروع به كميه كبيرة من النصوص واحببت ان ازيد performance او كفائة البرنامج والابتعاد عن الانواع الاخرى للخطوط واخترت اوتلاين فوونت، لان اوبن جي ال يتعامل معه على انه lines,curves فيسهل التعامل معه مقارنة بال bitmap fonts عموما لن استطيع تغيير نوع الفونت لان المشروع قديم وكبير جدا وما اريده هو تصحيح البرنامج التالي، ستجد انه يتم عرض الخط والنص لا يظهر لا ادري لماذا

#include "stdafx.h"
#include <windows.h>
#include <math.h>
#include <GL/glut.h>

GLfloat screen_width=800;
GLfloat screen_height=600;
char string[100];

GLuint	base;				// Base Display List For The Font Set
GLfloat	rot;				// Used To Rotate The Text

HDC		hDC=NULL;		// Private GDI Device Context

GLYPHMETRICSFLOAT gmf[256];	// Storage For Information About Our Outline Font Characters

GLvoid BuildFont(GLvoid)								// Build Our Bitmap Font
{
	HFONT	font;										// Windows Font ID

	base = glGenLists(256);								// Storage For 256 Characters

	font = CreateFont(	-12,							// Height Of Font
						0,								// Width Of Font
						0,								// Angle Of Escapement
						0,								// Orientation Angle
						FW_BOLD,						// Font Weight
						FALSE,							// Italic
						FALSE,							// Underline
						FALSE,							// Strikeout
						ANSI_CHARSET,					// Character Set Identifier
						OUT_TT_PRECIS,					// Output Precision
						CLIP_DEFAULT_PRECIS,			// Clipping Precision
						ANTIALIASED_QUALITY,			// Output Quality
						FF_DONTCARE|DEFAULT_PITCH,		// Family And Pitch
						"Comic Sans MS");				// Font Name

	SelectObject(hDC, font);							// Selects The Font We Created

	wglUseFontOutlines(	hDC,							// Select The Current DC
						0,								// Starting Character
						255,							// Number Of Display Lists To Build
						base,							// Starting Display Lists
						0.0f,							// Deviation From The True Outlines
						0.2f,							// Font Thickness In The Z Direction
						WGL_FONT_POLYGONS,				// Use Polygons, Not Lines
						gmf);							// Address Of Buffer To Recieve Data
}

GLvoid KillFont(GLvoid)									// Delete The Font
{
  glDeleteLists(base, 256);								// Delete All 256 Characters
}

GLvoid glPrint(const char *fmt, ...)					// Custom GL "Print" Routine
{
	float		length=0;								// Used To Find The Length Of The Text
	char		text[256];								// Holds Our String
	va_list		ap;										// Pointer To List Of Arguments

	if (fmt == NULL)									// If There's No Text
		return;											// Do Nothing

	va_start(ap, fmt);									// Parses The String For Variables
	    vsprintf(text, fmt, ap);						// And Converts Symbols To Actual Numbers
	va_end(ap);											// Results Are Stored In Text

	for (unsigned int loop=0;loop<(strlen(text));loop++)	// Loop To Find Text Length
	{
		length+=gmf[text[loop]].gmfCellIncX;			// Increase Length By Each Characters Width
	}

	//glTranslatef(-length/2,0.0f,0.0f);					// Center Our Text On The Screen

	glPushAttrib(GL_LIST_BIT);							// Pushes The Display List Bits
	glListBase(base);									// Sets The Base Character to 0
	glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);	// Draws The Display List Text
	glPopAttrib();										// Pops The Display List Bits
}


void init()
{
	glClearColor(0.0,0.0,0.0,0.0);

	BuildFont();
}
void resize(int w,int h)
{
	glViewport(0,0,(GLsizei)w,(GLsizei)h);

	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	//the origin at the upper left corner
	//the width and height are the same as the window dimensions
	gluOrtho2D(0.0,screen_width,screen_height,0.0);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void display()
{
	char *s="Osama Hosam";
	glClear (GL_COLOR_BUFFER_BIT);
	glLoadIdentity();

	glRasterPos2i( 100,100 );
	glBegin(GL_LINES);
		glVertex3f(100,100,0);
		glVertex3f(400,400,0);
	glEnd();
	glPrint(s);

	glutSwapBuffers();
}
int main(int argc, char* argv[])
{

	glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
	glutInitWindowSize(screen_width,screen_height);
	glutInitWindowPosition(0,0);
	glutCreateWindow("outline fonts");

	init();

	glutDisplayFunc(display);
	glutIdleFunc(display);
	glutReshapeFunc(resize);
	glutMainLoop();

	KillFont();

	return 0;
}

لا اعرف لمادا لا يظهر النص

مواضيع مشابهة