Как визуализировать вертикальный текст с помощью wglUseFontBitmapsA ​​в OpenGL - PullRequest
0 голосов
/ 04 марта 2020

Я отображаю текст в C# приложении WinForms с использованием OpenTK. Весь текст горизонтальный, и все работает правильно.

Вот соответствующие части моего кода:

Функция для построения списков отображения:

public void BuildCharacterLists(bool bBold, ref int nCharacterBuildList, int nWeight, string szFont, TEXT_TYPE textType, float extrusionForNonBitmapTextType_ignoredForBitmapType)
        {
            if (nCharacterBuildList != -1)
            {
                GL.DeleteLists(nCharacterBuildList, 96);
            }

            IntPtr font;
            IntPtr oldfont;
            IntPtr hDC = Wgl.wglGetCurrentDC();

            nCharacterBuildList = GL.GenLists(96);

            font = Gdi.CreateFont(nWeight,                                      // Height Of Font
                                  0,                                            // Width Of Font
                                  0,                                            // Angle Of Escapement
                                  0,                                            // Orientation Angle
                                  (bBold ? Gdi.FW_BOLD : 200),                  // Font Weight
                                  false,                                        // Italic
                                  false,                                        // Underline
                                  false,                                        // Strikeout
                                  Gdi.ANSI_CHARSET,                             // Character Set Identifier
                                  Gdi.OUT_TT_PRECIS,                            // Output Precision
                                  Gdi.CLIP_DEFAULT_PRECIS,                      // Clipping Precision
                                  Gdi.ANTIALIASED_QUALITY,                      // Output Quality
                                  Gdi.FF_DONTCARE | Gdi.DEFAULT_PITCH,          // Family And Pitch
                                  "Arial");                                    // Font Name

            oldfont = Gdi.SelectObject(hDC, font);                              // Selects The Font We Want

            if (textType == TEXT_TYPE.BITMAP) // Builds 96 Characters Starting At Character 32
            {
                Wgl.wglUseFontBitmapsA(hDC, 32, 96, nCharacterBuildList);
            }

            Gdi.SelectObject(hDC, oldfont);
            Gdi.DeleteObject(font);
        }

Выдержка из функции для визуализировать текст:

GL.RasterPos2 (modelX, modelY);

            GL.PushAttrib(AttribMask.ListBit);                           // Pushes The Display List Bits

            GL.ListBase(m_nCharacterBitmapBuildList - 32);                     // Sets The Base Character to 32


            byte[] textbytes = new byte[szText.Length];

            for (int i = 0; i < szText.Length; i++)
            {
                textbytes[i] = (byte)szText[i];
            }

            GL.CallLists(szText.Length, ListNameType.UnsignedByte, textbytes);        // Draws The Display List Text

            if (bCentred)
            {
                screenX += 5 * stringLength / 2;
            }

            GL.PopAttrib();

Это все работает нормально, если я рендеринг, например, заглавная буква HI получит:

H1

Но если я начну изменять угол выхода шрифта при вызове CreateFont, персонаж начнет обрезать, как показано ниже:

Угол спуска 450 дает:

H2

Угол спуска 600 дает:

H3

Угол спуска 900 (что я хочу, вертикальный), тогда изображение полностью обрезается.

Я прочитал множество ссылок по этому поводу, но был удивлен, обнаружив, что, возможно, есть нет решения?

(Пока я прибегаю к использованию wglUseFontOutlinesA, но постоянный размер текста более сложен). * 10 40 *

Вращение работает (как показывают скриншоты), но отсечение убивает вещи.

Кто-нибудь может посоветовать?

...