在GLSL中选择cubmap face的快捷方法

use*_*164 5 opengl optimization shader glsl

我正在寻找优化以下glsl函数,该函数执行cubmap面选择.它需要一个3分量矢量并返回面部,面部的texcoords和最大的组件.

vec4 cubemap( vec3 P )
{
    vec4 Coord;
    vec3    s = abs(P.xyz);
    bvec3   b = greaterThan( P.xyz, vec3(0,0,0) );

    if ( all( greaterThanEqual( s.xx, s.yz ) ) )
    {
        if ( b.x )
            Coord = vec4( -P.z, -P.y, 0, s.x );
        else
            Coord = vec4(  P.z, -P.y, 1, s.x );
    } else 
    if ( all( greaterThanEqual( s.yy, s.xz ) ) )
    {
        if ( b.y )
            Coord = vec4(  P.x,  P.z, 2, s.y );
        else
            Coord = vec4(  P.x, -P.z, 3, s.y );
    } else 
    {
        if ( b.z )
            Coord = vec4(  P.x, -P.y, 4, s.z );
        else
            Coord = vec4( -P.x, -P.y, 5, s.z );
    }

    Coord.xy = ((Coord.xy / Coord.w) + 1.0) * 0.5;
    return Coord;
}
Run Code Online (Sandbox Code Playgroud)

vpo*_*man 0

您可以优化动态分支。我不确定这是否会提高性能,但在这种情况下你当然可以尝试一下。它有时会提高着色器代码的性能。

例如,对于第一个条件,您可以/尝试/类似:

int condition=(s.x>=s.y)*(s.x>=s.z)*(b.x);
Coord = condition*vec4( (1.-2.*condition)*P.z, -P.y, condition, s.x );
Run Code Online (Sandbox Code Playgroud)

等等...我想这会给你带来某种性能提升,即使只是微不足道的,因为据我所知,GPU 上的动态分支在高度发散时是昂贵的,并且通常只应用于有条件地消除较大的操作块。

这是我看到的最明显的事情。