10

私はこの奇妙な問題を抱えています.誰かが私のためにこれを解決してくれることを願っています. OpenGL (固定機能) では、正投影で内面を持つチューブをレンダリングしています。

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

ここに画像の説明を入力

ご覧のとおり、テクスチャが大きく歪んでいます。最初に頂点のリングが 2 つしかないチューブを作成したので、リングの数を増やすと歪みは修正されると思いましたが、喜びはありませんでした。また、glHint はこの特定の問題に影響を与えないようです。

テクスチャ座標は問題ないようです。また、チェッカー パターンは正しくレンダリングされているように見えますが、その特定のパターンでは歪みが見えないだけだと思います。

交差した線は無視してください。そのうちの 1 つは存在しないエッジです。GL_LINE_LOOP でワイヤーフレームをレンダリングしました。

4

3 に答える 3

2

この特定の効果は、テクスチャ座標が三角形に補間される方法によって引き起こされます。何が起こるかというと、一方の方向が主要な構成要素になり、もう一方の方向は歪んでいます。あなたの標本はたまたまこれに非常にかかりやすいです。これは、床や壁の遠近法による投影やテクスチャの問題でもあります。必要なのは、いわゆる「パースペクティブ正しいテクスチャリング」PCTです。これにはありglHintますが、あなたはすでにそれを試したと思います。

率直に言って、これを回避する唯一の方法は、パースペクティブ補正を細分化して適用することです。しかし幸いなことに、これは四辺形ベースの地理学(あなたのような)にとっては十分に簡単です。エッジを細分割するときは、4つのエッジすべてに沿って細分割の中心でテクスチャ座標を補間し、そのうちの4つの平均値を使用します。1つのエッジに沿ってのみテクスチャ座標を補間することは、まさに避けたいことです。

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

于 2012-01-25T22:25:43.253 に答える
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 );
}

私は通常のために使用Eigen::Vector2fVecます。

于 2012-01-25T21:45:56.443 に答える
0

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

于 2012-01-25T22:34:06.580 に答える