片段着色器中是否有给定的sampler2D
将其转换为samplerCube
的方法?我希望多维数据集在所有六个面上都具有sampler2D
纹理。无法更改应用程序以将samplerCube
传递给着色器,但我的片段着色器中需要一个。
您可以编写自己的函数,使用矢量数学将3D立方体贴图方向坐标转换为2D纹理坐标...
这可能会帮助:
函数应该执行此操作:
检测您的方向被击中的一侧
通过将输入方向与指向每个立方体贴图面中心的方向进行点积运算。最大值将识别出击打面
将方向投射到击打的面上
并使用面部的基向量进行点积运算,您将获得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;
}
将其与链接的质量检查中的布局渲染一起使用,我得到了以下输出:
将其用作纹理而不是立方体贴图:
注意方形边界中的线,因此可能需要一些额外的边缘案例处理,但是懒得进一步分析...