纹理未缩放 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.
顺便说一句,如果您添加更多代码或四处移动行,像上面那样增加偏移量可能会导致难以跟踪错误。最好在循环结束时单独递增。
至于旋转圆:通常你只需旋转顶点位置,即重新计算它们。纹理坐标没有变化。或者,您可以保留顶点位置并旋转纹理坐标,但如果同时使用缩放、重新定位等,这会使事情变得更加复杂。
我试图将纹理附加到我的游戏对象,我发现纹理总是被裁剪到我的对象的大小,所以如果我将半径设置为 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.
顺便说一句,如果您添加更多代码或四处移动行,像上面那样增加偏移量可能会导致难以跟踪错误。最好在循环结束时单独递增。
至于旋转圆:通常你只需旋转顶点位置,即重新计算它们。纹理坐标没有变化。或者,您可以保留顶点位置并旋转纹理坐标,但如果同时使用缩放、重新定位等,这会使事情变得更加复杂。