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.
你好
我正在 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.