次の問題があります。 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();
。私が達成しようとしているのは、グリッド上に座標枠の矢印を描くことです。私は線を描画していた時と全く同じ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-戦闘の例:
一つのハックは、私が試したし、どのような完全に働いたことは次のとおりです。
ここで私がやっているものです- 奥行読み取り無効、有効奥行き書き込み
- 描画グリッド
- のドロー矢印
- 深さを有効しかし、これは非常に特殊なケースであり、それはフラットグリッドと矢のために働く一方で、それが持つ他のほとんど何のために働かない他のオブジェクト
を描く
私の質問は以下のとおりです。それはライン・オン・ポリゴンのために働くながら
- はなぜglPolygonOffsetは、ライン・オン・ラインの動作しませんか?
- 私はそれを上記のハックに頼らずにに修正することができますが、非常に特殊なケースでのみ動作しますか?
//私は、フレームワークとして燃えがらを使用していますが、私は生の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
[glPolygonOffset()lines with lines]の重複が可能です(http://stackoverflow.com/questions/2020451/glpolygonoffset-bugs-with-ライン) – genpfault