このコードで 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 シェーダを使用しています(この画像はタブレットから取得したもので、最初の画像は電話から取得したものです)