OpenGL Scale单像素线

Lum*_*ire 2 c++ opengl sdl pixel line

我想制作一个内部为320x240的游戏,但以整数倍(640x480,960,720等)渲染到屏幕.我打算复古的2D像素图形.

我通过glOrtho()设置内部分辨率来实现这一点:

glOrtho(0, 320, 240, 0, 0, 1);
Run Code Online (Sandbox Code Playgroud)

然后我将输出分辨率放大3倍,如下所示:

glViewport(0,0,960,720);
window = SDL_CreateWindow("Title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 960, 720, SDL_WINDOW_OPENGL);
Run Code Online (Sandbox Code Playgroud)

我画这样的矩形:

glBegin(GL_LINE_LOOP);
glVertex2f(rect_x, rect_y);
glVertex2f(rect_x + rect_w, rect_y);
glVertex2f(rect_x + dst_w, dst_y + dst_h);
glVertex2f(rect_x, rect_y + rect_h);
glEnd();
Run Code Online (Sandbox Code Playgroud)

它完美地工作在320x240(未缩放):

在此输入图像描述

当我扩展到960x720时,像素渲染一切正常!然而,似乎GL_Line_Loop不是在320x240画布上绘制并按比例放大,而是在最终的960x720画布上绘制.结果是3px世界中的1px行:(

在此输入图像描述

如何在320x240 glOrtho画布上绘制线条,而不是960x720输出画布?

Nic*_*las 7

没有"320x240 glOrtho canvas".只有窗口的实际分辨率:960x720.

您所做的只是缩放渲染图元的坐标.所以,你的代码说要渲染一条线,例如,(20,20)到(40,40).OpenGL(最终)在每个维度上将这些坐标缩放3:(60,60)和(120x120).

但那只是处理终点问题.中间发生的事情仍然基于你在窗口的实际分辨率下渲染的事实.

即使您习惯glLineWidth改变线条的宽度,也只能修复线条宽度.它不能解决线条栅格化基于您渲染的实际分辨率这一事实.所以对角线不会有你想要的像素化外观.

正确地做到这一点的唯一方法是,正确地做到这一点.渲染到实际为320x240的图像,然后将其绘制到窗口的实际分辨率.

您必须创建该大小的纹理,然后将其附加到帧缓冲对象.将FBO绑定到渲染并渲染到它(将视口设置为图像的大小).然后取消绑定FBO,并将该纹理绘制到窗口(将视口设置为窗口的分辨率).