1

我已经实现了一个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) 是否可以在不使用间接纹理的情况下使这段代码更快(即通过巧妙地使用三元运算符)?

4

0 回答 0