错误修复。 OpenGL,GLSL精灵网格渲染问题

时间:2018-03-23 21:26:06

标签: c++ c opengl graphics glsl

这是一个非常具体的案例,我的想法已经不多了。

我试图渲染一个精灵网格而不使用位置作为每个精灵的实例数据。这可以使用gl_InstanceID变量来完成。

世界由大块组成(16 * 16 * 2(因为每个位置有两个精灵/实例),所以。所有的块都是自己绘制的,但并非所有块都在相对于另一个的正确位置。

这就是它的样子:

enter image description here

我使用宽度和高度来指定新行的开始时间。在将相机放置在正确位置(没问题)时,您可以看到左下角

enter image description here

稍微放下相机时,会画出:

enter image description here

现在是右下角。

enter image description here

注意width = 3(由printf语句返回),它清楚地表明,不应该是4列(但有)。

简而言之,这就是问题所在。

我几乎可以确定问题在于GLSL代码(着色器),因为我检查了我发送到图形卡的所有值及其偏移量。我觉得问题在于glsl计算块的位置。

#version 330 core
layout (location = 0) in vec2 v_pos;
layout (location = 1) in vec2 v_uv;
layout (location = 2) in float uv_index;

layout (std140) uniform Matrices
{
    mat4 view;
    mat4 projection;
};
uniform uint diagonalSpriteCount; //used for the uv indexing (of no interest here)
uniform uint chunksOnScreenRow; //what you saw as width on the pictures
uniform vec2 camOffsetToFirst; //this specifies the position to the first instance to be rendered

out vec2 uvCoordinates;

void main()
{
//////////////////////////////////////////
//THIS IS PROBABLY THE ONLY RELEVANT PART FOR YOU
    //i devide the index by two, as only every second instance the position changes
    int posIndex = gl_InstanceID / 2; 
    //every 256 Positions (16 * 16) a chunk is complete, thus the next chunk begins
    int chunkIndex = posIndex / 256;
    //the position of the vertex, first basic quad information and an offset
    gl_Position = projection * view * 
    vec4(v_pos.xy + camOffsetToFirst + 
        vec2(
            //this specifies the x within the chunk
            mod(posIndex, 16)    
                //this is the offset on the x axis, 
                //which depends on which chunk (the chunk the instance belongs to) is currently being rendered 
                //chunksOnScreenRow = width that you saw on the pictures
                + 16 * mod(chunkIndex, chunksOnScreenRow), 
            //this is the position on the y axis, relative to the first element of the current chunk
            floor(mod(posIndex, 256) / 16)   
                //same like with the x axis, offset on y depending on current chunk
                + 16 * floor(float(chunkIndex) / chunksOnScreenRow)
        ), 
    0.0, 1.0); //this is just the rest of the vec 4
//////////////////////////////////////////
    //irrelevant for you
    uvCoordinates = v_uv / diagonalSpriteCount + vec2(
        uv_index / diagonalSpriteCount - floor(uv_index / diagonalSpriteCount),
        floor(uv_index / diagonalSpriteCount) / diagonalSpriteCount
    );
}

这里是数据结构的方式以备不时之需。
enter image description here

如果您碰巧知道可能导致这种奇怪行为的原因,我现在会请求您的帮助。如果你能帮助我找到这种行为的原因,我将永远感激。

编辑:您在图片中看到的每个块都是一个块。您无法查看单个实例

编辑:显然如果我在第二个vec2()参数中移除了chunkIndex周围的float(),那么偏移量仍然很大,但是一个上升了 enter image description here

1 个答案:

答案 0 :(得分:0)

好的,我想通了。如果出现Off by One错误(如Enfyve称之为),则不要相信内置的glsl mod()函数,因为它会在路上将变量转换为平面并在路上混乱。