我正在尝试将全屏四边形渲染为子图块。原因是我正在运行的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尺寸的边框内,即
如果我将X和Y磁贴计数增加到2,则子磁贴似乎比其应有的略大,因此它们越过了边缘,即
还有3个子图块
还有5个suub图块
我在这里想念什么?如何可靠地将全屏四边形细分为子图块?我肯定想念一些明显的东西,但是我无法正常工作。
答案 0 :(得分:1)
glviewport
的第一个和第二个坐标是视口矩形的左下角坐标,但是第三个和第四个参数是视口的宽度和高度,而不是右上角的坐标。 / p>
因此必须是:
glviewport(xloop*xtilesize, yloop*ytilesize, xtilesize, ytilesize);
代替
glviewport(xloop*xtilesize, yloop*ytilesize, xloop*xtilesize+xtilesize, yloop*ytilesize+ytilesize);