2011-06-30 4 views
3

GLUtesselatorを使用して、OpenGLで3D押し出しテキストを作成しようとしています。ここに関連するコードです:エッジフラグを有効にしGLU_TESS_EDGE_FLAGに関連付けられたコールバックがある場合GLUTessellatorにGL_TRIANGLESのみを使用させる方法はありますか?

private boolean createText(final String displayText) 
{ 
    final Font font = new Font("Times New Roman", Font.TRUETYPE_FONT, 3); 
    final float depth = 1000f; 
    final float flatness = 0.0001f; 

    final GlyphVector glyphVector = font.createGlyphVector(
      new FontRenderContext(new AffineTransform(), true, true), new StringCharacterIterator(displayText)); 
    final GeneralPath generalPath = (GeneralPath) glyphVector.getOutline(); 
    final PathIterator pathIterator = generalPath.getPathIterator(AffineTransform.getScaleInstance(1.0, -1.0), 
      flatness); 

    tesselateFace(pathIterator, false, 0.0f); 
    return false; 
} 

private void tesselateFace(final PathIterator pathIterator, final boolean justBoundary, final double tessZ) 
{ 
    final GLUtessellatorCallback callback = new TessellatorCallback(); 
    final GLUtessellator tessellator = glu.gluNewTess(); 

    glu.gluTessCallback(tessellator, GLU.GLU_TESS_BEGIN, callback); 
    glu.gluTessCallback(tessellator, GLU.GLU_TESS_END, callback); 
    glu.gluTessCallback(tessellator, GLU.GLU_TESS_ERROR, callback); 
    glu.gluTessCallback(tessellator, GLU.GLU_TESS_VERTEX, callback); 
    glu.gluTessCallback(tessellator, GLU.GLU_TESS_COMBINE, callback); 

    if (pathIterator.getWindingRule() == PathIterator.WIND_EVEN_ODD) 
     glu.gluTessProperty(tessellator, GLU.GLU_TESS_WINDING_RULE, GLU.GLU_TESS_WINDING_ODD); 
    else 
     glu.gluTessProperty(tessellator, GLU.GLU_TESS_WINDING_RULE, GLU.GLU_TESS_WINDING_NONZERO); 

    if (justBoundary) 
     glu.gluTessProperty(tessellator, GLU.GLU_TESS_BOUNDARY_ONLY, GL.GL_TRUE); 
    else 
     glu.gluTessProperty(tessellator, GLU.GLU_TESS_BOUNDARY_ONLY, GL.GL_FALSE); 

    glu.gluTessProperty(tessellator, GLU.GLU_TESS_EDGE_FLAG, GL.GL_TRUE); 

    glu.gluTessBeginPolygon(tessellator, (double[]) null); 

    while (!pathIterator.isDone()) 
    { 
     final double[] coords = new double[3]; 
     coords[2] = tessZ; 
     switch (pathIterator.currentSegment(coords)) 
     { 
     case PathIterator.SEG_MOVETO: 
      glu.gluTessBeginContour(tessellator); 
      break; 
     case PathIterator.SEG_LINETO: 
      glu.gluTessVertex(tessellator, coords, 0, coords); 
      break; 
     case PathIterator.SEG_CLOSE: 
      glu.gluTessEndContour(tessellator); 
      break; 
     } 

     pathIterator.next(); 
    } 
    glu.gluTessEndPolygon(tessellator); 

    glu.gluDeleteTess(tessellator); 
} 

私は第11章では、レッドブックを信じることになっている場合は、

が...、GLU_TESS_BEGINコールバックがありますGL_TRIANGLESでのみ呼び出されます。

私はGL_TRIANGLESを使用して描画する必要があると私は信じています。

しかし、自分のカスタムテレレーターコールバックで呼び出されるタイプはGL_TRIANGLE_FAN,GL_TRIANGLE_STRIPまたはGL_TRIANGLESのいずれかになります。私はGL_QUADSまたはGL_TRIANGLES以外の何かを処理できるVBOを作成する時間が過ぎてしまったので、これを強制する方法があるかどうか尋ねるだけです。

+0

私はあなたの関数のバグを発見しました。 'PathIterator.SEG_MOVETO'の場合、あなたは' GLU.gluTessVertex(tessellator、coords、0、coords) 'を呼び出しませんでした。 – Vincent

答えて

2

エッジコールバックを提供しただけの場合(何もしなかったとしても)、三角形しか得られません。 私は過去に同じ問題を持っていたし、このコードを発見し、コメントしている必要があります:

// providing this callback should stop triangle fans/strips coming back 
if not fBoundaryOnly then 
    gluTessCallback(tess, GLU_TESS_EDGE_FLAG_DATA, @tessEdgeData); 

のNb、これはDelphiコードであるが、それでも意味を確認する必要があります。 @tessEdgeDataは何もしないコールバックルーチンへのポインタです。

2

サザントKKのソリューションが動作します。

誰かがC++の中で、それを必要とする場合、コードは次のようになります。

void CALLBACK edgeCallback(void){return;} 
gluTessCallback(Tobj, GLU_TESS_EDGE_FLAG_DATA,reinterpret_cast<_GLUfuncptr>(edgeCallback)); 
関連する問題