c++ - 如何在OpenGL中绘制一组坐标?
问题描述
我正在尝试用 C++ 制作康威的生命游戏,并且正在使用 OpenGL(但我对 OpenGL 很陌生),因为它支持负坐标,因此支持无限的世界。
我有一个名为 GameOfLife 的类,它处理整个世界,并将活细胞作为向量中的 [x, y] 坐标。因此,我将在整个活动单元格坐标中使用 for 循环,并为每个坐标渲染一个像素。
但是,无论我做什么,屏幕上都不会出现任何我尝试过的东西。下面是带有空glBegin
和glEnd
函数的代码。我应该在它们之间放置什么才能渲染。
我试过:
将每个坐标除以 400 得到float
1 个像素。
在第三边和第四边的 x 和 y 上加 1/400。
#include "gol.h"
#include <GL/glew.h>
#include <GLFW/glfw3.h>
int main()
{
std::vector<std::vector<int>> dupl;
std::ifstream infile { "test.rle" };
std::string file_contents { std::istreambuf_iterator<char>(infile), std::istreambuf_iterator<char>() };
parse_rle(file_contents, 0, dupl);
GameOfLife gol;
gol.place_cells(dupl);
//gol.update();
GLFWwindow* window;
if (!glfwInit())
return 1;
int width = 400;
window = glfwCreateWindow(width, width, "Window", NULL, NULL);
if (!window) {
glfwTerminate();
return 1;
}
glfwMakeContextCurrent(window);
if(glewInit()!=GLEW_OK)
std::cout<<"Error"<<std::endl;
glEnable(GL_DEPTH_TEST);
while(!glfwWindowShouldClose(window)) {
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
for(std::vector<int> i : gol.alive)
{
glBegin(GL_QUADS);
glEnd();
}
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
}
解决方案
如果您正在绘制四边形 ( GL_QUADS
),那么您应该使用要绘制glVertex2f
的四边形每个角的坐标调用 4 次。对于三角形,使用GL_TRIANGLES
和 3 次调用。为了积分,GL_POINTS
1 次通话。
它也将有助于设置颜色glColor3f
。
例如,如果我没记错的话,这会将屏幕的左半部分染成红色:
glBegin(GL_QUADS);
glColor3f(1, 0, 0);
glVertex2f(-1, -1);
glVertex2f(-1, 1);
glVertex2f( 0, 1);
glVertex2f( 0, -1);
glEnd();
此外,您不需要 2D 图形的深度缓冲区。
此外,“因为它支持负坐标”是使用 OpenGL 的荒谬理由。这并不意味着整个无限世界一次都可以在屏幕上显示——屏幕坐标仅从 -1 变为 1。
推荐阅读
- typescript - 如何一般地键入不一致函数的修改字典
- c++ - 如何在 clang 格式的参数初始化之前删除空格?
- metadata - 使用 SAML2 将 SiteMinder 配置为 AWS Cognito userpool identityProvider
- asp.net-core - ASP.NET Core 3.0 - 未推断模型绑定?
- php - 我如何不断地从 PHP 的 passthru() 函数中获取最后一行,例如当 youtube-dl 正在执行时?
- javascript - 将代码从箭头函数重写为非箭头函数
- python - 函数的所有输出都是相同的
- macos - macOS 授予对沙盒应用程序的全盘访问权限不起作用
- r - 添加一个计数列,如果满足某个条件,则计数两次
- python - 有没有办法同时运行一段时间x次