Opengl es 第二次纹理访问后的偏移错误

Opengl es 第二次纹理访问后的偏移错误,opengl-es,Opengl Es,我希望片段着色器遍历序列化的四叉树。 当找到内部节点时,rg值被解释为同一纹理的索引。 蓝色值0表示内部节点 在第一步中,使用提供的uv坐标从0x0位置的2x2子图像读取指针。 然后,该指针用于访问同一纹理的另一个2x2部分。 但是,对于根节点的每个子节点,偏移误差都会增加,从而导致错误的颜色 这是我的着色器(对于调试porpuses,循环在一次迭代中固定,因此只能访问四叉树的两个级别) 同样为了调试,我在左上方的子对象的位置放置了一个红色的2x2图像,右上方的子对象为绿色,左下方的子对象为蓝色

我希望片段着色器遍历序列化的四叉树。 当找到内部节点时,rg值被解释为同一纹理的索引。 蓝色值0表示内部节点

在第一步中,使用提供的uv坐标从0x0位置的2x2子图像读取指针。 然后,该指针用于访问同一纹理的另一个2x2部分。 但是,对于根节点的每个子节点,偏移误差都会增加,从而导致错误的颜色

这是我的着色器(对于调试porpuses,循环在一次迭代中固定,因此只能访问四叉树的两个级别)

同样为了调试,我在左上方的子对象的位置放置了一个红色的2x2图像,右上方的子对象为绿色,左下方的子对象为蓝色,右下方的子对象为黄色

生成的图像如下所示:

我完全不懂。你们中有人能想出发生这种情况的原因吗? 我检查了所有的坐标转换和计算三次,它们都是正确的

以下是着色器:

// virtual_image.fs
precision highp float;

uniform sampler2D t_atlas;
uniform sampler2D t_tree;

uniform vec2 gridpoolSize;
uniform vec2 atlasTileSize;
uniform vec2 atlasSize;

varying vec2 v_texcoord;

const float LEAF_MARKER = 1.0;
const float NODE_MARKER = 0.0;

const float CHANNEL_PERECISION = 255.0;

vec2 decode(const vec2 vec){
    return vec * CHANNEL_PERECISION;
}

void main ()
{
    vec4 oc = vec4(1); // output color
    vec4 tColor = texture2D(t_tree, v_texcoord); // only for debuging
    vec4 aColor = texture2D(t_atlas, v_texcoord); // only for debuging
    // oc = mix(tColor, aColor, 0.5);

    highp vec2 localCoord = v_texcoord;

    // by convention the root node starts at [0,0]
    // so we read the first pointer relative to that point
    // we use the  invertedGridpoolSize to convert the local coords in local coords of the first grid at [0,0]
    highp vec3 pointer = texture2D(t_tree, localCoord / gridpoolSize).rgb;// pointer is correct at this point!

    for(int i = 0 ; i < 1; i++) {

        // divides the local coords into 4 quadrants
        localCoord = fract(localCoord * 2.0); // localCoord is correct!


        // branch
        if(pointer.b <= NODE_MARKER + 0.1){
            highp vec2 index = decode(pointer.rg);// index is correct!
            highp vec2 absoluteCoord = (localCoord + index) / gridpoolSize;// absoluteCoord is correct!
            // we have a inner node get next pointer and continue
            pointer = texture2D(t_tree, absoluteCoord).rgb;
            oc.rgb = pointer.rgb; // this point in the code introduces a growing offset, I don't know where this comes from. BUG LOCATION
            //gl_FragColor = vec4(1,0,0,1);
        } else {
            if(pointer.b >= LEAF_MARKER - 0.1){
                // we have a leaf
                vec2 atlasCoord = ((decode(pointer.rg)  * atlasTileSize) / atlasSize) + (localCoord * (atlasTileSize / atlasSize));
                vec4 atlasColor = texture2D(t_atlas, atlasCoord);
                //vec4 atlasCoordColor = vec4(atlasCoord,0,1);
                //gl_FragColor = mix(atlasColor, vec4(localCoord, 0, 1), 1.0);
                //gl_FragColor = vec4(localCoord, 0, 1);
                oc = vec4(1,0,1,1);
            } else {
                // we have an empty cell
                oc = vec4(1,0,1,1);
            }
        }
    }
    //oc.rgb = pointer;
    //oc.rgb = oc.rgb * (255.0 / 20.0 );
    gl_FragColor = oc;
}
//virtual_image.fs
高精度浮点;
统一采样器2D t_图集;
均匀采样树;
统一的vec2网格池大小;
均匀的vec2图谱;
统一矢量2图谱;
可变矢量2 v_texcoord;
常量浮动叶标记=1.0;
常量浮点节点_标记=0.0;
常量浮点通道精度=255.0;
vec2解码(const vec2 vec){
返回vec*通道执行;
}
空干管()
{
vec4 oc=vec4(1);//输出颜色
vec4 tColor=texture2D(t_-tree,v_-texcoord);//仅用于调试
vec4 aColor=texture2D(t_atlas,v_texcoord);//仅用于调试
//oc=混合物(t颜色,aColor,0.5);
highp vec2 localCoord=v_texcoord;
//按照约定,根节点从[0,0]开始
//所以我们读取相对于该点的第一个指针
//我们使用InvertdGridPoolSize转换[0,0]处第一个网格的局部坐标中的局部坐标
highp vec3 pointer=texture2D(t_-tree,localCoord/gridpoolSize)。rgb;//指针此时是正确的!
对于(int i=0;i<1;i++){
//将局部坐标划分为4个象限
localCoord=fract(localCoord*2.0);//localCoord是正确的!
//分支机构

如果(pointer.b结果表明这是一个舍入问题

解码功能中的代码必须更改为:

vec2 decode(const vec2 vec){
    return floor(0.5 + (vec * CHANNEL_PERECISION))
}

返回的值应该是int的索引,但从5.99到6都有些小。

结果表明这是一个舍入问题

解码功能中的代码必须更改为:

vec2 decode(const vec2 vec){
    return floor(0.5 + (vec * CHANNEL_PERECISION))
}
返回的值应该是int的索引,但从5.99到6都很小