繁体   English   中英

将 sampler2D 转换为 samplerCube

[英]Convert sampler2D into samplerCube

在具有给定sampler2D的片段着色器中有没有sampler2D将其转换为samplerCube 我希望 Cube 在所有六个面都有sampler2D纹理。 无法更改应用程序以将samplerCube传递给着色器,但我的片段着色器中需要一个。

您可以编写自己的函数,使用矢量数学将 3D 立方体贴图方向坐标转换为 2D 纹理坐标...

这可能有帮助:

该函数应该这样做:

  1. 归一化输入方向

  2. 检测您的方向正在击中哪一侧

    通过将输入方向与指向每个立方体贴图面中心的方向进行点积。 最大将识别命中面

  3. 将方向投射到被击中的面上

    并使用面部的基向量进行点积,您将获得 2D 坐标。 当心每张脸都有它的旋转......

然后只需使用它来访问带有 3D 方向的 sampler2D 作为纹理坐标,如下所示:

uniform sampler2D txr;
...

vec2 mycubemap(vec3 dir)
 {
 vec2 tex;
 dir=normalize(dir);
 ...
 return tex;
 }

void main()
 {
 ...
 ???=texture2D(txr,mycubemap(???));
 ...
 }

当我把所有东西放在一起+一些优化时,我得到了这个:

vec2 mycubemap(vec3 t3)
    {
    vec2 t2;
    t3=normalize(t3)/sqrt(2.0);
    vec3 q3=abs(t3);
         if ((q3.x>=q3.y)&&(q3.x>=q3.z))
        {
        t2.x=0.5-t3.z/t3.x;
        t2.y=0.5-t3.y/q3.x;
        }
    else if ((q3.y>=q3.x)&&(q3.y>=q3.z))
        {
        t2.x=0.5+t3.x/q3.y;
        t2.y=0.5+t3.z/t3.y;
        }
    else{
        t2.x=0.5+t3.x/t3.z;
        t2.y=0.5-t3.y/q3.z;
        }
    return t2;
    }

将它与链接 QA 的布局渲染一起使用,我得到了这个输出:

预览

使用它作为纹理而不是立方体贴图:

质地

注意方形边界中的线条,因此可能需要一些额外的边缘情况处理,但懒得进一步分析......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM