如何加载纹理到与OpenGL ES的一个圆(How to load a texture onto a

2019-09-22 14:49发布

我在加载纹理到圆面临的问题。 我的圈子与三角形风扇产生。 它提供了一个糟糕的输出。

原始图像:

结果 :

我的代码:

public class MyOpenGLCircle {

    private int points=360;
    private float vertices[]={0.0f,0.0f,0.0f};
    private FloatBuffer vertBuff, textureBuffer;
    float texData[] = null;


    float theta = 0;
    int[] textures = new int[1];
    int R=1;
    float textCoordArray[] = 
        {
            -R, (float) (R * (Math.sqrt(2) + 1)),
             -R, -R,
            (float) (R * (Math.sqrt(2) + 1)), -R
        };
    public MyOpenGLCircle(){

        vertices = new float[(points+1)*3];
        for(int i=0;i<(points)*3;i+=3)
        {       
                //radius is 1/3 
                vertices[i]=(float) ( Math.cos(theta))/3;
                vertices[i+1]=(float) (Math.sin(theta))/3;
                vertices[i+2]=0;
                theta += Math.PI / 90;

        }
        ByteBuffer bBuff=ByteBuffer.allocateDirect(vertices.length*4);    
          bBuff.order(ByteOrder.nativeOrder());
          vertBuff=bBuff.asFloatBuffer();
          vertBuff.put(vertices);
          vertBuff.position(0);


        ByteBuffer bBuff2=ByteBuffer.allocateDirect(textCoordArray.length * 4 * 360);
        bBuff2.order(ByteOrder.nativeOrder());
        textureBuffer=bBuff2.asFloatBuffer();
        textureBuffer.put(textCoordArray);
        textureBuffer.position(0);
    }

    public void draw(GL10 gl){ 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertBuff);
    gl.glEnable(GL10.GL_TEXTURE_2D);   
    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); //4
    gl.glTexCoordPointer(2, GL10.GL_FLOAT,0, textureBuffer); //5
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, points/2);
     }  

    public void loadBallTexture(GL10 gl, Context context, int resource){
        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resource);
        gl.glGenTextures(1, textures, 0);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
        bitmap.recycle();
    }
}

请帮我通过这个

Answer 1:

首先,你需要在你的texcoord阵列相同数量texcoord对你有顶点的元组在你的顶点数组。

它看起来像你刚刚得到3对纹理坐标,和360米的顶点。

你需要有一个其中有360个纹理坐标作为texcoord阵列。 然后,当顶点被绘制,顶点[0]被texcoord [0],顶点[1]获取与texcoord [1],等等配对

===编辑===

你只需要定义以类似的方式纹理坐标你如何定义你的顶点:使用数学公式中的一个循环。

因此,例如,你的三角形风扇的第一个顶点是在圆心。 为了您的圆心,你想要的texcoord引用质感,这是坐标为(0.5,0.5)的中心。

当你走在边缘,想想哪些纹理坐标映射到圆的一部分。 所以,让我们假设你的一个顶点是圆的最右边顶点,沿着相同的Y值作为圆心所在。 该texcoord为这一个将是(1.0,0.5),或纹理的上下中间的右边缘。

圆的顶部顶点将具有texcoord(0.5,1.0),最左边的顶点是(0.0,0.5)等。

您可以使用三角填写顶点的其余部分。



文章来源: How to load a texture onto a circle with OpenGL ES