GLSL着色器 - 如何计算纹理的高度?

时间:2012-03-06 07:03:36

标签: opengl-es glsl vertex-shader

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);
}

2 个答案:

答案 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。

如果你想知道包含纹理的源图像的高度(以像素为单位),那么你需要自己提供 - 可能是作为制服 - 因为它没有暴露。