我想创建一个老式的像素游戏引擎。有没有可能的方法在较低分辨率的屏幕上渲染某些内容?
我尝试通过创建屏幕缓冲区在 CPU 上进行渲染,然后通过 glDrawPixels 将其绘制到屏幕,我可以通过 glPixelZoom 更改像素的大小
但我不想自己处理三线性插值并实现深度缓冲区
如果您不想设置顶点缓冲区、帧缓冲区或使用其他现代技术,您可以使用立即模式 OpenGL(版本 1.0 - 3.2)。在这里,您可以使用创建顶点数组(在本例中为矩形)的老式方法。我给你举个例子:
void drawPixel(int posX, int posY, int sizeX, int sizeY, int windowSizeX, int windowSizeY) {
int realPosX;
int realPosY;
int realSizeX;
int realSizeY;
toNDC(posX, posY, realPosX, realPosY, windowSizeX, windowSizeY);
toNDC(sizeX, sizeY, realPosX, realPosY, windowSizeX, windowSizeY);
glBegin(GL_QUADS);
glColor3f(1.0, 1.0, 1.0, 0.0);
glVertex2f(realPosX, realPosY);
glVertex2f(realPosX + realSizeX, realPosY);
glVertex2f(realPosX + realSizeX, realPosY + realSizeY);
glVertex2f(realPosX, realPosY + realSizeY);
glEnd();
}
函数
drawPixel
绘制一个白色矩形(点),并有六个参数:点的位置和大小的x和y值,以及绘制到的窗口大小的x和y值。 glVertex2f
的实际 NDC(标准化设备坐标)是通过此函数计算的:
void toNDC(int x, int y, float& xOut, float& yOut, int windowSizeX, int windowSizeY) {
int halfSizeX{ windowSizeX / 2 };
int halfSizeY{ windowSizeY / 2 };
if (x == halfSizeX) xOut = 0.0;
if (x > halfSizeX) xOut = (x - halfSizeX) / halfSizeX;
else xOut = -((halfSizeX - x) / halfSizeX);
if (y == halfSizeY) yOut = 0.0;
if (y > halfSizeY) yOut = (y - halfSizeY) / halfSizeY;
else yOut = (halfSizeY - y) / halfSizeY;
}
drawPixel
获取的坐标是屏幕坐标,因此需要通过toNDC
将其转换为NDC才能与OpenGL一起使用。例如,当窗口大小为 1920x1080 时,此函数会将屏幕坐标 (400, 200) 转换为 (-0.5834, 0.6296)。
我承认,这不是解决这个问题的最快方法。但在创建“老式像素游戏引擎”时,无论是编程还是玩游戏,这可能是更好的解决方案。它真的给你一种 80 年代蹩脚的 IBM 5150 的感觉;)