繁体   English   中英

如何在iPhone上使用OpenGL ES绘制实心圆?

[英]How do I draw a filled circle with OpenGL ES on iPhone?

如何在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属性,但是这将绘制一个与视口分辨率允许的一样清晰的圆,并且非常快速地完成。

一种方法是使用GL_POINTS:

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

另一种选择是使用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

这是使用着色器的超快速方法...只需使用顶点缓冲区制作一个Quad,并为四边形的每个角设置从-1到1的UV。

浮点数中的顶点缓冲区应如下所示:注意:这也需要索引缓冲区。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM