将OpenGL方形渲染为较小的子图块

时间:2018-12-02 22:43:25

标签: opengl glsl

我正在尝试将全屏四边形渲染为子图块。原因是我正在运行的GLSL着色器可能需要一段时间才能执行(最多10秒)。计算10秒后,视频驱动程序可能会超时,或者(如果禁用了TDR超时)则该应用似乎已挂起10秒。

我认为我可以将全屏四分割成子图块。它们各自渲染速度更快,并且不会锁定应用程序。

我遇到的问题是如何在平铺循环中调用glTexCoord2f和glVertex2f。循环中的示例代码;

xtilesize是图像宽度除以我要渲染四边形为的图块(xtiles)的数量 ytilesize是图像高度除以我要渲染四边形为的图块(ytiles)的数量

     for yloop:=0 to ytiles-1 do
     begin
          for xloop:=0 to xtiles-1 do
          begin
               glviewport(xloop*xtilesize,yloop*ytilesize,xloop*xtilesize+xtilesize,yloop*ytilesize+ytilesize);
               glBegin(GL_QUADS);

               //tex coords - extents are (0,0) to (1,1)
               tilewidth:=1/xtiles;
               tileheight:=1/ytiles;
               x1:=xloop*tilewidth;
               y1:=yloop*tileheight;
               x2:=x1+tilewidth;
               y2:=y1+tileheight;

               //vertex - extents are (-1,-1) to (1,1)
               //but for testing make them -0.9 to 0.9 - this gives a border around them to see how they are rendered
               x3:=-0.9;
               y3:=-0.9;
               x4:=0.9;
               y4:=0.9;

               glTexCoord2f(x1,y1); glVertex2f(x3,y3);
               glTexCoord2f(x2,y1); glVertex2f(x4,y3);
               glTexCoord2f(x2,y2); glVertex2f(x4,y4);
               glTexCoord2f(x1,y2); glVertex2f(x3,y4);

               glEnd;


          end;

     end;


The GLSL shaders are very simple;

顶点着色器

void main()
{
    gl_Position = ftransform();
}

片段着色器

#version 400

uniform vec2 resolution;

void main(void)
{
    gl_FragColor = vec4(1-gl_FragCoord.x/resolution.x,gl_FragCoord.y/resolution.y,1,0);
}

这是问题所在。如果将xtiles和ytiles设置为1,则输出为单个四边形。阴影矩形显示在0.1尺寸的边框内,即

https://ibb.co/2kHPWNb

如果我将X和Y磁贴计数增加到2,则子磁贴似乎比其应有的略大,因此它们越过了边缘,即

https://ibb.co/JrLvCvT

还有3个子图块

https://ibb.co/MVyvQRQ

还有5个suub图块

https://ibb.co/XXVRqZn

我在这里想念什么?如何可靠地将全屏四边形细分为子图块?我肯定想念一些明显的东西,但是我无法正常工作。

1 个答案:

答案 0 :(得分:1)

glviewport的第一个和第二个坐标是视口矩形的左下角坐标,但是第三个和第四个参数是视口的宽度和高度,而不是右上角的坐标。 / p>

因此必须是:

glviewport(xloop*xtilesize, yloop*ytilesize, xtilesize, ytilesize);

代替

glviewport(xloop*xtilesize, yloop*ytilesize, xloop*xtilesize+xtilesize, yloop*ytilesize+ytilesize);