2013-05-26 60 views
0

這是從this派生的字體渲染器。我大部分的代碼改變的速度要快得多(就像我看到的那樣)。現在我來,我看到的一點是C++使用triangle_strip繪製連續紋理化四邊形

glCallList() < (4,8) < glDrawElements(GL_QUADS) < glDrawElements(GL_TRIANGLE_STRIP) ...所以它意味着glDrawElements (GL_TRIANGLE_STRIP)是這種渲染中最有效的方法。

然而,從GL_QUADS切換到GL_TRIANGLE_STRIP後,紋理成了這個樣子:

(請注意,我換頂點的最後4個值和GL_QUADS切換到GL_TRIANGLE_STRIP當紋理座標)

such nonsense description

尤其是,驗證碼:

void Text2D::PrintText5(BMfont& font, int x, int y, const char* text) { 

float w = 0; 
glPushAttrib(GL_LIST_BIT | GL_CURRENT_BIT | GL_ENABLE_BIT | GL_TRANSFORM_BIT); 

glEnable(GL_TEXTURE_2D); 
//glDisable(GL_TEXTURE_2D); 
glEnable(GL_BLEND); 
glDisable(GL_LIGHTING); 
glDisable(GL_DEPTH_TEST); 

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glGetFloatv(GL_MODELVIEW_MATRIX, font.mmat); 
glMatrixMode(GL_MODELVIEW); 

glScalef(font.scale, font.scale, 1.f); 

if (!compiledd) 
while (*text) 
{ 
    compiledd = true; 
    const BMchar& _char(font.chars[(int)*(text++)]); 
    if (_char.width) { 

     const float verices[] = { 
      (float) x + w + _char.x_ofs    , (float) y + _char.height + _char.y_ofs, 
      (float) x + w + _char.width + _char.x_ofs, (float) y + _char.height + _char.y_ofs, 

      (float) x + w + _char.x_ofs    , (float) y + _char.y_ofs, 
      (float) x + w + _char.width + _char.x_ofs, (float) y + _char.y_ofs, 
     }; 

     for (int i = 0;i < sizeof(verices)/sizeof(float); ++i) { 
      verts3.push_back(verices[i]); 
     } 

     const float texcoords[] = { 
      (float) _char.x/(float) font.scaleW    , (float) InvertY2((_char.y + _char.height)/(float) font.scaleH), 
      (float)(_char.x + _char.width)/(float) font.scaleW, (float) InvertY2((_char.y + _char.height)/(float) font.scaleH), 

      (float) _char.x/(float) font.scaleW    , (float) InvertY2(_char.y/(float) font.scaleH), 
      (float)(_char.x + _char.width)/(float) font.scaleW, (float) InvertY2(_char.y/(float) font.scaleH), 
     }; 

     for (int i = 0;i < sizeof(texcoords)/sizeof(float); ++i) { 
      coords3.push_back(texcoords[i]); 
     } 

     const unsigned char colors[] = { 
      255, 0, 255, 
      255, 0, 255, 
      255, 0, 255, 
      255, 0, 255 
     }; 

     indices3.push_back(a++);indices3.push_back(a++);indices3.push_back(a++);indices3.push_back(a++); 

     for (int i = 0;i < sizeof(colors)/sizeof(unsigned char); ++i) { 
      color3.push_back(colors[i]); 
     } 

     w += (float)(_char.x_advance - _char.x_ofs); 

    } else w += (float)font.base; 

} 

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 
glEnableClientState(GL_INDEX_ARRAY); 

glVertexPointer (2, GL_FLOAT, 0, &verts3[0]); 
glTexCoordPointer(2, GL_FLOAT, 0, &coords3[0]); 
glColorPointer(3, GL_UNSIGNED_BYTE, 0, &color3[0]); 

glBindTexture(GL_TEXTURE_2D, font.texture); 
glDrawElements(GL_TRIANGLE_STRIP, verts3.size()/2, GL_UNSIGNED_INT, &indices3[0]); 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisableClientState(GL_COLOR_ARRAY); 
glDisableClientState(GL_INDEX_ARRAY); 

glDisable(GL_TEXTURE_2D); 
glPopAttrib(); 
} 

我該怎麼辦,最後的字體渲染器來渲染同其他?

(它仍然在工作,即使我沒有glIndexPointer() ???)

+0

兩件事:四邊形不與三角形條相同的順序。其次,*文本不應該是連續的*。除非你討厭字距和適當的文字佈局。 –

+0

那麼這意味着它不可能做到這一點? – mr5

+0

如果你問是否不可能爲四邊形和三角形條使用相同的索引數據,答案是肯定的。另外,「索引數組」不是你認爲的那樣。 –

回答

0

而且是的,我想通了again..guess什麼?它不可能做到這一點

+0

知道是否還有更昂貴的方法來渲染,但不使用'glDrawElements'也許會很有趣? – Chris