Визуализация квадрата OpenGL в виде меньших вложенных плиток - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь сделать полноэкранный квад в качестве вспомогательных плиток.Причина этого в том, что шейдер 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 голосов
/ 03 декабря 2018

1-я и 2-я координаты glviewport - это нижняя левая координата прямоугольника области просмотра, но 3-й и 4-й параметры - это ширина и высота области просмотра, а не координаты верхнейправый угол.

Так должно быть:

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

вместо

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...