2012-12-04 83 views
6

次の問題があります。 glPolygonOffsetはメッシュに対して完全に機能しますが、たとえばオブジェクトの上にワイヤフレームの輪郭線を描こうとすると、単純な線に対しては機能しません。ここでZ-ファイティングなしでOpenGLで別のラインを上に描画する方法

は、メッシュのためにどのように動作するかです:それはラインのために動作しません何らかの理由で

// draw object 
mTexture.enableAndBind(); 
gl::color(Colorf(1, 1, 1)); 
gl::draw(mVboMesh); 
mTexture.unbind(); 

// overlay wireframe 
gl::enableWireframe(); 
glLineWidth(1); 
glEnable(GL_POLYGON_OFFSET_LINE); 
glPolygonOffset(-1, -1); 
glColor3f(0, 0, 1); 
gl::draw(mVboMesh); 
glDisable(GL_POLYGON_OFFSET_LINE); 
gl::disableWireframe(); 

mesh

。私が達成しようとしているのは、グリッド上に座標枠の矢印を描くことです。私は線を描画していた時と全く同じGL_POLYGON_OFFSET_LINEモードを使用しています。しかし、この場合、glPolygonOffset(-1, -1);は全く違いはありません。私は100のような巨大な値で試してみましたが、それは同じです。絶対に効果はありません。

// enable 3D rendering 
gl::enable(GL_CULL_FACE); 
gl::enableDepthRead(); 
gl::enableDepthWrite(); 

// drawing the grid 
int size = 2000; 
int step = 25; 
gl::color(Colorf(0.2f, 0.2f, 0.2f)); 
for(float i = -size; i <= size; i += step) 
{ 
    glBegin(GL_LINES); 
    glVertex3f(i, 0, -size); 
    glVertex3f(i, 0, size); 
    glVertex3f(-size, 0, i); 
    glVertex3f(size, 0, i); 
    glEnd(); 
} 

// drawing the arrows 
glEnable(GL_POLYGON_OFFSET_LINE); 
glPolygonOffset(-1, -1); 

glBegin(GL_LINES); 
gl::color(Colorf(1, 0, 0)); 
glVertex3f(0, 0, 0); 
glVertex3f(100, 0, 0); 
gl::color(Colorf(0, 1, 0)); 
glVertex3f(0, 0, 0); 
glVertex3f(0, 100, 0); 
gl::color(Colorf(0, 0, 1)); 
glVertex3f(0, 0, 0); 
glVertex3f(0, 0, 100); 
glEnd(); 

glDisable(GL_POLYGON_OFFSET_LINE); 

// disable 3D rendering 
gl::disableDepthWrite(); 
gl::disableDepthRead(); 
gl::disable(GL_CULL_FACE); 

と私が得るZ-戦闘の例:

lines

一つのハックは、私が試したし、どのような完全に働いたことは次のとおりです。

ここで私がやっているものです
  1. 奥行読み取り無効、有効奥行き書き込み
  2. 描画グリッド
  3. のドロー矢印
  4. 深さを有効しかし、これは非常に特殊なケースであり、それはフラットグリッドと矢のために働く一方で、それが持つ他のほとんど何のために働かない他のオブジェクト

を描く

  • を読みます複雑な形状。

    私の質問は以下のとおりです。それはライン・オン・ポリゴンのために働くながら

    1. はなぜglPolygonOffsetは、ライン・オン・ラインの動作しませんか?
    2. 私はそれを上記のハックに頼らずにに修正することができますが、非常に特殊なケースでのみ動作しますか?

    //私は、フレームワークとして燃えがらを使用していますが、私は生のOpenGLを使用しているので、それは問題ではないはず

    コマンドの更新

    私は答えをチェックしました結果はカメラからの距離に依存するため、最初のコメントでは、そのメソッドも同様に動作しませんでした。

    //// draw coordinate frame and grid 
    glDepthRange (0.01, 1.0); 
    drawGrid(2000.0f, 25.0f); 
    glDepthRange (0.0, 0.99); 
    gl::drawCoordinateFrame(100.0f, 5.0f, 2.0f); 
    
    glDepthRange (0.0, 1.0); 
    
    // draw object 
    

    mix

  • +1

    [glPolygonOffset()lines with lines]の重複が可能です(http://stackoverflow.com/questions/2020451/glpolygonoffset-bugs-with-ライン) – genpfault

    答えて

    3

    私は1つのハックは、(のが近い0.1を言わせて)ビューポイントに少しだけ近い線を描画することであろうと思います。これはz戦闘を避けるべきです。

    これを行うには、ポイントからPOVの位置までの正規化された方向ベクトルを計算します。次に、小さな要素で縮尺し、ラインポイントの座標に追加します。

    関連する問題