我正在编写一个使用纹理四边形显示文本标签的着色器(没什么复杂的。)
标签有一个原点(vec3)和一个方向(vec3),我选择一个固定的 着色器中的正交方向(见下文)。每个字形由四个描述 使用偏移量(vec2)给出顶点和每个顶点位置 沿切线和正交方向前进
uniform vec3 origin;
uniform vec3 direction;
uniform float scale;
attribute vec2 position;
vec3 tangent = normalize(direction.xyz);
vec3 ortho = cross(tangent, vec3(0,0,-1));
vec4 P = vec4(origin + scale*(position.x * tangent + position.y * ortho),1.0);
这没有问题。
现在,我想介绍一个用户定义的转换函数 (例如极坐标投影,但在着色器中未知)。问题是 我想保持我的标签大小不变独立于变换和 相对于参考点。例如,这不起作用:
vec4 P = transform(origin + scale*(position.x * tangent + position.y * ortho));
因为定义字形的四个点可能具有“不同的”变换 变换不是正交的(如极坐标投影)。使用参考点R,我可以使用以下方法获得固定的方向和大小:
vec4 T = transform(R + scale*tangent*position.x) - transform(R);
vec4 O = transform(R + scale*ortho*position.y) - transform(R);
vec4 P = transform(origin) + T + O;
但我希望在保持大小不变的同时保持新的方向 相对于参考点。有什么想法吗?
最后解决方案是:
vec4 T = transform((origin+scale*tangent)) - transform(origin);
T = scale*normalize(T);
vec4 O = transform((origin+scale*ortho)) - transform(origin);
O = scale*normalize(O);
vec4 P = transform(origin) + position.x*T + position.y*O;
但丢失缩放信息(存在于转换中)。