片段着色器中是否有一种方法可以将给定的sampler2D
转换为samplerCube
?我希望多维数据集的所有六个侧面都具有sampler2D
纹理。无法更改应用程序以将samplerCube
传递给着色器,但是我的片段着色器中需要一个。
答案 0 :(得分:1)
您可以编写自己的函数,使用矢量数学将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;
}
将其与链接的质量检查中的布局渲染结合使用,我得到以下输出:
将其用作纹理而不是立方体贴图:
请注意方形边界中的线,因此可能需要进行一些额外的边缘案例处理,但是懒得进一步分析...