3

我在将纹理加载到圆上时遇到问题。我的圆圈是用三角扇做成的。它给出了一个糟糕的输出。

原图: 原始图像

结果 : 结果

我的代码:

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();
    }
}

请帮我解决这个问题

4

1 回答 1

1

对于初学者,您的 texcoord 数组中的 texcoord 对的数量需要与顶点数组中的顶点元组数量相同。

看起来您刚刚获得了 3 对纹理坐标和 360 个顶点。

您需要有一个 texcoord 数组,其中包含 360 个纹理坐标。然后当绘制顶点时,vertex[0] 得到 texcoord[0],vertex[1] 与 texcoord[1] 配对,等等。

===编辑===

您只需要以与定义顶点类似的方式定义纹理坐标:在循环中使用数学公式。

例如,三角形扇形的第一个顶点位于圆的中心。对于圆心,您希望 texcoord 参考纹理的中心,即坐标 (0.5, 0.5)。

当您绕过边缘时,只需考虑哪个纹理坐标映射到圆的那个部分。所以让我们假设你的下一个顶点是圆的最右边的顶点,它与圆的中心位于相同的 y 值上。这个的 texcoord 将是 (1.0, 0.5),或垂直中间的纹理的右边缘。

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

您可以使用三角函数来填充其余顶点。

于 2012-09-19T19:25:21.373 回答