我目前正在尝试制作一个非常简单的蛇游戏并且在制作蛇形广场时遇到一些问题。现在我通过创建2个三角形来创建正方形。我已经创建了蛇应该像这样移动的网格:
方块的颜色在开始时实际上是黄色的。然后我尝试用红色制作蛇。但我的所有方块都变红了。
我像这样创造蛇:
void drawSnake()
{
mat4 modelView;
modelView = Translate(1,0,0);
glUniformMatrix4fv(modelViewUniform, 1, GL_TRUE, modelView);
GLuint indices2[3] = {0,1,2}; //, 0, 5, 1, 0};
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices2);
modelView = Translate(1, 0, 0);
glUniformMatrix4fv(modelViewUniform, 1, GL_TRUE, modelView);
GLuint indices6[3] = {4,3,2}; //, 0, 5, 1, 0};
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices6);
//vec2 blockCoordinate = vec2(-t + 1, t - 1);
//blockCol[i] = blockCoordinate;
}
此处定义的颜色:
void loadGeometry() {
vec3 color(1.0f, 1.0f, 0.0f);
Vertex rectangleData[rectangleSize] = {
{ vec2( -1.0, -1.0 ), color },
{ vec2( 1.0, -1.0 ), color },
{ vec2( 1.0, 1.0 ), color },
{ vec2( -1.0, 1.0 ), color },
{ vec2(-1.0, -1.0 ), color }
};
shapeVertexArrayBuffer = loadBufferData(rectangleData, rectangleSize);
vec3 color1(1.0f, 0.0f, 0.0f);
Vertex rectangleData1[rectangleSize] = {
{ vec2( -1.0, -1.0 ), color1 },
{ vec2( 1.0, -1.0 ), color1 },
{ vec2( 1.0, 1.0 ), color1 },
{ vec2( -1.0, 1.0 ), color1 },
{ vec2(-1.0, -1.0 ), color1 }
};
shapeSnakeArrayBuffer = loadBufferData(rectangleData1, rectangleSize);
}
所以问题是当我明显用另一种颜色加载缓冲区数据时,为什么我的所有方块都变成了红色?
我在display()中绘制它们:
void display() {
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shaderProgram);
mat4 projection = Ortho2D(-15.0f, 15.0f, -15.0f, 15.0f);
glUniformMatrix4fv(projectionUniform, 1, GL_TRUE, projection);
glBindVertexArray(shapeVertexArrayBuffer);
glBindVertexArray(shapeSnakeArrayBuffer);
drawBlock();
drawSnake();
glutSwapBuffers();
}
答案 0 :(得分:1)
glBindVertexArray(shapeVertexArrayBuffer);
glBindVertexArray(shapeSnakeArrayBuffer);
drawBlock();
drawSnake();
这里似乎有一些订购问题。大概是shapeVertexArrayBuffer
(注意:没有“顶点数组缓冲区”这样的东西。那些应该是vertex array objects;如果loadBufferData
没有返回VAO,那么你有更多问题)用于绘制块,而shapeSnakeArrayBuffer
用于绘制蛇。
您一次只能激活一个VAO。 glBindVertexArray
将给定的顶点数组对象设置为后面的所有渲染命令。由于您使用的最后一个是shapeSnakeArrayBuffer
,因此VAO将用于drawBlock
中的所有渲染命令以及drawSnake
。
答案 1 :(得分:1)
你不应该这样做:
glBindVertexArray(shapeVertexArrayBuffer);
drawBlock();
glBindVertexArray(shapeSnakeArrayBuffer);
drawSnake();