#c #opengl #graphics #shadow-mapping #opengl-1.x
#c #opengl #графика #отображение теней #opengl-1.x
Вопрос:
Я взламывал очень старую игру OpenGL 1.x с конвейером фиксированных функций. Я перехватывал вызовы opengl и внедрял всевозможные современные элементы opengl, так что я добился нового освещения и добавил шейдеры постобработки (программируемый конвейер).
Я хотел бы сгенерировать карту теней (для теней в реальном времени) для этой игры, которая в настоящее время это не поддерживает. Как я понимаю, мне нужно выполнить многопроходный рендеринг, который игра в настоящее время не поддерживает, и мне нужен один из этих проходов, чтобы использовать источник света в качестве положения камеры для создания карты теней.
Я подумал, что мог бы удвоить вызовы рисования (drawelements и drawarrays) и для одного из каждого вызова использовать gluLookAt для преобразования сцены в перспективу положения света и рендеринга этого в буфер кадров, а затем повернуть камеру и продолжить рендеринг
Однако я не уверен, что понимаю состояние opengl достаточно хорошо, чтобы сделать это, поскольку каждое использование gluLookAt перед отдельными вызовами рендеринга дает мне очень странные результаты, даже если я указываю текущее положение камеры, которое я извлекаю из матрицы modelview. эти забавные результаты похожи на то, что некоторые случайные вершины находятся в правильном месте, а многие нет, и они мигают и перемещаются повсюду
Я предполагаю, что мне не следует пытаться преобразовать камеру в момент отдельного вызова рендеринга для массива вершин .. но я не уверен, что делать дальше, потому что мне нужно два прохода.
Вопрос: Есть ли определенное время во время вызовов рендеринга, когда имеет смысл выполнить gluLookAt, или способ использовать его для преобразования всей сцены в контексте одного вызова рендеринга?
Единственная другая мысль, которая у меня есть, — это фактически записать все рендеринговые и матричные преобразования по порядку и воспроизвести их для второго прохода.
Комментарии:
1. Что ж, хотя то, что вы пытаетесь сделать, безусловно, не является невозможным, вам придется понимать (и иметь дело с) потенциально каждым состоянием GL, которого касается игра. «Единственная другая мысль, которая у меня есть, — это фактически записать все преобразования рендеринга и матрицы по порядку и воспроизвести их для второго прохода «. если вы сделаете это, вам нужно записать все изменения состояния GL, а не только преобразования.
2. Обратите внимание, что я сделал нечто подобное, но не для отображения теней, а для стереоскопического и многовидового (автостереоскопического) рендеринга. Мой материал был основан на платформе перехвата GL с открытым исходным кодом chromium (не браузерная штуковина) и платформе распределенного рендеринга с открытым исходным кодом, которая, по крайней мере, может неплохо справляться с материалами уровня GL 1.x и содержит такие компоненты, как packer и unpacker (которые записывают команды GL в области памяти и могут в принципе воспроизводить их), а также state tracker / state differencer . но даже при использовании этого потребуется много работы.
3. очень интересно @derhass спасибо вам за ваше понимание. ваш проект механически очень похож на мой, а инструменты chromium кажутся очень полезными