为什么这个正方形网格没有正确绘制?

问题描述 投票:0回答:1

为什么这个正方形网格没有正确绘制?

我有一个关于如何绘制网格的数组

// Here, 1 means a wall and 0 means an empty square
const int mapX = 8, mapY = 8, mapSize=mapX*mapY;
int map[] =
{
    1, 1, 1, 1, 1, 1, 1, 1,
    1, 0, 0, 0, 0, 0, 0, 1,
    1, 0, 0, 1, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 1, 1, 1,
    1, 0, 0, 0, 0, 1, 0, 1,
    1, 0, 1, 0, 0, 0, 0, 1,
    1, 0, 0, 0, 0, 0, 0, 1,
    1, 1, 1, 1, 1, 1, 1, 1,
};

然后,我填充一个顶点和索引数组

typedef struct
{
    Vertex vertices[4];
} Tile;

for(int y = 0; y < mapY; y++)
{
    for(int x = 0; x < mapX; x++)
    {
        int x0 = x * mapSize;
        int y0 = y * mapSize;

        Tile tile = {
            (Vertex){{x0+1, y0+1, 0.0f}, {0.0f, 0.0f, 0.0f, 1.0f}},
            (Vertex){{x0+1, y0 + mapSize-1, 0.0f}, {0.0f, 0.0f, 0.0f, 1.0f}},
            (Vertex){{x0 + mapSize-1, y0 + mapSize-1, 0.0f}, {0.0f, 0.0f, 0.0f, 1.0f}},
            (Vertex){{x0 + mapSize-1, y0+1, 0.0f}, {0.0f, 0.0f, 0.0f, 1.0f}},
        };

        mapVertices[y*mapX + x] = tile;
    }
}

for(size_t i = 0; i < mapSize*6; i += 6)
{
    static int offset = 0;

    mapIndices[i + 0] = 0 + offset;
    mapIndices[i + 1] = 1 + offset;
    mapIndices[i + 2] = 2 + offset;

    mapIndices[i + 3] = 2 + offset;
    mapIndices[i + 4] = 3 + offset;
    mapIndices[i + 5] = 0 + offset;

    offset += 4;
}

最后在主循环中绘制

// Changing color for wall
for(int y = 0; y < mapY; y++)
{
    for(int x = 0; x < mapX; x++)
    {
        if(map[y*mapX + x] == 1)
        {
            memcpy(mapVertices[y*mapX + x].vertices[0].color, (vec4){1.0f, 1.0f, 1.0f, 1.0f}, sizeof(vec4));
            memcpy(mapVertices[y*mapX + x].vertices[1].color, (vec4){1.0f, 1.0f, 1.0f, 1.0f}, sizeof(vec4));
            memcpy(mapVertices[y*mapX + x].vertices[2].color, (vec4){1.0f, 1.0f, 1.0f, 1.0f}, sizeof(vec4));
            memcpy(mapVertices[y*mapX + x].vertices[3].color, (vec4){1.0f, 1.0f, 1.0f, 1.0f}, sizeof(vec4));
        }
    }
}

mat4 mapTransform;
glm_mat4_identity(mapTransform);
glm_translate(mapTransform, (vec3){0.0f, 0.0f, 0.0f});

mat4 mvp;
glm_mat4_mulN((mat4* []){&projectionMatrix, &viewMatrix, &mapTransform}, 3, mvp);

glUniformMatrix4fv(glGetUniformLocation(mapShaderProgram, "mvp"), 1, GL_FALSE, (float*)mvp);

bindVAO(&mapVertexAttributes);
bindVBO(&mapVertexAttributes);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(mapVertices), mapVertices);
glDrawElements(GL_TRIANGLES, sizeof(mapIndices)/sizeof(mapIndices[0]), GL_UNSIGNED_INT, 0);

0,0 在屏幕左下方。

网格绘制不正确。正方形不在数组中指定的正确位置。 如果您并排查看图像和阵列,您会注意到它

为什么会这样? 我该如何解决这个问题?

c opengl glm-math
1个回答
2
投票

如果你仔细观察你的输出,你会发现屏幕上的方块与数组的内容匹配,但有反线。

这是因为屏幕上的坐标以左下角的

(0,0)
开头,而在您的数组中
(0.0)
在左上角的元素中。

您需要在遍历数组时转换 y 坐标:

只需更改您条件下的单元格计算:

for(int y = 0; y < mapY; y++)
{
    for(int x = 0; x < mapX; x++)
    {
        if(map[y*mapX + x] == 1)
        {
            memcpy(mapVertices[y*mapX + x].vertices[0].color, (vec4){1.0f, 1.0f, 1.0f, 1.0f}, sizeof(vec4));
            memcpy(mapVertices[y*mapX + x].vertices[1].color, (vec4){1.0f, 1.0f, 1.0f, 1.0f}, sizeof(vec4));
            memcpy(mapVertices[y*mapX + x].vertices[2].color, (vec4){1.0f, 1.0f, 1.0f, 1.0f}, sizeof(vec4));
            memcpy(mapVertices[y*mapX + x].vertices[3].color, (vec4){1.0f, 1.0f, 1.0f, 1.0f}, sizeof(vec4));
        }
    }
}

        if(map[(mapY-y-1)*mapX + x] == 1) 
© www.soinside.com 2019 - 2024. All rights reserved.