我将png转换为java侧的纹理,并在2D表面的屏幕上的自定义位置上绘制它们。在我的情况下是屏幕左上角的点0,0。右下角例如是1024x768。现在我希望实现具有滚动效果的ImageView。这意味着在滚动期间将仅部分可见的一些纹理。例如,顶部纹理(顶部项目)将错过顶部部分,底部纹理(底部项目)将错过底部部分。
我使用标准顶点和片段着色器:
precision mediump float;
varying vec2 v_texCoord;
uniform sampler2D s_texture;
void main()
{
gl_FragColor = texture2D( s_texture, v_texCoord );
}
//------------
uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
attribute vec2 a_texCoord;
varying vec2 v_texCoord;
void main()
{
gl_Position = uMVPMatrix * vPosition;
v_texCoord = a_texCoord;
}
假设我的ImageView略微滚动,我只看到顶级项目纹理高度的70%?前30%应该是隐形的。如何修改顶点或片段着色器?
我使用opengl ES 2.0
谢谢
答案 0 :(得分:1)
实现此目的的两种方法:
(1)有一个代表整个纹理的超大矩形,并更改从顶点着色器发出的gl_Position
以提供滚动。想一想在3D空间中上下移动矩形,你就会明白这一点。
剪辑空间中-1和+1坐标之间的区域(顶点着色器的输出)是可见的。例如。如果你想让纹理的中间50%可见并填满整个屏幕(切掉顶部和底部的25%),那么你会发出纹理四边形,坐标为+2到-2。可见剪辑空间(+1 - > +2和-2 - > -1)之外的部分将被剪掉。
(2)在屏幕上保持矩形大小相同,并更改顶点着色器发出的纹理坐标v_texCoord
。在这种情况下,您希望减少值以提供放置。 0.0到1.0之间的坐标表示整个纹理,因此如果您想要使用(0.3到1.0)或(0.0到0.7)前30%的截止值,这取决于您对“top”的定义。