我已经实现了一个VSDCT 演示,使用此代码将vec3
立方体贴图中的光方向(如 OpenGL 4.4 Core Profile Specification 的 8.13 Cube Map Texture Selection of OpenGL 4.4 Core Profile Specification中所述)转换vec2
为虚拟纹理中的 UV 纹理坐标:
vec2 GetShadowTC( vec3 Dir )
{
float Sc;
float Tc;
float Ma;
int FaceIndex;
float rx = Dir.x;
float ry = Dir.y;
float rz = Dir.z;
vec3 adir = abs(Dir);
Ma = max( max( adir.x, adir.y ), adir.z );
// -X +X ok
if ( adir.x > adir.y && adir.x > adir.z )
{
Sc = ( rx > 0 ) ? rz : -rz;
Tc = ry;
FaceIndex = ( rx > 0 ) ? 0 : 1;
}
// -Y +Y ok
else if ( adir.y > adir.x && adir.y > adir.z )
{
Sc = rx;
Tc = ( ry > 0 ) ? rz : -rz;
FaceIndex = ( ry > 0 ) ? 2 : 3;
}
// -Z +Z ok
else
{
Sc = ( rz > 0 ) ? -rx : rx;
Tc = ry;
FaceIndex = ( rz > 0 ) ? 4 : 5;
}
float s = 0.5 * ( Sc / Ma + 1.0 );
float t = 0.5 * ( Tc / Ma + 1.0 );
/*
Calculate texture coordinates for faces in our 3x2 layout:
0 1 2
3 4 5
*/
s = s / 3.0;
t = t / 2.0;
s += float(FaceIndex % 3 ) / 3.0;
t += float(FaceIndex / 3 ) / 2.0;
return vec2( s, t );
}
这段代码工作正常。但是,我有两个问题:
1) 有没有办法减少立方体贴图面之间的过滤伪影(布置在 3x2 虚拟纹理上)?
2) 是否可以在不使用间接纹理的情况下使这段代码更快(即通过巧妙地使用三元运算符)?