0

这个问题中,我询问了如何创建“镜像”纹理,现在我想将这个“镜像”图像在 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);
}
4

2 回答 2

3

您在代码片段中实际更改的是顶点的 Y 位置......这肯定不是您想要做的。
a_position 是您的模型空间位置;以四边形为中心的坐标系(我假设您正在使用四边形来显示纹理)。

相反,如果您在屏幕空间中进行修改,您将能够上下移动图像等......所以更改 gl_Position 值:

((u_projectionMatrix * u_modelViewMatrix) * pos + Vec4(0,HEIGHT,0,0))

请注意,您将在屏幕空间中;所以检查你的视口的尺寸。

最后,一个更好的实现你想要的效果的方法是使用一个旋转矩阵来翻转和倾斜图像。
然后,您可以将此矩阵与图像的旋转相结合(将其与模型视图矩阵相结合)。

您可以选择将模型矩阵乘以 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;
于 2012-03-06T07:58:15.770 回答
1

无论原始纹理大小和纵横比如何,传递的坐标texture2D始终在两个轴的 [0, 1) 范围内对源进行采样。所以一个下意识的答案是纹理的高度总是 1.0。

如果您想知道包含纹理的源图像的高度(以像素为单位),那么您需要自己提供 - 可能作为制服 - 因为它不会以其他方式暴露。

于 2012-03-06T07:54:53.357 回答