14

私はOpenGL ES 2 の初心者であり、Android の OpenGL ES 2 で円を描く方法に関する多くのトピックを読みました。Drawing Shapesgamedev.net にあるこのコードに基づいて、三角形と四角形を描くことができますが、円を描く方法はまだわかりません。円を描くには、次の 3 つの方法があります。

  1. 円で頂点を生成し、glDrawArray( GL_LINES, ... ) を使用します。生成する頂点の数によっては、きれいで鮮明な結果が得られます。
  2. 事前に生成された円のテクスチャ (アルファ透明度を使用) を使用して、四角形にマップします。これにより、非常に滑らかなグラフィックスが得られ、「太い」円が可能になりますが、それほど柔軟ではありません。ミップマッピングを使用しても、テクスチャをクワッドをレンダリングするのとほぼ同じサイズにする必要があります。
  3. フラグメント シェーダーを使用します。

しかし、どうすればそれらを実装できますか?

4

5 に答える 5

14

円のジオメトリを作成する場合は、次のようにします。

int vertexCount = 30;
float radius = 1.0f;
float center_x = 0.0f;
float center_y = 0.0f;

// Create a buffer for vertex data
float buffer[] = new float[vertexCount*2]; // (x,y) for each vertex
int idx = 0;

// Center vertex for triangle fan
buffer[idx++] = center_x;
buffer[idx++] = center_y;

// Outer vertices of the circle
int outerVertexCount = vertexCount-1;

for (int i = 0; i < outerVertexCount; ++i){
    float percent = (i / (float) (outerVertexCount-1));
    float rad = percent * 2*Math.PI;

    //Vertex position
    float outer_x = center_x + radius * cos(rad);
    float outer_y = center_y + radius * sin(rad);

    buffer[idx++] = outer_x;
    buffer[idx++] = outer_y;
}

//Create VBO from buffer with glBufferData()

次に、次のいずれかとして glDrawArrays() を使用して描画できます。

  • GL_LINE_LOOP (輪郭のみ) または
  • GL_TRIANGLE_FAN (塗りつぶし形状)

.

// Draw circle contours (skip center vertex at start of the buffer)
glDrawArrays(GL_LINE_LOOP, 2, outerVertexCount);

// Draw circle as a filled shape
glDrawArrays(GL_TRIANGLE_FAN, 0, vertexCount);
于 2013-08-09T13:02:35.013 に答える
0

「goal」の投稿で気づいた大きな欠陥の 1 つは、円の位置を変更できないことです。

これが修正です。「for」ループの最初の 2 行の終わりに注目してください。

vertices[0] = 0;
vertices[1] = 0;
vertices[2] = 0;

for (int i =1; i <364; i++){
    vertices[(i * 3)+ 0] = (float) (0.5 * Math.cos((3.14/180) * (float)i ) + vertices[0]);
    vertices[(i * 3)+ 1] = (float) (0.5 * Math.sin((3.14/180) * (float)i ) + vertices[1]);
    vertices[(i * 3)+ 2] = 0;
}
于 2013-11-19T22:50:27.273 に答える