如何更改openGL中像素的大小

问题描述 投票:0回答:1

我想创建一个老式的像素游戏引擎。有没有可能的方法在较低分辨率的屏幕上渲染某些内容?

我尝试通过创建屏幕缓冲区在 CPU 上进行渲染,然后通过 glDrawPixels 将其绘制到屏幕,我可以通过 glPixelZoom 更改像素的大小

但我不想自己处理三线性插值并实现深度缓冲区

opengl graphics glsl
1个回答
0
投票

如果您不想设置顶点缓冲区、帧缓冲区或使用其他现代技术,您可以使用立即模式 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 的感觉;)

© www.soinside.com 2019 - 2024. All rights reserved.