Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 在GLSL片段着色器中使用整数-遇到无法解释的瑕疵_Opengl_Glsl_Shader_Texture Mapping - Fatal编程技术网

Opengl 在GLSL片段着色器中使用整数-遇到无法解释的瑕疵

Opengl 在GLSL片段着色器中使用整数-遇到无法解释的瑕疵,opengl,glsl,shader,texture-mapping,Opengl,Glsl,Shader,Texture Mapping,我有一个六边形网格,我想纹理。我想使用一个纹理,16个不同的子纹理排列成4x4网格。网格中的每个“节点”都有一个图像类型,我想在它们之间平滑地混合。我实现这一点的方法是成对渲染三角形,并对两个面的所有顶点上的4种图像类型进行编码,以及一组4个权重因子(这是两个三角形的重心坐标)。然后,我可以使用这两种方法在任何图像类型组合之间平滑地混合 这是我正在使用的片段着色器。这些问题是由int类型的使用引起的,但我不明白为什么。如果我只使用前四个子纹理,那么我可以将idx更改为float,并将Y坐标硬编

我有一个六边形网格,我想纹理。我想使用一个纹理,16个不同的子纹理排列成4x4网格。网格中的每个“节点”都有一个图像类型,我想在它们之间平滑地混合。我实现这一点的方法是成对渲染三角形,并对两个面的所有顶点上的4种图像类型进行编码,以及一组4个权重因子(这是两个三角形的重心坐标)。然后,我可以使用这两种方法在任何图像类型组合之间平滑地混合

这是我正在使用的片段着色器。这些问题是由
int
类型的使用引起的,但我不明白为什么。如果我只使用前四个子纹理,那么我可以将
idx
更改为
float
,并将Y坐标硬编码为0,然后它就如我所期望的那样工作

vec2偏移量(int-idx){
vec2v=vec2(idx%4,idx/4);
返回v/4.0;
}
无效主(无效){
//
//将传入的UV划分为16个区域之一
//offset()函数应取0..15之间的整数
//并返回4x4地图中该区域的偏移量
//
vec2-uv=v_-uv/4.0;
//
//涉及的四个纹理区域
//该顶点用vec4 t_txt编码。相同
//值存储在所有顶点,因此这不会
//在三角形中变化
//
int ia=int(v_txt.x);
int ib=int(v_txt.y);
int ic=int(v_txt.z);
int id=int(v_txt.w);
//
//在offset函数中使用这些索引来获取
//在该点上进行纹理采样
//      
vec4 ca=纹理2D(txt,uv+偏移量(ia));
vec4 cb=纹理2D(txt,uv+偏移量(ib));
vec4 cc=纹理2d(txt,uv+偏移量(ic));
vec4 cd=纹理2d(txt,uv+偏移量(id));
//
//将它们与vec4 v_tfact中存储的四个因子合并。
//每个顶点的值都不同
//
fragcolour=ca*v_tfact.x
+cb*v_tfact.y
+cc*v_tfact.z
+cd*v_tfact.w;
}
下面是正在发生的事情:

(我的“一对三角形”实际上大约是20,你可以在人工制品中看到它们的结构,但效果是一样的)

这个人工制品的行为有点像z-fighting:移动场景会使所有场景闪烁并疯狂移动

为什么这不能像我期望的那样工作

我可以求助的一个解决方案是简单地使用一维纹理贴图,所有16个子图像在一条水平线上,然后我可以将所有内容切换到浮点,因为我不需要模/整数除法过程来映射
idx->x,y
,但这感觉很笨拙,我至少想了解这里发生了什么

下面是它的外观,尽管只使用了4个子图像:

请参见

当使用构造函数将浮点类型转换为整数类型时,将删除浮点值的小数部分

因此,
int(v_txt.x)
不舍入
v_txt.x
,而是截断
v_txt.x

在构造整数值之前,必须将值设置为最接近的整数:

intia=int(圆形(v_txt.x));
int ib=int(圆形(v_txt.y));
int ic=int(圆形(v_txt.z));
int id=int(圆形(v_txt.w));
或者,在构造整数值之前加上0.5:

intia=int(v_txt.x+0.5);
int ib=int(v_txt.y+0.5);
int ic=int(v_txt.z+0.5);
int id=int(v_txt.w+0.5);

ah我明白了,尽管我的
v_txt
id是整数(1.0、2.0、3.0等),因为我将它们表示为浮点数,它们在三个变量中被插值为
0.999、1.001、0.999、1.001等,所以仅仅丢弃是不够的。看来很明显,你已经指出了!谢谢:-)