这是一个非常具体的案例,我的想法已经不多了。
我试图渲染一个精灵网格而不使用位置作为每个精灵的实例数据。这可以使用gl_InstanceID变量来完成。
世界由大块组成(16 * 16 * 2(因为每个位置有两个精灵/实例),所以。所有的块都是自己绘制的,但并非所有块都在相对于另一个的正确位置。
这就是它的样子:
我使用宽度和高度来指定新行的开始时间。在将相机放置在正确位置(没问题)时,您可以看到左下角
稍微放下相机时,会画出:
现在是右下角。
注意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
);
}
如果您碰巧知道可能导致这种奇怪行为的原因,我现在会请求您的帮助。如果你能帮助我找到这种行为的原因,我将永远感激。
编辑:您在图片中看到的每个块都是一个块。您无法查看单个实例
编辑:显然如果我在第二个vec2()参数中移除了chunkIndex周围的float(),那么偏移量仍然很大,但是一个上升了
答案 0 :(得分:0)
好的,我想通了。如果出现Off by One错误(如Enfyve称之为),则不要相信内置的glsl mod()函数,因为它会在路上将变量转换为平面并在路上混乱。