Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL尺度单像素线_C++_Opengl_Line_Sdl_Pixel - Fatal编程技术网

C++ OpenGL尺度单像素线

C++ OpenGL尺度单像素线,c++,opengl,line,sdl,pixel,C++,Opengl,Line,Sdl,Pixel,我想制作一个内部为320x240的游戏,但在屏幕上以整数倍数呈现(640x480、960720等)。我要复古2D像素图形 我通过glOrtho()设置内部分辨率来实现这一点: 然后我将输出分辨率放大3倍,如下所示: glViewport(0,0,960,720); window = SDL_CreateWindow("Title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 960, 720, SDL_WINDOW_OPENGL); glB

我想制作一个内部为320x240的游戏,但在屏幕上以整数倍数呈现(640x480、960720等)。我要复古2D像素图形

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

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

glViewport(0,0,960,720);
window = SDL_CreateWindow("Title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 960, 720, SDL_WINDOW_OPENGL);
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();
我画的矩形是这样的:

glViewport(0,0,960,720);
window = SDL_CreateWindow("Title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 960, 720, SDL_WINDOW_OPENGL);
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();
它在320x240(未缩放)下工作正常:

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

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

没有“320x240 glOrtho画布”。只有窗口的实际分辨率:960x720

你所做的就是放大你渲染的原语的坐标。因此,你的代码说渲染一条线,例如,(20,20)到(40,40)。OpenGL(最终)将这些坐标在每个维度上缩放3:(60,60)和(120x120)

<>但是这只是处理终点。中间发生的事情仍然是基于你在窗口的实际分辨率渲染的事实。

即使您使用
glLineWidth
来更改线条的宽度,这也只会固定线条的宽度。它不会固定线条的光栅化基于您渲染时的实际分辨率这一事实。因此对角线不会具有您可能想要的像素化外观

唯一正确的方法是,好吧,正确地进行。渲染到实际为320x240的图像,然后将其绘制到窗口的实际分辨率


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

正如我在评论中提到的那样,英特尔OpenGL驱动程序在直接渲染纹理方面存在问题,我不知道有任何解决办法。在这种情况下,唯一的解决办法是使用
glReadPixels
将屏幕内容复制到CPU内存中,然后将其复制回GPU纹理。粗糙的,比直接渲染到纹理慢得多。所以这里是交易:

  • 设置低分辨率视图

    不要仅更改
    glViewport
    值来更改窗口的分辨率。然后以低分辨率渲染场景(仅在屏幕空间的一小部分中)

  • 将渲染屏幕复制到纹理中

  • 设置目标分辨率视图
  • 渲染纹理

    不要忘记使用最近的过滤器。最重要的是你只能在这之后而不是之前交换缓冲区!!!否则你会有闪烁

  • <>强>这里的C++源:

    void gl_draw()
    {
    //渲染分辨率和倍增
    常数int xs=320,ys=200,m=2;
    //[低分辨率渲染过程]
    glViewport(0,0,xs,ys);
    glClearColor(0.0,0.0,0.0,1.0);
    glClear(GLU颜色缓冲位);
    glMatrixMode(GL_投影);
    glLoadIdentity();
    glMatrixMode(GLU模型视图);
    glLoadIdentity();
    glDisable(GLU深度测试);
    glDisable(GL_纹理_2D);
    //50条随机线
    随机种子=0x12345678;
    GL3F(1.0,1.0,1.0);
    glBegin(GL_行);
    
    对于(int i=0;如果FBO不是你的场景,那么总是存在的。是的,我同意,但需要补充一点,如果你要渲染到纹理,你可以预期英特尔gfx卡将不会像预期的那样工作,或者在它们修复驱动程序之前根本不会工作,而对于较旧的gfx卡,驱动程序永远不会基于经验……在这种情况下,你可以尝试
    glReadPixels
    。@Spektre:如果您想添加一个讨论特定驱动程序错误的答案,请放心。我不知道您所说的确切错误或您所指的硬件,因此我没有资格讨论它。我添加了缓慢的OpenGL 1.0方法,它甚至可以在英特尔上运行。