纹理未缩放OpenGL ES 2.0

时间:2015-10-20 15:08:23

标签: java android opengl-es textures

我试图将纹理附加到我的游戏对象上,我发现,纹理总是被剪裁到我的对象的大小,所以如果我将半径设置为1f,我可以看到完整的纹理,否则我可以看到中心裁剪。在这里你可以看到,我如何创建圆圈。我对OpenGL很陌生,所以我真的不知道还能告诉你什么。谢谢你的帮助。

这是中等的: Medium radius 这是全屏半径: Full radius

private ViewObjectBuilder appendCircle(Geometry.Circle circle, int numPoints, float aspectRatio) {

    final int startVertex = mOffset / FLOATS_PER_VERTEX;
    final int numVertices = sizeOfCircleInVertices(numPoints);

    mVertexData[mOffset] = circle.center.x / aspectRatio;
    mTextureData[mOffset++] = (circle.center.x + 1f) * 0.5f;
    mVertexData[mOffset] = circle.center.y;
    mTextureData[mOffset++] = (circle.center.y + 1f) * 0.5f;

    for (int i = 0; i <= numPoints; i++) {
      float angleInRadians = ((float) i / (float) numPoints) * ((float) Math.PI * 2f);

      final float c = (float) Math.cos(angleInRadians);
      final float s = (float) Math.sin(angleInRadians);

      mVertexData[mOffset] =
          circle.center.x + circle.radius * c / aspectRatio;

      mTextureData[mOffset++] =
          (circle.center.x + circle.radius * c + 1f) * 0.5f;

      mVertexData[mOffset] = circle.center.y + circle.radius * s;

      mTextureData[mOffset++] =
          (circle.center.y + circle.radius * s + 1f) * 0.5f;
    }

    mDrawList.add(() -> glDrawArrays(GL_TRIANGLE_FAN, startVertex, numVertices));
    return this;
  }

1 个答案:

答案 0 :(得分:1)

这可能是由于根据圆半径重新计算纹理坐标。如果你想调整三角形扇形的大小,让纹理缩放只是重新定位顶点(或者用矩阵更好地变换顶点位置)。

假设您使用三角形扇形成的小队应显示整个纹理,坐标将为0.0 / 0.0,0.0 / 1.0,1.0 / 0.0和1.0 / 1.0。正如您所看到的,它们与顶点坐标无关,实际上根本没有变化(除非您想以某种方式为纹理设置动画)。

修改

重新阅读您的代码,您的对象似乎包含更多三角形以形成实际的圆形形状。在这种情况下,你只需像你一样计算纹理坐标(没有完全检查正确性),但使用半径为1,因此你可以直接使用正弦和余弦和偏移:

mTextureData[mOffset++] = c * 0.5f + 0.5f;
//assume c = 1.0 then your coordinate becomes 1.0, 
//if c = -1.0 then your coordinate becomes 0.0 etc.

顺便说一句,如果添加更多代码或移动线条,增加上述偏移量可能会导致很难跟踪错误。在循环结束时分别更好地增量。

至于旋转圆圈:通常你只是旋转顶点位置,即重新计算它们。纹理坐标不是变化。或者,您保留顶点位置并旋转纹理坐标,但如果使用缩放,重新定位等,这将使其更加复杂。