纹理未缩放 OpenGL ES 2.0

Texture not scaled OpenGL ES 2.0

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

这是介质: 这是全屏半径:

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

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

假设你用三角扇组成的小队应该显示整个纹理,坐标为 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.

顺便说一句,如果您添加更多代码或四处移动行,像上面那样增加偏移量可能会导致难以跟踪错误。最好在循环结束时单独递增。

至于旋转圆:通常你只需旋转顶点位置,即重新计算它们。纹理坐标没有变化。或者,您可以保留顶点位置并旋转纹理坐标,但如果同时使用缩放、重新定位等,这会使事情变得更加复杂。