在this问题中,我问如何创建“镜像”纹理,现在我想将这个“镜像”图像向下移动到y轴上,关于图像的高度。 我用不同的HEIGHT值尝试了类似的东西,但我找不到合适的解决方案:
// Vertex Shader
uniform highp mat4 u_modelViewMatrix;
uniform highp mat4 u_projectionMatrix;
attribute highp vec4 a_position;
attribute lowp vec4 a_color;
attribute highp vec2 a_texcoord;
varying lowp vec4 v_color;
varying highp vec2 v_texCoord;
void main()
{
highp vec4 pos = a_position;
pos.y = pos.y - HEIGHT;
gl_Position = (u_projectionMatrix * u_modelViewMatrix) * pos;
v_color = a_color;
v_texCoord = vec2(a_texcoord.x, 1.0 - a_texcoord.y);
}
答案 0 :(得分:3)
您在代码段中实际更改的是您的顶点的Y位置...这绝对不是您想要做的。
a_position是你的模型空间位置;以四边形为中心的坐标系(我假设您使用四边形来显示纹理)。
如果您在屏幕空间中进行修改,则可以上下移动图像等...所以更改gl_Position值:
((u_projectionMatrix * u_modelViewMatrix) * pos + Vec4(0,HEIGHT,0,0))
请注意,您将进入屏幕空间;所以检查视口的尺寸。
最后,实现您想要做的效果的更好方法是使用旋转矩阵来翻转和倾斜图像。
然后,您可以将此矩阵与图像的旋转相结合(将其与modelviewmatrix结合使用)。
您可以选择将模型矩阵乘以CPU上的视图投影:
original_mdl_mat = ...;
rotated_mdl_mat = Matrix.CreateTranslation(0, -image.Height, 0) * Matrix.CreateRotationY(180) * original_mdl_mat;
mvm_original_mat = Projection * View * original_mdl_mat;
mvm_rotated_mat = Projection * View * rotated_mdl_mat;
或在GPU上:
uniform highp mat4 u_model;
uniform highp mat4 u_viewMatrix;
uniform highp mat4 u_projectionMatrix;
gl_Position = (u_projectionMatrix * u_model * u_viewMatrix) * pos;
答案 1 :(得分:1)
传递给texture2D
的坐标始终对两个轴上的[0,1]范围内的源进行采样,无论原始纹理大小和纵横比如何。因此,一个膝盖回答是纹理的高度总是1.0。
如果你想知道包含纹理的源图像的高度(以像素为单位),那么你需要自己提供 - 可能是作为制服 - 因为它没有暴露。