2012-01-25 14 views
10

私はこの奇妙な問題を抱えています。私は何が間違っているのかを理解してそれに応じて行動できるように、誰かが私のためにこれをクリアできることを願っています。 OpenGL(固定機能)では、私は正射投影で内面を持つチューブをレンダリングしています。OpenGLパースペクティブ歪み

次の図は、結果を示しています。これは、左に示すインデックスパターンを使用して三角形を形成している頂点の4つのリングで構成されています。私はあなたの便宜のためにチューブの頂点に番号を付けました。右側にはテクスチャが使用されている:

enter image description here

あなたはテクスチャが大きく歪んされて見ることができるように。私が最初に頂点の2つの環のみを持つチューブを作成したとき、私はリングの量を上げると歪みは修正されるが、喜びはないと思った。また、glHintはこの特定の問題に影響しないようです。

テクスチャ座標は問題ありません。また、チェッカーのパターンは正しく表示されているようですが、その非常に特殊なパターンで歪みが見えないと思います。

十字線は存在しないため、無視してください。私はGL_LINE_LOOPを通してワイヤフレームをレンダリングしました。

+0

これは正射投影を使用している可能性がありますか? – geofftnz

答えて

2

この特殊な効果は、テクスチャ座標を三角形で補間する方法によって発生します。何が起こるかは、一方の方向が主要な要素になり、他方の方向が歪んだことです。あなたの標本はこれに非常に敏感です。また、これは、床や壁の透視投影やテクスチャで問題になることもあります。あなたが必要とするものは、いわゆる「視点正しいテクスチャリング」PCTです。これにはglHintがありますが、すでに試してみました。

これを避けるための唯一の方法は、遠近法補正を同様に適用してを細分することです。しかし、幸運にもこれはあなたのような四角形ベースのジオメトリーには十分簡単です。エッジを細分するとき、すべての4つのエッジに沿ってサブディビジョンセンタのテクスチャ座標を補間し、そのうちの4つの平均値を使用します。 1つのエッジに沿ってのみテクスチャ座標を補間することは、避けたいものです。

ジオメトリデータをそのままにしたい場合は、フラグメントシェーダでPCTを実装できます。

+0

私はリングを追加しようとしましたが、リングごとに頂点を追加してみることはありませんでしたが、これで問題は解決しました。だから確かに、細分化は道のりだった。ありがとう! –

0

は、いくつかの細分化をお試しください:

template< typename Vec > 
void glVec2d(const Vec& vec) 
{ 
    glVertex2f(static_cast<float>(vec.x()) , static_cast<float>(vec.y())); 
} 

template< typename Vec > 
void glTex2d(const Vec& vec) 
{ 
    glTexCoord2f(static_cast<float>(vec.x()) , static_cast<float>(vec.y())); 
} 

template< typename Vec > 
void glQuad 
    (
    const Vec& A, 
    const Vec& B, 
    const Vec& C, 
    const Vec& D, 
    unsigned int divs = 2, 
    const Vec& At = Vec(0,0), 
    const Vec& Bt = Vec(1,0), 
    const Vec& Ct = Vec(1,1), 
    const Vec& Dt = Vec(0,1) 
    ) 
{ 
    // base case 
    if(divs == 0) 
    { 
     glTex2d(At); 
     glVec2d(A); 

     glTex2d(Bt); 
     glVec2d(B); 

     glTex2d(Ct); 
     glVec2d(C); 

     glTex2d(Dt); 
     glVec2d(D); 

     return; 
    } 

    Vec AB = (A+B) * 0.5; 
    Vec BC = (B+C) * 0.5; 
    Vec CD = (C+D) * 0.5; 
    Vec AD = (A+D) * 0.5; 
    Vec ABCD = (AB+CD) * 0.5; 

    Vec ABt = (At+Bt) * 0.5; 
    Vec BCt = (Bt+Ct) * 0.5; 
    Vec CDt = (Ct+Dt) * 0.5; 
    Vec ADt = (At+Dt) * 0.5; 
    Vec ABCDt = (ABt+CDt) * 0.5; 

    // subdivided point layout 
    // D CD C 
    // 
    // AD ABCD BC 
    // 
    // A AB B 

    // subdivide 
    glQuad2d(A, AB, ABCD, AD, divs - 1, At, ABt, ABCDt, ADt); 
    glQuad2d(AB, B, BC, ABCD, divs - 1, ABt, Bt, BCt, ABCDt); 
    glQuad2d(ABCD, BC, C, CD, divs - 1, ABCDt, BCt, Ct, CDt); 
    glQuad2d(AD, ABCD, CD, D, divs - 1, ADt, ABCDt, CDt, Dt); 
} 

私は通常VecためEigen::Vector2fを使用しています。

0

なぜこれに対して正射投影を使用していますか?透視投影を使用していた場合、OpenGLはテクスチャマッピングを修正します。

関連する問題