我正在尝试在 OpenGL 中编写一个 matcap 着色器
#version 300 es
。我正在努力将法线方向转换为 UV 空间。
到目前为止,通过将网格法线方向与视图矩阵相乘,它正在工作 90%。生成的向量 X 和 Y 坐标用于 UV,而 Z 坐标提供了很好的菲涅耳效果。
问题是如果网格从视图中心点移开,坐标会失真。我原以为他们只是从视野的前方投射出来。似乎我必须以某种方式在转换过程中考虑空间中的网格位置,但我无法弄清楚需要做什么。
如何将网格法线方向转换到我的视图空间并更正网格平移?
顶点着色器:
v_Normal = mat3(transpose(inverse(MODEL_MATRIX))) * NORMAL;
片段着色器:
vec3 normalDirection = normalize(VIEW_MATRIX * vec4(v_Normal, 0.0)).rgb;
vec2 screenSpaceUV = normalDirection.xy * 0.5 + vec2(0.5,0.5);
vec4 matCap = texture(u_MatCap, vec2(screenSpaceUV.x, 1.0 - screenSpaceUV.y));