вывод текста в Opengl C#

  • Автор темы Villiya
  • Дата начала
V

Villiya

#1
Уважаемые программисты, столкнулась с проблемой вывода текста в OpenGl C#, просмотрела много литературы, но ничего не помогает! использую VisualStudio2008+TaoFramework. имеется код
Код:
public void glPrint(double x, double y, double z, string text)
{
Gl.glRasterPos3d(x, y, z);
if (text == null || text.Length == 0)
{
return;
}
Gl.glPushAttrib(Gl.GL_LIST_BIT);
Gl.glListBase(fontbase);
byte[] textbytes = new byte[text.Length];
for (int i = 0; i < text.Length; i++)
{
textbytes[i] = (byte)text[i];

if (text[i] > 1039 && text[i] < 1104)
{
textbytes[i] = (byte)(text[i] + 176);
}
else
{
textbytes[i] = (byte)text[i];
}
}
Gl.glCallLists(text.Length, Gl.GL_UNSIGNED_BYTE, textbytes);
Gl.glPopAttrib();
}
Код:
 public bool SetWindowPixelFormat()
{
hDC = User.GetDC(AnT.Handle);// получаем контекст устройства

//Glut.PI
Gdi.PIXELFORMATDESCRIPTOR pixelDesc = new Gdi.PIXELFORMATDESCRIPTOR();


pixelDesc.nSize = (short)Marshal.SizeOf(pixelDesc);
pixelDesc.nVersion = 1;
pixelDesc.dwFlags = Gdi.PFD_DRAW_TO_WINDOW | Gdi.PFD_SUPPORT_OPENGL | Gdi.PFD_DOUBLEBUFFER | Gdi.PFD_STEREO_DONTCARE;
pixelDesc.iPixelType = (byte)Gdi.PFD_TYPE_RGBA;
pixelDesc.cColorBits = 32;
pixelDesc.cRedBits = 8;
pixelDesc.cRedShift = 16;
pixelDesc.cGreenBits = 8;
pixelDesc.cGreenShift = 8;
pixelDesc.cBlueBits = 8;
pixelDesc.cBlueShift = 0;
pixelDesc.cAlphaBits = 0;
pixelDesc.cAlphaShift = 0;
pixelDesc.cAccumBits = 64;
pixelDesc.cAccumRedBits = 16;
pixelDesc.cAccumGreenBits = 16;
pixelDesc.cAccumBlueBits = 16;
pixelDesc.cAccumAlphaBits = 0;
pixelDesc.cDepthBits = 32;
pixelDesc.cStencilBits = 8;
pixelDesc.cAuxBuffers = 0;
pixelDesc.iLayerType = Gdi.PFD_MAIN_PLANE;
pixelDesc.bReserved = 0;
pixelDesc.dwLayerMask = 0;
pixelDesc.dwVisibleMask = 0;
pixelDesc.dwDamageMask = 0;


m_GLPixelIndex = Gdi.ChoosePixelFormat(hDC, ref pixelDesc);
if (m_GLPixelIndex == 0) // Choose default
{
m_GLPixelIndex = 1;
//if (Gdi.DescribePixelFormat(hDC, m_GLPixelIndex,
//	pixelDesc.nSize, ref pixelDesc) == 0)
return false;
}


if (!Gdi.SetPixelFormat(hDC, m_GLPixelIndex, ref pixelDesc))
return false;

return true;
}



private void CreateSymbols()
{
IntPtr font;														// Windows Font ID
IntPtr oldfont;
fontbase = Gl.glGenLists(257);//Выделим место для 96 символов.

font = Gdi.CreateFont(

-24,//Высота фонта.
0,//Ширина фонта.
0,//Угол отношения.
0,//Угол наклона.
Gdi.FW_BOLD,//Ширина шрифта.
false,//Курсив.
false,//Подчеркивание.
false,//Перечеркивание.
Gdi.ANSI_CHARSET,//Идентификатор набора символов.
Gdi.OUT_TT_PRECIS,//Точность вывода.
Gdi.CLIP_DEFAULT_PRECIS,//Точность отсечения.
Gdi.ANTIALIASED_QUALITY,//Качество вывода.
Gdi.FF_DONTCARE | Gdi.DEFAULT_PITCH,//Семейство и шаг.
"Arial"
);//Имя шрифта.
IntPtr hDC = Wgl.wglGetCurrentDC();
oldfont = Gdi.SelectObject(hDC, font);//Выбрать шрифт, созданный нами. 
Wgl.wglUseFontBitmaps(hDC, 0, 256, fontbase);					  // Builds 96 Characters Starting At Character 32
Gdi.SelectObject(hDC, oldfont);									 // Selects The Font We Want
Gdi.DeleteObject(font);											 // Delete The Font
}
в результате вызова функции glPrint на экране ничего не отображается, подскажите в чем проблема! пожалуйста!
 
M

mr_ST

#2
1) Из кода непонятно как задается матрица проекции, viewport и положение наблюдателя (камеры)
2) Я бы посоветовал OpenTK вместо Tao. Там вопрос с выводом текста решен гораздо лучше чем позволяет базовый API OpenGL, да и примеры есть.