我已使用此代码实现了VSDCT demo,以便将多维数据集地图中的vec3
灯光方向转换为OpenGL 4.4 Core Profile Specification的8.13多维数据集地图纹理选择中的vec2
灯光方向1}}虚拟纹理中的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)是否可以在不使用间接纹理的情况下更快地制作此代码(即,通过巧妙地使用三元运算符)?