gpt4 book ai didi

optimization - 在GLSL中选择cubmap面的快速方法

转载 作者:行者123 更新时间:2023-12-03 16:03:08 24 4
gpt4 key购买 nike

我希望优化以下执行 cubmap 面部选择的 glsl 函数。它需要一个 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;
}

最佳答案

这种方式可能仍然很慢,但它不会做任何分支:

vec2 directionToUV(vec3 v) {
vec3 abs = abs(v);
float max = max(max(abs.x, abs.y), abs.z); // Get the largest component
vec3 weights = step(max, abs); // 1.0 for the largest component, 0.0 for the others
float sign = dot(weights, sign(v)) * 0.5 + 0.5; // 0 or 1

// Find the uv coordinate
float sc = dot(weights, mix(vec3(v.z, v.x, -v.x), vec3(-v.z, v.x, v.x), sign));
float tc = dot(weights, mix(vec3(-v.y, -v.z, -v.y), vec3(-v.y, v.z, -v.y), sign));
vec2 uv = (vec2(sc, tc) / max) * 0.5 + 0.5;

// Offset into the right region of the texture
float offsetX = dot(weights, vec3(0.0, 1.0, 2.0));
float offsetY = sign;
uv.x = (uv.x + offsetX) / 3.0;
uv.y = (uv.y + offsetY) / 2.0;
return uv;
}

立方体贴图的排列方式如下
        +----+----+----+
| x | y | z |
+----+----+----+
| -x | -y | -z |
+----+----+----+

关于optimization - 在GLSL中选择cubmap面的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7246929/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com