我正在尝试用opengl制作一条蛇,但是似乎有些顶点掉了,我该怎么办?

问题描述 投票:-2回答:1

我一直在尝试使用Opengl在c ++中制作Snake,主要组件都能正常工作,并且一切都很好,但是当Snake的尾巴变大时,它就会出现故障。

程序的确切行为:

Program's behaviour

[基本上,我已经“制造”了这个但没有批量渲染,这个问题根本没有出现,现在我只是对正在发生的事情感到困惑

编辑:毛刺仅在尾巴的大小为偶数时才出现

  • 使用Visual Studio Community 2019在Debug x32中编译的代码,
  • 处理器:AMD Ryzen 5 3400G和Radeon Vega Graphics 3.70 GHz
  • Ram:6Go

代码:

App.cpp(最有可能出现此问题的地方)

#include <glm/glm.h>
#include <glad/glad.h>
#include <glfw/glfw3.h>

int main(){
// Snake Head

// n_Height is 770 and n_Width is 1090
    glm::mat4 proj = glm::ortho(0.0f, float(n_Height), 0.0f, float(n_Height), -1.0f, 1.0f);



Snake::snakeTail = {
        n_Width / 2 - 5, n_Height / 2 - 5, 0.0f,
        n_Width / 2 - 5, n_Height / 2 + 5, 0.0f,
        n_Width / 2 + 5, n_Height / 2 + 5, 0.0f,
        n_Width / 2 + 5, n_Height / 2 - 5, 0.0f
};

/*
  Each snake tail parts is 12 vertices 
*/

// Snake tail 

for (int i = 1; i < Snake::tailSize+1; i++) {
        Snake::snakeTail.push_back(Snake::snakeTail[0] - i * 10);
        Snake::snakeTail.push_back(Snake::snakeTail[1]);
        Snake::snakeTail.push_back(0.0f);

        Snake::snakeTail.push_back(Snake::snakeTail[3] - i * 10);
        Snake::snakeTail.push_back(Snake::snakeTail[4]);
        Snake::snakeTail.push_back(0.0f);

        Snake::snakeTail.push_back(Snake::snakeTail[6] - i * 10);
        Snake::snakeTail.push_back(Snake::snakeTail[7]);
        Snake::snakeTail.push_back(0.0f);

        Snake::snakeTail.push_back(Snake::snakeTail[9]  - i * 10);
        Snake::snakeTail.push_back(Snake::snakeTail[10]);
        Snake::snakeTail.push_back(0.0f);
}

for (int i = 0; i < n_Height/10*n_Width/10; i++) {
        Snake::indices.push_back(i * 4);

        Snake::indices.push_back(i * 4 + 1);

        Snake::indices.push_back(i * 4 + 2);

        Snake::indices.push_back(i * 4 + 2);

        Snake::indices.push_back(i * 4 + 3);

        Snake::indices.push_back(i * 4);
}
}

//Creates vertex array, index buffer, shader program, vertex buffer and renders
// sets uniform mat4 with proj matrix

Snake.cpp(与苹果碰撞和蛇移动时会发生什么:

 // When snake hits apple 
            tailSize++;
            Snake::snakeTail.push_back(Snake::snakeTail[0] - tailSize * 10);
            Snake::snakeTail.push_back(Snake::snakeTail[1]);
            Snake::snakeTail.push_back(0.0f);

            Snake::snakeTail.push_back(Snake::snakeTail[3] - tailSize * 10);
            Snake::snakeTail.push_back(Snake::snakeTail[4]);
            Snake::snakeTail.push_back(0.0f);

            Snake::snakeTail.push_back(Snake::snakeTail[6] - tailSize * 10);
            Snake::snakeTail.push_back(Snake::snakeTail[7]);
            Snake::snakeTail.push_back(0.0f);

            Snake::snakeTail.push_back(Snake::snakeTail[9] - tailSize * 10);
            Snake::snakeTail.push_back(Snake::snakeTail[10]);
            Snake::snakeTail.push_back(0.0f);

// On render

for (int i = tailSize; i > 0; i--) {
            snakeTail[i * 12] = snakeTail[(i - 1) * 12];
            snakeTail[i * 12 + 1] = snakeTail[(i - 1) * 12 + 1];
            snakeTail[i * 12 + 3] = snakeTail[(i - 1) * 12 + 3];
            snakeTail[i * 12 + 4] = snakeTail[(i - 1) * 12 + 4];
            snakeTail[i * 12 + 6] = snakeTail[(i - 1) * 12 + 6];
            snakeTail[i * 12 + 7] = snakeTail[(i - 1) * 12 + 7];
            snakeTail[i * 12 + 9] = snakeTail[(i - 1) * 12 + 9];
            snakeTail[i * 12 + 10] = snakeTail[(i - 1) * 12 + 10];
}
 // Movement 
        snakeTail[0] += addX;
        snakeTail[1] += addY;
        snakeTail[3] += addX;
        snakeTail[4] += addY;
        snakeTail[6] += addX;
        snakeTail[7] += addY;
        snakeTail[9] += addX;
        snakeTail[10] += addY;
// Sets buffer data to the new array
glBufferData(&Snake::snakeTail[0], snakeTail.size());
}
c++ opengl glfw glm-math
1个回答
0
投票

所以,基本上,答案是我做了一个错误,花了我几个小时才发现,这是一个简单的错误,但是它却使opengl都表现出错误,

我使用这个来设置缓冲区:

    glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);

虽然我必须这样做:

    glBufferDara(GL_ARRAY_BUFFER, size*sizeof(float), data, GL_STATIC_DRAW);

所以这个问题没有用,对不起,打扰了一切:3

© www.soinside.com 2019 - 2024. All rights reserved.