![](/img/trans.png)
[英]Pass “uniform sampler2D” to glsl shader in libgdx(using modelBatch)
[英]Convert sampler2D into samplerCube
在具有给定sampler2D
的片段着色器中有没有sampler2D
将其转换为samplerCube
? 我希望 Cube 在所有六个面都有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;
}
将它与链接 QA 的布局渲染一起使用,我得到了这个输出:
使用它作为纹理而不是立方体贴图:
注意方形边界中的线条,因此可能需要一些额外的边缘情况处理,但懒得进一步分析......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.