OpengGL ES 创建的形状比屏幕大

Shape created by OpengGL ES is larger than screen

你好
我正在 android 上使用 OpenGL ES 2.0。我创建了一个形状,但它比屏幕大。在 OpenGL ES 版本 2 中,如何设置缩放大小以便我的所有形状都可以显示在屏幕中?

形状在任何情况下都不能比屏幕大。在您的案例中,屏幕是一种物理设备,旨在为您呈现视觉内容。另一方面,在您的案例中,形状是一组指令,可用于在屏幕上直观地呈现某些内容。

所以该陈述的有趣部分实际上是如何在视觉上呈现该形状。您未能提供任何关于您如何 "created" 您的形状或它是什么的信息,但在大多数情况下,我们谈论的是定义为 3D 矢量(在其他数据旁边)的点,从中创建表面并在屏幕上绘制。如果你的形状不适合你的屏幕,那么你应该检查你是如何在屏幕上呈现这些数据的,并可能缩放你的形状。

在 openGL 中,所有内容都已标准化,因此您的屏幕坐标在 [-1.0, 1.0] 范围内,这意味着屏幕左侧的值为 -1.0,右侧为 1.0,底部为 -1.0 和顶部 1.0。您可能不会更改它,但您需要 scale/transform 所有点和顶点以满足您的需要。为此,我们通常在 ES2 中使用顶点着色器中的矩阵,该着色器旨在在您的 GPU 上执行此类操作。

要使用矩阵,我相信您可以搜索一下,以便在您的顶点着色器中插入一个制服并将其与您的代码连接。然后你应该看看使用什么工具来操作矩阵。您很可能会找到一种工具,它可以让您以正交或平截头投影的形式呈现对象。此外,在某些情况下,它可能会帮助您通过在矩阵上使用翻译方法将对象移开一点。

要使用矩阵解决您的问题(形状被绘制出屏幕),您有多种方法:

  • 使用ortho矩阵并设置足够大的边界参数,例如left = -100.0, right = 100.0...应该使形状看起来小100倍
  • 使用scale矩阵缩小形状
  • 使用具有一定视野的 frustum 矩阵,并通过将其与 translation 矩阵组合来移动您的形状

这真的取决于使用哪种场景,但选择最有意义的(在你的情况下,你再次未能提供任何信息)。

这项工作(适应 OpenGL ES 屏幕的边缘)是着色器的职责。您手动编写着色器文本和顶点代码。 你应该有这样的东西:

public static final String vs_Text =
    "uniform mat4 uMVPMatrix;" +
    "attribute vec4 vPosition;" +
    "attribute vec4 a_Color;" +
    "attribute vec2 a_texCoord;" +
    "varying vec4 v_Color;" + 
    "varying vec2 v_texCoord;" +
    "void main() {" +
    "  gl_Position = uMVPMatrix * vPosition;" +
    "  v_texCoord = a_texCoord;" +
    "  v_Color = a_Color;" + 
    "}";
public static final String fs_Text =
    "precision mediump float;" +
    "varying vec4 v_Color;" +
    "varying vec2 v_texCoord;" +
       "uniform sampler2D s_texture;" +
    "void main() {" +
    "  gl_FragColor = texture2D( s_texture, v_texCoord ) * v_Color;" +
    "  gl_FragColor.rgb *= v_Color.a;" +
    "}";  

请注意这是通用代码,您可能会更改某些部分。 更多详情请click here.