На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Проблема с выводом русских символов в OpenGL , Помогите, выводятся квадратики и т.п. вместо русских символов.
    Код программы написан на основе урока 14 Nehe, уже мучаюсь несколько дней, но никак не могу вывести русские символы. Вместо этого выводятся квалратики и т.п. Просьба помочь мне разобраться в причинах происходящего, для этого я код инициализации OpenGL и создания шрифта
    ExpandedWrap disabled
      int CGraphVIEW::OnCreate(LPCREATESTRUCT lpCreateStruct)
      {
          if (CView::OnCreate(lpCreateStruct) == -1)
              return -1;
          pdc = new CClientDC(this);                              
          if(SetWindowPixelFormat(pdc->m_hDC)==FALSE)
              return -1;
       
          hGLRC = wglCreateContext(pdc->m_hDC);                      
          if(hGLRC == NULL)
              return -1;
       
          if(wglMakeCurrent(pdc->m_hDC, hGLRC)==FALSE)                
              return -1;
       
          float pos[4] = {0,0,5,1};
          float dir[3] = {-0.8,-1,-1};
              glEnable(GL_ALPHA_TEST);
          glEnable(GL_DEPTH_TEST);    
      glEnable(GL_COLOR_MATERIAL);
              glEnable(GL_LIGHTING);          
      glEnable(GL_LIGHT0);
              glEnable(GL_BLEND);
              glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
              glLightfv(GL_LIGHT0, GL_POSITION, pos);
          glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);
          BuildFont();        //Выбор Шрифта
          InitGL();
          return 0;
      }
       
      int CGraphVIEW::SetWindowPixelFormat(HDC hDC)    
      {
          int m_GLPixelIndex;
         PIXELFORMATDESCRIPTOR pfd = {0};                
          pfd.nSize       = sizeof(PIXELFORMATDESCRIPTOR);
          pfd.nVersion    = 1;                                
      pfd.dwFlags   = PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL |PFD_DOUBLEBUFFER;              
          pfd.iPixelType     = PFD_TYPE_RGBA;            
          pfd.cColorBits     = 32;
          pfd.cRedBits       = 8;
          pfd.cRedShift      = 16;    
          pfd.cGreenBits     = 8;                        
          pfd.cGreenShift    = 8;
          pfd.cBlueBits      = 8;
          pfd.cBlueShift     = 0;
          pfd.cAlphaBits     = 0;
          pfd.cAlphaShift    = 0;
          pfd.cAccumBits     = 64;    
          pfd.cAccumRedBits  = 16;
          pfd.cAccumGreenBits   = 16;
          pfd.cAccumBlueBits    = 16;
          pfd.cAccumAlphaBits   = 0;
          pfd.cDepthBits        = 32;
          pfd.cStencilBits      = 8;
          pfd.cAuxBuffers       = 0;
          pfd.iLayerType        = PFD_MAIN_PLANE;
          pfd.bReserved         = 0;
          pfd.dwLayerMask       = 0;
          pfd.dwVisibleMask     = 0;
          pfd.dwDamageMask      = 0;
       
          m_GLPixelIndex = ChoosePixelFormat( hDC, &pfd);
          if(m_GLPixelIndex==0)
          {m_GLPixelIndex = 1;    
          if(DescribePixelFormat(hDC,m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pfd)==0)
      return 0;
          }
       
          if (SetPixelFormat( hDC, m_GLPixelIndex, &pfd)==FALSE
              return 0;
          return 1;
      }
       
       
      void CGraphVIEW::OnSize(UINT nType, int cx, int cy)
      {
          CView::OnSize(nType, cx, cy);
       
         glMatrixMode( GL_PROJECTION );
         glLoadIdentity();                
         glOrtho(-6.0f,6.0f, -5,5, -5,12);  
         gluLookAt( 0.5,-0.5,5, 0,0,0, 0,1,0 );
          glMatrixMode(GL_MODELVIEW);
          glLoadIdentity();          
          glViewport(0,0,cx,cy);        
      }  
       
       
      GLvoid CGraphVIEW::BuildFont(GLvoid)  
      {
      SelectObject (pdc->m_hDC, GetStockObject (SYSTEM_FONT));
      HFONT font;            
      GLYPHMETRICSFLOAT  Char_List_Buffer[256];
      LOGFONT  lF            ;
      HFONT      hF = NULL;
        lF.lfHeight        =  50;
        lF.lfWidth         =  50;
        lF.lfEscapement    =  0;
        lF.lfOrientation   =  0;
        lF.lfWeight        = 900;
        lF.lfItalic        =  0;
        lF.lfUnderline     =  0;
        lF.lfStrikeOut     =  0;
        lF.lfCharSet       = RUSSIAN_CHARSET;
        lF.lfOutPrecision  = OUT_TT_ONLY_PRECIS   ;
        lF.lfClipPrecision = CLIP_DEFAULT_PRECIS  ;
        lF.lfQuality       = PROOF_QUALITY        ;
        lF.lfPitchAndFamily= FIXED_PITCH |FF_SWISS;
        wsprintf(lF.lfFaceName, _T("Courier new CYR"));
        hF=CreateFontIndirect(&lF);  
        SelectObject (pdc->m_hDC, hF);
        base=0;
        base = glGenLists(255);  
        wglUseFontOutlines(pdc->m_hDC, 0, 255, base, 0.0f, 0.6f, WGL_FONT_POLYGONS, Char_List_Buffer);
        SelectObject(pdc->m_hDC, NULL);
        DeleteObject(hF);
      }
       
      GLvoid CGraphVIEW::glPrint(CString fmt,float pt ...)        
      {
          glPushMatrix();
        {
        if (fmt.IsEmpty())    
        return;              
        glListBase(base);
          char red[100];
           glScaled(pt, pt, pt);
          CharToOem(fmt,red);
          glCallLists (strlen(red), GL_UNSIGNED_BYTE,red);
        }
       glPopMatrix();
       }
       
      int CGraphVIEW::InitGL(GLvoid)            
      {
        glShadeModel(GL_SMOOTH);    
        glClearDepth(1.0f);        
        glEnable(GL_DEPTH_TEST);    
        glDepthFunc(GL_LEQUAL);    
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
         return TRUE;
      }
       
      void CGraphVIEW::display()
      {
      glClearColor (0.25f,0.145f,0.55f,0.5);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
      CString p;
          glColor3f(0.8f,0.10f,0.10f);        //красный
          p.Format(L"Красный");
          glPrint(p,0.7);
        glFinish();
        SwapBuffers(wglGetCurrentDC());
      }
    Сообщение отредактировано: barazuk -
      Цитата Santal @
      CharToOem(fmt,red);


      Это зачем?!!

      Цитата Santal @
      wsprintf(lF.lfFaceName, _T("Courier new CYR"));


      И это зачем? Если уж указываешь RUSSIAN_CHARSET, достаточно:

      ExpandedWrap disabled
        wsprintf(lF.lfFaceName, _T("Courier new"));


      Кстати, Курьер относится к семейству FF_MODERN, а не FF_SWISS. Вообще, hF не хочешь проверить - у тебя вообще шрифт-то создаётся, или нет?
        Убрал CharToOem(fmt,red); выбрал щрифт Courier new; заменил на FF_MODERN; Но не помогает, выводятся латинские буквы с закарючками над ними.
        Шрифт вроде как создается(указатель возвращается в hF=CreateFontIndirect(&lF), если конечно это так проверяется).
        а настройки проекта могут влиять, типа использование Unicod или т.п. :huh:? :huh:
          Цитата Santal @
          типа использование Unicod или т.п.


          Легко. Попробуй без Юникода. Вернее, в glPrint сделай перевод из Юникода в 8-мибтную кодировку. Для начала.

          ExpandedWrap disabled
            p.Format(L"Красный");


          Не забудь убрать "L".

          Хотя, по идее, С Юникодом кошернее... :blink:

          Вообще, может, я туплю, но для коректной работы Юникода, нужно звать CreateFontIndirectW (или он и так зовётся?) + при вызове wglUseFontOutlines строить не первые 256 глифов, а все допустимые в Юникоде. Тут надо потыкать, навскидку не скажу.

          Но кодировочка где-то гадится, это однозначно :)
            Ура все получилось :D !
            barazuk, Спасибо за советы!

            Если интересно, как я изменил код.
            Я полностью все перевел под Юникод и теперь юникодовский текст выводится отлично!
            Я поменял
            ExpandedWrap disabled
              GLYPHMETRICSFLOAT  Char_List_Buffer[256];

            на
            ExpandedWrap disabled
              GLYPHMETRICSFLOAT  Char_List_Buffer[1120];

            затем заменил
            ExpandedWrap disabled
                base = glGenLists(1120);  //для хранения в диапазоне юникода размер увеличен до 1120 (от 0 до 1119)

            , так же поменял
            ExpandedWrap disabled
                wglUseFontOutlinesW(pdc->m_hDC,0, 1120, base, 0.0f, 0.6f, WGL_FONT_POLYGONS, Char_List_Buffer); //диапзон 0-255, заменен на юникодовский 0-1119

            Ну и наконец функция печати у меня стала выглядеть вот так
            ExpandedWrap disabled
              GLvoid CGraphVIEW::glPrint(CString fmt,float pt ...)        
              {
                  glPushMatrix();
                {
               
                if (fmt.IsEmpty()/)
                return;          
                glListBase(base);    
                glScaled(pt, pt, pt);
                glCallLists (wcslen(fmt), GL_UNSIGNED_SHORT,fmt); //Полностью поменялась
               }
               glPopMatrix();
               }
            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0737 ]   [ 14 queries used ]   [ Generated: 13.05.24, 02:59 GMT ]