1

私はOpenGLES2.0で最初のステップを実行しており、iPodtouchで試してみています。この座標の問題をどのように解決するのか疑問に思いました。

よりよく説明するために、私はクワッドを描画し、頂点シェーダーを使用して回転/移動しようとしていました(これは、私が読んだことから、それを行う唯一の方法のように思われるためです)。

私はiPodを使用しているので、1.5 : 1比率とビューポートを設定します。

glViewport(0, 0, backingWidth, backingHeight);

したがって0,0、クリッピングの中心と境界は、、などにある必要があります-1.0, -1.0-1.0, 1.0右?)

正方形を描くには、アスペクト比のためにx座標とy座標に異なる値を使用する必要がありました。

static const GLfloat lineV[] = {
        -0.5f, 0.33f,  0.5f, 0.33f,
         0.5f, 0.33f,  0.5f,-0.33f, 
         0.5f,-0.33f, -0.5f,-0.33f,
        -0.5f,-0.33f, -0.5f, 0.33f,
        -0.5f, 0.33f,  0.5f,-0.33f,
         0.5f, 0.33f, -0.5f,-0.33f,
    };

これは両方の対角線を持つ正方形です(インデックスを使用する方が効率的であることはわかっていますが、それは重要ではありません)。

次に、オブジェクトを移動しながら回転させる頂点シェーダーを作成してみました。

void main()
{
    m = mat4( cos(rotation), sin(rotation), 0.0, 0.0,
             -sin(rotation), cos(rotation), 0.0, 0.0,
                        0.0,           0.0, 1.0, 0.0,
                        0.0,           0.0, 0.0, 1.0);

    m2 = mat4(1.0);
    m2[1][3] = sin(rotation)*0.8;
    gl_Position = position*(m*m2);
}

動作しますが、座標が同じではないため、クワッドは回転中に歪んでしまいます。どうすればそれを防ぐことができますか?ビュー錐台を異なる境界に変更することが可能かどうかを考えました(y軸を拡大すると問題が解決するように両方の軸で-1.0から1.0ではありません)。

さらに、マトリックスを使用するためのより良い方法はありますか?glRotatefつまり、行列全体を指定せずに使用することに慣れていました。このタスクを実行するための便利な関数/コンストラクターは存在しますか?

4

2 に答える 2

0

の最初の引数glViewport()は中心ではなく、左下隅の座標です。

通常はgluPerspective()を使用して、アスペクトを考慮したプロジェクションを設定する必要があります(GLUがESで利用可能な場合)。

于 2010-01-15T14:31:13.960 に答える
0

私が見たものから、過剰またはサポート機能は提供されていません。基本的に、頂点を構築するときに等しい座標を使用し、頂点シェーダーを使用してy軸を正しいアスペクト比でスケーリングすることで解決しました。

于 2010-01-16T14:19:28.787 に答える