4

iPhoneでopenGlを使用して塗りつぶされた円を描くにはどうすればよいですか?

私は多くの解決策を見つけましたが、どれもうまくいきません。おそらくそれを行うには多くの方法があるからでしょう。しかし、最短のコードでの方法は何ですか?

4

4 に答える 4

17

本当に滑らかな円を作成するには、カスタム フラグメント シェーダーが必要です。たとえば、次の頂点シェーダー:

 attribute vec4 position;
 attribute vec4 inputTextureCoordinate;

 varying vec2 textureCoordinate;

 void main()
 {
    gl_Position = position;
    textureCoordinate = inputTextureCoordinate.xy;
 }

およびフラグメント シェーダー:

 varying highp vec2 textureCoordinate;

 const highp vec2 center = vec2(0.5, 0.5);
 const highp float radius = 0.5;

 void main()
 {
     highp float distanceFromCenter = distance(center, textureCoordinate);
     lowp float checkForPresenceWithinCircle = step(distanceFromCenter, radius);

     gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) * checkForPresenceWithinCircle;     
 }

は、画面に描いた正方形の中に滑らかな赤い円を描きます。正方形の頂点をpositionアトリビュートに指定し、X および Y で 0.0 から 1.0 の範囲の座標をアトリビュートに指定する必要がありますinputTextureCoordinateが、これにより、ビューポートの解像度が許す限りシャープな円が描画され、非常に迅速に描画されます。

于 2012-07-12T17:31:14.557 に答える
2

1つの方法は、GL_POINTSを使用することです。

glPointSize(radius);
glBegin(GL_POINTS); 
glVertex2f(x,y); 
glEnd(); 

もう1つの方法は、GL_TRIANGLE_FANを使用することです。

radius = 1.0;
glBegin(GL_TRIANGLE_FAN);
glVertex2f(x, y);
for(int angle = 1; angle <= 360; angle = angle + 1)
glVertex2f(x + sind(angle) * radius, y + cosd(angle) * radius);
glEnd();
于 2012-07-12T13:35:10.613 に答える
1

円の頂点を取得するには:

     float[] verts=MakeCircle2d(1,100,0,0)

     public static float[] MakeCircle2d(float rad,int points,float x,float y)//x,y  ofsets
     {
            float[] verts=new float[points*2+2];
            boolean first=true;
            float fx=0;
            float fy=0;
            int c=0;
            for (int i = 0; i < points; i++)
            {
                    float fi = 2*Trig.PI*i/points;
                    float xa = rad*Trig.sin(fi + Trig.PI)+x ;
                    float ya = rad*Trig.cos(fi + Trig.PI)+y ;
                    if(first)
                    {
                        first=false;
                        fx=xa;
                        fy=ya;
                    }
                    verts[c]=xa;
                    verts[c+1]=ya;
                    c+=2;
            }
            verts[c]=fx;
            verts[c+1]=fy;
            return verts;
      }

空の円が必要な場合は、GL10.GL_LINES として描画します。

 gl.glDrawArrays(GL10.GL_LINES, 0, verts.length / 2);

または、塗りつぶしたものが必要な場合は、GL10.GL_TRIANGLE_FANとして描画します

 gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, verts.length / 2);

そのJavaですが、c ++ / objcに変換するのは本当に簡単です

于 2012-07-12T18:49:17.233 に答える
0

シェーダーを使用した超高速の方法は次のとおりです。頂点バッファーを使用してクワッドを作成し、クワッドの各コーナーの UV を -1 から 1 に設定するだけです。

float の頂点バッファーは次のようになります。 注: これにはインデックス バッファーも必要です。

var verts = new float[20]
{
    -1, -1, 0,   -1, -1,
    -1, 1, 0,   -1, 1,
    1, 1, 0,   1, 1,
    1, -1, 0,   1, -1,
};


#VS
attribute vec3 Position0;
attribute vec2 Texcoord0;

varying vec4 Position_VSPS;
varying vec2 Texcoord_VSPS;

uniform vec2 Location;

void main()
{
    vec3 loc = vec3(Position0.xy + Location, Position0.z);
    gl_Position = Position_VSPS = vec4(loc, 1);
    Texcoord_VSPS = loc.xy;
}
#END

#PS
varying vec4 Position_VSPS;
varying vec2 Texcoord_VSPS;

uniform vec2 Location;

void main()
{
    float dis = distance(Location, Texcoord_VSPS);
    if (.1 - dis < 0.0) discard;

    gl_FragData[0] = vec4(0, 0, 1, 1);
}
#END
于 2012-07-13T02:19:08.413 に答える