将sampler2D转换为samplerCube

时间:2019-12-19 14:14:48

标签: opengl-es glsl shader

片段着色器中是否有一种方法可以将给定的sampler2D转换为samplerCube?我希望多维数据集的所有六个侧面都具有sampler2D纹理。无法更改应用程序以将samplerCube传递给着色器,但是我的片段着色器中需要一个。

1 个答案:

答案 0 :(得分:1)

您可以编写自己的函数,使用矢量数学将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;
    }

将其与链接的质量检查中的布局渲染结合使用,我得到以下输出:

preview

将其用作纹理而不是立方体贴图:

texture

请注意方形边界中的线,因此可能需要进行一些额外的边缘案例处理,但是懒得进一步分析...