opengl - 将 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 大小的边框内,即
如果我将 X 和 Y 瓦片数增加到 2,子瓦片似乎比它们应该的稍大,所以它们越过边缘,即
对于 3 个子图块
对于 5 个 suub 瓷砖
我在这里想念什么?如何可靠地将全屏四边形细分为子图块?我一定遗漏了一些明显的东西,但我就是不能让它工作。
解决方案
的第 1 和第 2 坐标glviewport
是视口矩形的左下角坐标,但第 3 和第 4 个参数是视口的宽度和高度,而不是右上角的坐标。
所以它必须是:
glviewport(xloop*xtilesize, yloop*ytilesize, xtilesize, ytilesize);
代替
glviewport(xloop*xtilesize, yloop*ytilesize, xloop*xtilesize+xtilesize, yloop*ytilesize+ytilesize);
推荐阅读
- c#-4.0 - 根据 C# 2019 中组合框中的值选择一个类
- unity3d - 从 .FBX 文件实例化和制作游戏对象会导致持久对象错误
- python - 在使用 Python 发布之前获取文件大小
- java - 使用注释将 SQL 查询输出解析为未知类
- oracle - 如何在plsql块中执行删除语句并在过程中调用它
- android - 如何在android中获取视图的背景和前景像素
- python - Pandas groupby 在一个列上而不丢失其他列?
- symfony - 如何在 Symfony 4 中使用 libphonenumber.phone_number_util
- node.js - nodejs worker_threads 如何理解所有worker都完成了工作
- math - 如何将固定资源分配给图的顶点而低度顶点获得更多?