iPhoneでopenGlを使用して塗りつぶされた円を描くにはどうすればよいですか?
私は多くの解決策を見つけましたが、どれもうまくいきません。おそらくそれを行うには多くの方法があるからでしょう。しかし、最短のコードでの方法は何ですか?
本当に滑らかな円を作成するには、カスタム フラグメント シェーダーが必要です。たとえば、次の頂点シェーダー:
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
が、これにより、ビューポートの解像度が許す限りシャープな円が描画され、非常に迅速に描画されます。
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();
円の頂点を取得するには:
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に変換するのは本当に簡単です
シェーダーを使用した超高速の方法は次のとおりです。頂点バッファーを使用してクワッドを作成し、クワッドの各コーナーの 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