如何在OpenGL ES中将纹理加载到圆形上

3
我在将纹理加载到圆形上遇到了问题。我的圆是由三角形扇形绘制而成的,但输出效果很糟糕。
原始图像: Original Image 结果呈现为: The result 我的代码:
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();
    }
}

请帮助我理解这个问题


请描述您的问题。图片对于理解非常有帮助。 - Tim
请给我您的电子邮件。由于新用户无法发布任何图片,因此我无法在此处发布图片。 - Siddharth-Verma
我已经发布了所有内容...但现在我无法分析为什么我的纹理没有以正确的方式加载。 - Siddharth-Verma
这很好,现在这是一个更好的问题。 - Tim
1个回答

1
首先,您需要在texcoord数组中具有与顶点数组中的顶点元组相同数量的texcoord对。
看起来您只有3个纹理坐标对和360个顶点。
您需要有一个包含360个纹理坐标的texcoord数组。然后当绘制顶点时,vertex [0]获取texcoord [0],vertex [1]与texcoord [1]配对,依此类推。
===编辑===
您只需以类似于定义顶点的方式定义纹理坐标:使用数学公式循环定义。
例如,三角形扇形的第一个顶点位于圆的中心。对于您的圆心,您希望texcoord引用纹理的中心,即坐标(0.5,0.5)。
当您沿着边缘走时,请考虑哪个纹理坐标映射到该部分圆。因此,假设您的下一个顶点是圆的最右侧顶点,它位于与圆心相同的y值上。这个的texcoord将是(1.0,0.5),或者是垂直中间的纹理的右边缘。
圆形的顶点将具有纹理坐标(0.5,1.0),最左侧的顶点将是(0.0,0.5),等等。
您可以使用三角函数来填写其余的顶点。

我很感激你宝贵的反馈,Tim。这意味着我必须编写所有360个坐标吗?这样做会不会对我来说有点繁琐和不可行,以便分析所有360个坐标? - Siddharth-Verma
@shenles - 还有一个可能性是只使用贴图映射的四边形,但对于提问者来说,理解纹理坐标如何工作是很好的实践,考虑到他已经使用纹理扇绘制了他的圆形。 - Tim
@Tim 谢谢你的回答,我会继续努力并再次感谢你。 - Siddharth-Verma
@Tim,代码是一样的,结果也是相同的图像。请在此处添加您宝贵的代码,告诉我目前正在犯的错误,最好附带一个示例。如果您不介意花费宝贵的时间,可以尝试这段代码并指导我。 - Siddharth-Verma
@Tim 说实话,我有点困惑。我应该在 ByteBuffer bBuff2 上方添加一个 for 循环吗? - Siddharth-Verma
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接