2

私は最初のシェーダーを作るのを楽しんでいました。最初のテスト対象は100x100のクワッドフェイスの写真でした。使い方を学ぼうと思ったTRIANGLE_STRIPので、切り替えて、頂点呼び出しの1つを移動して、再び正方形に見えるようにしました。シェーダーをオンにすると、そのすぐ後ろに1つの面だけの複製がありましたが、全体のテクスチャがありました。この形状の描画呼び出しは1セットしかありません。

これが私の形状コードです:

glBegin(GL_TRIANGLE_STRIP);
    float vx;
    float vy;
    for(float x=0; x<100; x++){
        for(float y=0; y<100; y++){
            float vx=x/5.0;
            float vy=y/5.0;
            glTexCoord2f(0.01*x, 0.01*y);
            glVertex3f(vx, vy, 0);

            glTexCoord2f(0.01+0.01*x, 0.01*y);
            glVertex3f(.2+vx, vy, 0);

            glTexCoord2f(0.01*x, 0.01+0.01*y);
            glVertex3f(vx, .2+vy, 0);

            glTexCoord2f(0.01+0.01*x, 0.01+0.01*y);
            glVertex3f(.2+vx, .2+vy, 0);
    }}
glEnd();

そして私の(頂点)シェーダーコード:

uniform float uTime,uWaveintensity,uWavespeed;
uniform float uZwave1,uZwave2,uXwave,uYwave;
void main(){
vec4 position = gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
position.z=((sin(position.x+uTime*uWavespeed)*uZwave1)+(sin(position.y+uTime*uWavespeed))*uZwave2)*uWaveintensity;
position.x=position.x+(sin(position.x+uTime*uWavespeed)*uXwave)*uWaveintensity;
position.y=position.y+(sin(position.y+uTime*uWavespeed)*uYwave)*uWaveintensity;
gl_Position = gl_ModelViewProjectionMatrix * position;
}

共有頂点(triangle_strips)を使用してより効率的に描画するための情報を誰かが持っている場合、私はグーグルで検索しましたが、これまでのところXDについては理解していません。知りたいです。

スクリーンショット:8x8面

ここに画像の説明を入力してください

同じもの同じ角度、lines =ghost

ここに画像の説明を入力してください

今何が起こっているのかわかりますが、修正する方法がわかりません。

4

1 に答える 1

4

この方法で三角形のストリップを使用して 100x100 のクワッド プレーンを作成できるとは思いません。これで、行と列が一方向に移動します。つまり、最初の行の最後の 2 つの頂点が 2 番目の行の最初の頂点を持つ三角形を作成し、それはあなたが望むものではありません。

三角形のストリップがどのように機能するかを学ぶために 2x2 パターンから始めてから、奇数と偶数の状況の違いを確認するために 3x3 と 4x4 に移動することをお勧めします。問題をある程度理解したら、ユニバーサル アルゴリズムを作成し、サイズを 100 に変更できます。

この後、頂点シェーダーに集中して波打つようにします。

そして将来のために: 物事がどのように機能するかを学んでいるのであれば、決してビッグデータから始めないでください. :)

編集:

私がこの回答を書いたので、縮退した三角形を使用して、1つのトライストリップで2つの次元グリッドをすでに作成できることを学びました:)。

三角形が同じ頂点を 2 回使用すると、レンダリング中にラスタライザーによって無視されるため、最初のストリップの最後で、最初のストリップの最後の頂点と 2 番目のストリップの最初の頂点を使用して縮退三角形を作成できます。2 つの頂点のどちらを 3 番目の頂点として使用しても、それらが正しい順序 (1,1,2 または 1,2,2 など) であれば問題ありません。このようにして、描画されない三角形を作成しましたが、次の「開始」点が 2 番目のストリップの開始点に移動し、メッシュの作成を続行できます。

欠点は、変換されるが描画されないいくつかの三角形を作成することです(それらの多くはありません)が、利点は、はるかに高速な GPU に対して 1 つの 'draw strip' コマンドを実行することです。

于 2012-08-02T15:13:00.470 に答える