gpt4 book ai didi

c++ - 使用 OpenGL 在程序的不同位置绘图

转载 作者:行者123 更新时间:2023-11-28 06:36:35 32 4
gpt4 key购买 nike

我正在尝试运行我的第一个 OpenGL 程序。在 main() 函数中我有无限循环:

do {
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(programID);

_collection[0].draw();
_collection[1].draw();

glfwSwapBuffers(window);
glfwPollEvents();
} while(glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && glfwWindowShouldClose(window) == 0)

函数 _collection[].draw() 应该绘制矩形:

static const GLfloat g_vertex_buffer_data[] = {
x, y, 0.0f, // lewy górny
x, y - 0.4f, 0.0f, // lewy dolny
x + 0.4f, y - 0.4f, 0.0f, // prawy dolny
x + 0.4f, y, 0.0f, // lewy górny

x + 0.02f, y - 0.02f, 0.0f, // lewy górny
x + 0.02f, y - 0.4f + 0.02f, 0.0f, // lewy dolny
x + 0.4f - 0.02f, y - 0.4f + 0.02f, 0.0f, // prawy dolny
x + 0.4f - 0.02f, y - 0.02f, 0.0f, // lewy górny
};

static const GLfloat g_color_buffer_data[] = {
1.0f, 1.0f, 1.0f, // lewy górny
1.0f, 1.0f, 1.0f, // lewy dolny
1.0f, 1.0f, 1.0f, // prawy dolny
1.0f, 1.0f, 1.0f, // lewy górny

0.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f,
};



GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);

GLuint colorbuffer;
glGenBuffers(1, &colorbuffer);
glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_color_buffer_data), g_color_buffer_data, GL_STATIC_DRAW);

glEnableVertexAttribArray(vertexPosition_modelspaceID);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(
vertexPosition_modelspaceID, // The attribute we want to configure
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);

// przekazuję kolory wierzchołków
glEnableVertexAttribArray(vertexColorID);
glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
glVertexAttribPointer(
vertexColorID, // The attribute we want to configure
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);

// rysuję wszystko
glDrawArrays(GL_QUADS, 0, 8);


glDisableVertexAttribArray(vertexPosition_modelspaceID);
glDisableVertexAttribArray(vertexColorID);

我的问题是:当我运行程序时,我只看到运行第一个函数 draw() 的效果 - 这个索引为 0。然后我更改这些函数的位置:

_collection[1].draw();
_collection[0].draw();

我仍然看到第一个函数的效果 - 在本例中索引号为 1。

看起来有些东西阻止了第二个 draw() 函数的代码运行。

问题是什么?我该如何解决?

最佳答案

第二个绘图函数未被阻止执行。由于您的顶点和颜色信息在 draw() 函数体内被定义为静态,因此无论您正在绘制 _collection 的哪个元素,这些值都不会改变。这就是为什么绘制两个集合会产生相同的结果——您在相同的位置绘制顶点,并使用相同的颜色。

要解决这个问题,您只想存储一次顶点和颜色信息。您的每个集合都应仅包含 xy 值,以指示它们的位置。你不需要多个顶点和颜色的集合,你想要一个在几个不同位置绘制的顶点和颜色的集合。

在进入主循环之前,您应该在主函数中创建顶点和颜色数组。您还应该在主循环之前使用 glGenBuffersglBindBuffer 后跟 glBufferData 告诉 OpenGL 关于您的主程序中的顶点和颜色数组.然后,您可以从绘图函数中调用 glGenBuffersglBufferData。您还应该为主函数中的顶点和颜色数组调用 glVertexAttribPointer,并将它们从 draw() 函数中移除。

// Note that your vertex data isn't contingent on 'x' and 'y' positions.  
// You will use the vertex shader to move your boxes around later.
GLfloat g_vertex_buffer_data[] = {
0.0f, 0, 0.0f, // lewy górny
0.0f, 0.4f, 0.0f, // lewy dolny
0.4f, 0.4f, 0.0f, // prawy dolny
0.4f, 0.0f, 0.0f, // lewy górny

0.02f, 0.02f, 0.0f, // lewy górny
0.02f, 0.4f + 0.02f, 0.0f, // lewy dolny
0.4f - 0.02f, 0.4f + 0.02f, 0.0f, // prawy dolny
0.4f - 0.02f, 0.02f, 0.0f, // lewy górny
};

GLfloat g_color_buffer_data[] = {
1.0f, 1.0f, 1.0f, // lewy górny
1.0f, 1.0f, 1.0f, // lewy dolny
1.0f, 1.0f, 1.0f, // prawy dolny
1.0f, 1.0f, 1.0f, // lewy górny

0.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f,
};

GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);
glVertexAttribPointer(
vertexPosition_modelspaceID, // The attribute we want to configure
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);

GLuint colorbuffer;
glGenBuffers(1, &colorbuffer);
glBindBuffer(GL_ARRAY_BUFFER, colorbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_color_buffer_data), g_color_buffer_data, GL_STATIC_DRAW);
glVertexAttribPointer(
vertexColorID, // The attribute we want to configure
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);
// All of the above information you only need to specify to openGL once, not every time you draw a frame!

您需要更改您的着色器,以便它接受来自您的每个集合的 x 和 y 偏移量:

    #version 150
uniform float collectionX;
uniform float collectionY;
in vec3 vertexPosition_modelspaceID; // This is the vertex attribute which the name 'vertexPosition_modelspaceID' corresponds to.
// Remember that your shader will also accept a color and give it to the fragment shader, include that code as well.
void main()
{
gl_Position = vec4(vertexPosition_modelspaceID.x + collectionX, vertexPosition_modelspaceID.y + collectionY, vertexPosition_modelspaceID.z, 1.0);
}

并且您需要在循环之前在主程序中获取刚刚添加到着色器的统一变量的位置:

// Call these functions after you compile and link your shaders.  programID should be your compiled and linked shader program.  
GLuint collectionXID = glGetUniformLocation(programID, "collectionX");
GLuint collectionYID = glGetUniformLocation(programID, "collectionY");

你的绘图函数现在会非常简单:

void draw()
{
glDrawArrays(GL_QUADS, 0, 8);
}

最后,您的主循环将如下所示:

do 
{
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(programID);

glEnableVertexAttribArray(vertexPosition_modelspaceID);
glEnableVertexAttribArray(vertexColorID);

glUniform1f(collectionXID, _collection[0].x);
glUniform1f(collectionYID, _collection[0].y);
_collection[0].draw();

glUniform1f(collectionXID, _collection[1].x);
glUniform1f(collectionYID, _collection[1].y);
_collection[1].draw();

glfwSwapBuffers(window);
glDisableVertexAttribArray(vertexPosition_modelspaceID);
glDisableVertexAttribArray(vertexColorID);

glfwPollEvents();
} while(glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && glfwWindowShouldClose(window) == 0)

请注意,您现在通过使用 glUniform1f 函数传递个人集合的 xy 位置来指定将顶点绘制到着色器程序的位置。使用变换矩阵四处移动顶点更为常见,但这本身就是一个相当复杂的主题。

假设集合有不同的 xy 位置,它们现在将绘制在不同的位置。

关于c++ - 使用 OpenGL 在程序的不同位置绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26680048/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com