将sampler2D转换为samplerCube

问题描述 投票:0回答:1

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

opengl-es glsl shader
1个回答
1
投票

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

这可能会帮助:

函数应该执行此操作:

  1. 标准化输入方向
  2. 检测您的方向被击中的一侧

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

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

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

  4. 然后将其用于访问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

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

© www.soinside.com 2019 - 2024. All rights reserved.