我正在编写一个使用纹理四边形显示文本标签的着色器(没什么复杂的)。
标签有一个原点(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;
但是缩放信息(存在于变换中)丢失了。