无法将OpenGL ES纹理绘制到非圆形位置

时间:2010-03-07 22:35:41

标签: iphone opengl-es textures

绘制OpenGL ES纹理时,它们似乎“捕捉”到圆形像素位置,就好像绘制位置被舍入一样。即。在(x:1.1,y:5.4)绘制实际绘制(x:1,y:5)。这会导致纹理在滚动时显示为“跳跃”,而不是平滑移动。

是的,我正在为我的顶点使用浮点类型等。

绘图线等在非圆形位置下工作正常。

纹理的位置只有两个因素:

  1. 视口的翻译: glTranslatef(viewWidth/2.0f, viewHeight/2.0f, 0.0f);

  2. 抽奖地点: glVertexPointer(...); // see below

  3. 我正在使用以下代码绘制纹理:

    glTranslatef(scrollX, scrollY, 0.0f);
    
    ...
    
    glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    
    // Overlay map.
    glTexCoordPointer(2, GL_FLOAT, 0, textureSTs);
    glBindTexture(GL_TEXTURE_2D, texture.glTtextureKeyD);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    
    GLfloat vertices[] = {
     x1, y2,
     x1, y1,
     x2, y1,
     x2, y2,
    };
    glVertexPointer(2, GL_FLOAT, 0, vertices);
    glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
    

    我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

您的图片上传代码最有可能使用GL_NEAREST过滤,如果您希望对中间像素值进行良好过滤,最好的选择是GL_LINEAR过滤。尝试使用glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);绑定后。使用FSAA也可以降低效果。

另一种可能性是在纹理坐标中,尝试将它们调整1/2像素。因此,如果您的纹理是256 * 256,则将.5 / 256添加到每个坐标的浮点值。

答案 1 :(得分:1)

是你的x1,y2,  x1,y1,  x2,y1,  x2,y2,

浮动还是被截断?

设置x1,y1等的代码也是在进行除法乘法之前转换为浮点数吗?

x1 =(float)somevar * 0.5f

和你正在加入gltranslate的scrollX相同