3

このコードで VBO を生成しています

    int SCREEN_WIDTH = 800;
    int SCREEN_HEIGHT = 480;
    int PIXEL_PER_VERTEX = 4;
    int CAVERN_TEXTURE_WIDTH = 1024;
    int CAVERN_TEXTURE_HEIGHT = 512;

    final int vertexCount = ((SCREEN_WIDTH / PIXEL_PER_VERTEX) +1 ) * 2;
    final float[] bufferDataLowerCave = new float[vertexCount * CavernBoundMesh.VERTEX_SIZE];

    for(int i=0; i < vertexCount; i += 2) {
        bufferDataLowerCave[i * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.VERTEX_INDEX_X] = PIXEL_PER_VERTEX * i / 2.f;
        bufferDataLowerCave[i * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.VERTEX_INDEX_Y] = 200;
        bufferDataLowerCave[i * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.TEXTURECOORDINATES_INDEX_U] = ( (float) PIXEL_PER_VERTEX * i / 2.f) / SCREEN_WIDTH;
        bufferDataLowerCave[i * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.TEXTURECOORDINATES_INDEX_V] = 0.f;

        bufferDataLowerCave[(i + 1 ) * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.VERTEX_INDEX_X] = PIXEL_PER_VERTEX * i / 2;
        bufferDataLowerCave[(i + 1 ) * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.VERTEX_INDEX_Y] = 0;
        bufferDataLowerCave[(i + 1 ) * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.TEXTURECOORDINATES_INDEX_U] = ( (float) PIXEL_PER_VERTEX * i / 2.f) / SCREEN_WIDTH;
        bufferDataLowerCave[(i + 1 ) * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.TEXTURECOORDINATES_INDEX_V] = 0.5f;
    }

TRIANGLE_STRIPでメッシュ(原点の中心)を描いています。

申し訳ありませんが、エンジン (AndEngine) を使用しているため、openGL コードはありません。しかし、本当に必要なら、私はそれを追跡しようとすることができます.. 不正なメッシュが表示されました

画像でわかるように、最後の 2 つの頂点は原点の頂点に接続されています。VBO の作成をデバッグしました。これが最初と最後の頂点です。

//X       Y       U        V
[0.0,    200.0,  0.0,     0.0,
 0.0,    0.0,    0.0,     0.5,
 4.0,    200.0,  0.0050,  0.0,
 4.0,    0.0,    0.0050,  0.5,
 8.0,    200.0,  0.01,    0.0,
 8.0,    0.0,    0.01,    0.5,
 12.0,   200.0,  0.015,   0.0,
 12.0,   0.0,    0.015,   0.5,
 16.0,   200.0,  0.02,    0.0,
 16.0,   0.0,    0.02,    0.5
 [..]
 780.0,  200.0,  0.975,   0.0,
 780.0,  0.0,    0.975,   0.5,
 784.0,  200.0,  0.98,    0.0,
 784.0,  0.0,    0.98,    0.5,
 788.0,  200.0,  0.985,   0.0,
 788.0,  0.0,    0.985,   0.5,
 792.0,  200.0,  0.99,    0.0,
 792.0,  0.0,    0.99,    0.5,
 796.0,  200.0,  0.995,   0.0,
 796.0,  0.0,    0.995,   0.5]

これは私が使用した頂点シェーダーです

uniform mat4 u_modelViewProjectionMatrix;
uniform float u_elapsedSeconds;

attribute vec4 a_position;
attribute vec2 a_textureCoordinates;

varying vec2 v_textureCoordinates;

void main(void)
{
    v_textureCoordinates = a_textureCoordinates;
    vec4 temp_position = u_modelViewProjectionMatrix * a_position;

    float variation = 0.3*sin((u_elapsedSeconds + 1.5 * temp_position.x))*(1.0 + temp_position.y);
    temp_position.y += variation;

    gl_Position = temp_position;
}

私はこのようなものに非常に慣れていないので、仕様とその仕組みはよくわかりませんが、この奇妙な効果を生み出すために何が起こっているのか本当に理解できません. あなたは私を助けることができます?

EDIT1:

さらにいくつかのテストを行いました.位置とテクスチャからフェッチする色を設定するだけの標準の頂点およびフラグメントシェーダーを使用しても、奇妙な結果が得られます。

EDIT2:さらにいくつかの画像。今回は、位置とテクスチャの色に 2 つの標準の vert シェーダと frag シェーダを使用しています(この画像はタブレットから取得したもので、最初の画像は電話から取得したものです)

間違った画像 1 2° 間違ったイメージ 3° 間違ったイメージ 私のお気に入りの間違ったイメージ

4

2 に答える 2

2

頂点自体は私には問題ないように見えるので、描画コードに間違った数のプリミティブを指定していると確信しています。openGL またはその他の 3D プリミティブ描画への描画呼び出しを行う場合、描画する頂点の数ではなく、プリミティブの数を指定します。あなたの場合のプリミティブは三角形です。

描画している三角形のストリップであるため、呼び出しでは常にnumberOfVertices - 2プリミティブです。それが三角形のリストである場合は でnumberOfVertices/3あり、三角形ファンの場合はnumberOfVertices - 2再びです。

描画するデータよりも多くの三角形を描画するように指定している可能性があるため(0,0,0,0)、テクスチャ座標も参照している左下隅に 2 つの縮退した三角形を描画しようとしていることを説明するデフォルトを使用している可能性があります0,00,0リストには位置と T/Uを持つ頂点さえないため、これも理にかなってい0,0ます。そのため、最後の頂点はデフォルト値でなければなりません。

于 2012-08-28T17:17:26.803 に答える
0

わかりました、私はそれを解決しました。

libgdx を試した後 (私はそれがあまり好きではありません。多くのユーティリティ関数が欠落しているようです。また、その背後にある概念、たとえば、テクスチャの処理方法、エンティティの管理方法など) を実際には把握していません) および実装jni を使用したネイティブ言語の非常に小さなレンダラーで、cocos-2d-x もセットアップしました (ただし、最初に jni コードで少し遊んで上記のレンダラーを作成したため、試していません) AndEngine に戻りました。

VBO と IBO を使用してメッシュを実装することに成功しましたが、最終的に、VBO の開始点と終了点で複製 (2 つの同一の頂点を追加) することで問題を解決し、追加の三角形が縮退して描画されないようにしました。したがって、これはほとんどの回避策ですが、機能する限り..

于 2012-09-02T19:51:50.303 に答える