首页 > 解决方案 > 将 OpenGL 四边形渲染为较小的子图块

问题描述

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

我以为我可以将全屏四边形分解为子图块。它们每个都渲染得更快,并且不会锁定应用程序。

我遇到的问题是如何在 tile 循环中调用 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

我在这里想念什么?如何可靠地将全屏四边形细分为子图块?我一定遗漏了一些明显的东西,但我就是不能让它工作。

标签: openglglsl

解决方案


的第 1 和第 2 坐标glviewport是视口矩形的左下角坐标,但第 3 和第 4 个参数是视口的宽度和高度,而不是右上角的坐标。

所以它必须是:

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

代替

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


推荐阅读