我正在尝试用 opengl 制作一条蛇,但有些顶点似乎消失了,我该怎么办?
I'm trying to make a snake with opengl but some vertices seem to go off, what can I do?
我一直在尝试用 C++ 和 Opengl 制作一条 Snake,主要组件可以正常工作,而且一切都很好,但是不知何故,当 Snake 的尾巴变大时,它会出现故障。
程序的确切行为:
基本上,我已经"made"这个但没有批量渲染,这个问题根本没有出现,现在我只是对发生的事情感到困惑
编辑:只有当尾巴的大小为偶数时才会出现故障
- 在 Debug x32 中使用 Visual Studio Community 2019 编译的代码,
- 处理器:AMD Ryzen 5 3400G,配备 Radeon Vega Graphics 3.70 GHz
- 内存: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());
}
嗨,基本上答案是我犯了一个错误,花了我几个小时才找到,这是一个如此简单的错误,但却让 opengl 的所有行为都出错了,
我正在使用这个设置缓冲区:
glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
虽然我不得不这样做 :
glBufferDara(GL_ARRAY_BUFFER, size*sizeof(float), data, GL_STATIC_DRAW);
所以那个问题没用,很抱歉打扰了一切:3
我一直在尝试用 C++ 和 Opengl 制作一条 Snake,主要组件可以正常工作,而且一切都很好,但是不知何故,当 Snake 的尾巴变大时,它会出现故障。
程序的确切行为:
基本上,我已经"made"这个但没有批量渲染,这个问题根本没有出现,现在我只是对发生的事情感到困惑
编辑:只有当尾巴的大小为偶数时才会出现故障
- 在 Debug x32 中使用 Visual Studio Community 2019 编译的代码,
- 处理器:AMD Ryzen 5 3400G,配备 Radeon Vega Graphics 3.70 GHz
- 内存: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());
}
嗨,基本上答案是我犯了一个错误,花了我几个小时才找到,这是一个如此简单的错误,但却让 opengl 的所有行为都出错了,
我正在使用这个设置缓冲区:
glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
虽然我不得不这样做 :
glBufferDara(GL_ARRAY_BUFFER, size*sizeof(float), data, GL_STATIC_DRAW);
所以那个问题没用,很抱歉打扰了一切:3