<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4338251266540090894</id><updated>2012-01-19T22:52:26.739-08:00</updated><title type='text'>AndreyGL/D3D</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://andreyogl-d3d.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://andreyogl-d3d.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Andrey</name><uri>http://www.blogger.com/profile/16201443526225351421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_JwI00ZTPVto/S-HWkBK2ZJI/AAAAAAAAAJ4/hJhI6NBcUgA/S220/IMG_0423_!.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4338251266540090894.post-1918998347563259158</id><published>2010-01-10T08:57:00.000-08:00</published><updated>2010-08-10T01:39:28.762-07:00</updated><title type='text'>Software Occlusion Culling</title><content type='html'>Как известно, в сложных сценах могут возникнуть ситуации, когда объекты могут загораживать&amp;nbsp; другу-друга. В этом случае, алгоритм&amp;nbsp; &lt;a href="http://en.wikipedia.org/wiki/Frustum_culling"&gt;Frustum Culling&lt;/a&gt; будет давать положительные результаты о видимости объектов, независимо от того загораживают они друг друга или нет.&lt;br /&gt;&lt;br /&gt;Естественно, рендеринг большого числа загороженных объектов будет снижать быстродействие. Для решение данной проблемы используется алгоритм &lt;a href="http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node42.html"&gt;Occlusion Culling&lt;/a&gt;. Одна из реализаций алгоритма которая поддерживается аппаратно это &lt;a href="http://www.gamedev.ru/code/terms/OQ"&gt;Occlusion Query&lt;/a&gt;. Большим недостатком данного метода является то, что результат теста будет получен не сразу, а только после завершения работы видео карты, вызывая простои процессора(CPU Stall). Для решения данной проблемы используются несколько подходов, таких как иерархия запросов, получения результата через n-кадров, предсказания запросов и другие реализации. Для аппаратной реализации нужно рисовать упрощенную геометрию и ограничивающий объем объектов для тестирования. Это требует дополнительных вызовов графических API и дополнительных Render Target'ов,что в добавок ко всему усложняет реализацию. Отличная реализация алгоритма&amp;nbsp; с аппаратной поддержкой описана тут: &lt;a href="http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter06.html"&gt;Hardware Occlusion Queries Made Useful.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Я попробовал получать результаты через n-кадров, объекты мигали, результат меня не удовлетворил, не став больше экспериментировать я попробовал использовать софтварную реализации алгоритма.&lt;br /&gt;&lt;br /&gt;Одним из способов софтварной реализации является построения Viewing Frustum по ограничивающему боксу объекта. Все объекты, полученные после обхода &lt;a href="http://en.wikipedia.org/wiki/Scene_graph"&gt;Scene Graph&lt;/a&gt; и отсортированные&amp;nbsp; по расстоянию до камеры, полностью попадающие в &lt;a href="http://en.wikipedia.org/wiki/Viewing_frustum"&gt;Frustum&lt;/a&gt;, без пересечений с его плоскостями, будут считаться невидимыми, и должны быть выкинуты из списка видимых.&lt;br /&gt;Недавно мне порекомендовали еще более простой способ определения того что один объект полностью закрывает другой. Способ заключается в проверки спроецированных на плоскость экрана ограничивающих боксов объектов на полное попадание друг в друга. На данной реализации я и остановился.&lt;br /&gt;Сначала я написал функцию проецирования точки на экран, заодно пополнив математическую библиотеку движка.&lt;br /&gt;Проанализировав проекцию бокса на плоскость:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_JwI00ZTPVto/S0mS2R97oOI/AAAAAAAAAIQ/JUrQA9eA_T0/s1600-h/decription_algorithm.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_JwI00ZTPVto/S0mS2R97oOI/AAAAAAAAAIQ/JUrQA9eA_T0/s320/decription_algorithm.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Стало видно, что точки 4 и 2 внутренние и должны быть выкинуты:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_JwI00ZTPVto/S0mTaehX5-I/AAAAAAAAAIY/-8TIF7FmlTo/s1600-h/decription_algorithm2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_JwI00ZTPVto/S0mTaehX5-I/AAAAAAAAAIY/-8TIF7FmlTo/s320/decription_algorithm2.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Таким образом, результатом проекции будет замкнутый шестиугольник.&lt;br /&gt;Если ориентация бокса к камере под прямым углом, то дальние точки после проекции будут совпадать с передними, в этом случае результат проекции будет четырехугольник.Теперь можно &lt;br /&gt;составленный список точек проекции бокса тестируемого объекта, проверять на попадание в замкнутую область проекции бокса закрываемого объекта. Тут подходит общеизвестный алгоритм &lt;a href="http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D1%82%D0%BE%D1%87%D0%BA%D0%B8_%D0%B2_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%B5"&gt;нахождения точки внутри многоугольника.&lt;/a&gt;&lt;br /&gt;Небольшая &lt;a href="http://ifolder.ru/18376766"&gt;демка&lt;/a&gt; показывающая как это все работает. &lt;br /&gt;Следует заметить, что не все объекту могут полностью закрыть другие. Сам объект должен быть непрозрачным. Обычно такой объект называют Occluder'ом, задавать такие объекты можно при разработке уровня. Геометрия объекта, который может полностью закрыть другие, должна быть сплошной, его ограничивающий бокс должен быть максимально к ней приближен,&amp;nbsp; если это не так, то следует задавать так называемые Occlusion Box'ы. К примеру для дерева нужно задать Occlusion Box ствола, но наверняка это будет не эффективно. Ведь площадь проекции ствола дерева в большинстве случае мала, и мало объектов будет отброшено за стволом. Идеальным кандидатом будет к примеру дом.&lt;br /&gt;&lt;br /&gt;На моей тестовой сцене в некоторых местах иногда отсекается больше 200 объектов.&lt;br /&gt;Теперь о результатах, приведу несколько скриншотов.&lt;br /&gt;&lt;br /&gt;Occlusion Culling on, отброшено 243 объекта, FPS 37.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_JwI00ZTPVto/S0uDtiny9BI/AAAAAAAAAIw/qO1byEWL2no/s1600-h/ScreenShot0.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_JwI00ZTPVto/S0uDtiny9BI/AAAAAAAAAIw/qO1byEWL2no/s400/ScreenShot0.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Occlusion Culling off, FPS 30.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_JwI00ZTPVto/S0uEWtYUOWI/AAAAAAAAAI4/oGsUlWWQ1tM/s1600-h/ScreenShot1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_JwI00ZTPVto/S0uEWtYUOWI/AAAAAAAAAI4/oGsUlWWQ1tM/s400/ScreenShot1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Occlusion Culling on, отброшен 71 объект, FPS 41.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_JwI00ZTPVto/S0uFbhn9E1I/AAAAAAAAAJA/7x2eNNqahH8/s1600-h/ScreenShot2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_JwI00ZTPVto/S0uFbhn9E1I/AAAAAAAAAJA/7x2eNNqahH8/s400/ScreenShot2.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Occlusion Culling off,&amp;nbsp; FPS 35. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_JwI00ZTPVto/S0uFyh0WibI/AAAAAAAAAJI/8rqc_Sm5YIY/s1600-h/ScreenShot3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_JwI00ZTPVto/S0uFyh0WibI/AAAAAAAAAJI/8rqc_Sm5YIY/s400/ScreenShot3.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Как видно в некоторых случаях производительность можно поднять, особенно на сложных сценах, к примеру город, или если есть сложные объекты которые будут закрыты.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4338251266540090894-1918998347563259158?l=andreyogl-d3d.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreyogl-d3d.blogspot.com/feeds/1918998347563259158/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4338251266540090894&amp;postID=1918998347563259158' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/1918998347563259158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/1918998347563259158'/><link rel='alternate' type='text/html' href='http://andreyogl-d3d.blogspot.com/2010/01/software-occlusion-culling.html' title='Software Occlusion Culling'/><author><name>Andrey</name><uri>http://www.blogger.com/profile/16201443526225351421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_JwI00ZTPVto/S-HWkBK2ZJI/AAAAAAAAAJ4/hJhI6NBcUgA/S220/IMG_0423_!.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_JwI00ZTPVto/S0mS2R97oOI/AAAAAAAAAIQ/JUrQA9eA_T0/s72-c/decription_algorithm.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4338251266540090894.post-2863103643000584793</id><published>2009-10-16T06:21:00.000-07:00</published><updated>2010-06-30T21:50:22.213-07:00</updated><title type='text'>Multithreading in OpenGL API</title><content type='html'>Как известно, OpenGL имеет некоторые неудобства для работы в разных потоках, по сравнению с Direct3D. Сам недавно столкнулся с этими неудобствами на платформе Windows. &lt;br /&gt;Согласно документации MSDN, для каждого потока в котором будет работа с OpenGL API, должен быть свой текущий контекст рендеринга, установку текущего контекста &lt;br /&gt;осуществляется с помощью функции &lt;a href="http://msdn.microsoft.com/en-us/library/dd374387%28VS.85%29.aspx"&gt;wglMakeCurrent&lt;/a&gt;. &lt;br /&gt;Если это не так, то при любом обращении к функциям OpenGL API будет ошибка GL_INVALID_OPERATION, ну а дальше нарушенный доступ к памяти и далее поведение &lt;br /&gt;программы не определено.&lt;br /&gt;Для решения этой проблемы, нужно создать для нового потока новый контекcт воспроизведения, используя функцию &lt;a href="http://msdn.microsoft.com/en-us/library/dd374379%28VS.85%29.aspx"&gt;wglCreateContext&lt;/a&gt;. &lt;br /&gt;В качестве контекста окна можно передать контекст окна приложения, хотя по некоторым советам, следует создать дополнительное маленькое окно размером 1x1 пиксель. &lt;br /&gt;Хотя у меня работало и без дополнительного окна. Далее, нужно что-бы все изменения между потоками были известны друг другу. К примеру, создается &lt;br /&gt;текстура, вершинный или индексный буфер и т.д. в одном потоке, а использоваться будет в другом. Осуществить это нужно с помощью функции &lt;a href="http://msdn.microsoft.com/en-us/library/dd374390%28VS.85%29.aspx"&gt;wglShareLists&lt;/a&gt;, &lt;br /&gt;причем тут дисплейные списки в описании функции я не знаю.&lt;br /&gt;Лучше сделать расшаривание контекстов друг на друга, хотя все зависит от задачи, т.е. если есть к примеру есть load_context и render_context, которые используются в потоке загрузки и рендеринга соответственно, то пара вызовов: &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd374390%28VS.85%29.aspx"&gt;wglShareLists&lt;/a&gt;(load_context, render_contex);&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd374390%28VS.85%29.aspx"&gt;wglShareLists&lt;/a&gt;(render_contex, load_context);&lt;/span&gt;&lt;br /&gt;обеспечат видимость изменений между этими потоками. &lt;br /&gt;В случае неудачи вызова &lt;a href="http://msdn.microsoft.com/en-us/library/dd374390%28VS.85%29.aspx"&gt;wglShareLists&lt;/a&gt; у меня &lt;a href="http://msdn.microsoft.com/en-us/library/dd374390%28VS.85%29.aspx"&gt;GetLastError&lt;/a&gt; возвращает ошибку, строковое соответствие полученное через &lt;a href="http://msdn.microsoft.com/en-us/library/ms679351%28VS.85%29.aspx"&gt;FormatMessage&lt;/a&gt; было таким:&lt;br /&gt;"невозможно создать файл так как он уже существует", почему это так, для меня загадка.&lt;br /&gt;При завершении каждого потока нужно не забыть освободить связанный с ним контекст.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4338251266540090894-2863103643000584793?l=andreyogl-d3d.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreyogl-d3d.blogspot.com/feeds/2863103643000584793/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4338251266540090894&amp;postID=2863103643000584793' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/2863103643000584793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/2863103643000584793'/><link rel='alternate' type='text/html' href='http://andreyogl-d3d.blogspot.com/2009/10/multithreading-in-opengl-api.html' title='Multithreading in OpenGL API'/><author><name>Andrey</name><uri>http://www.blogger.com/profile/16201443526225351421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_JwI00ZTPVto/S-HWkBK2ZJI/AAAAAAAAAJ4/hJhI6NBcUgA/S220/IMG_0423_!.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4338251266540090894.post-8082229956570538352</id><published>2009-07-08T13:12:00.000-07:00</published><updated>2009-07-08T15:51:54.760-07:00</updated><title type='text'>Различные доработки.</title><content type='html'>Итак, после долгой паузы решил написать что еще сделано, что еще планируется. &lt;br /&gt;Добавлено задание &lt;a href="http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B8%D0%B7%D0%BE%D1%82%D1%80%D0%BE%D0%BF%D0%BD%D0%B0%D1%8F_%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8F"&gt;Анизотропной фильтрации&lt;/a&gt; в материале. Значение фильтрации задается там-же, в случае если нет поддержки со стороны железа текущего значения, подменяется ближайшее по значению, если &lt;a href="http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B8%D0%B7%D0%BE%D1%82%D1%80%D0%BE%D0%BF%D0%BD%D0%B0%D1%8F_%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8F"&gt;анизотропная фильтрация&lt;/a&gt; не поддерживается, производится замена на &lt;a href="http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B8%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8F"&gt;трилинейную&lt;/a&gt;. Есть идея с большого расстояния отключать &lt;a href="http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B8%D0%B7%D0%BE%D1%82%D1%80%D0%BE%D0%BF%D0%BD%D0%B0%D1%8F_%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8F"&gt;анизотропную фильтрацию&lt;/a&gt; и включать &lt;a href="http://ru.wikipedia.org/wiki/%D0%A2%D1%80%D0%B8%D0%BB%D0%B8%D0%BD%D0%B5%D0%B9%D0%BD%D0%B0%D1%8F_%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8F"&gt;трилинейную&lt;/a&gt;, но даст это что-то для повышения быстродействия, нужно подумать.&lt;br /&gt;&lt;br /&gt;Написаны реализации кубических и трехмерных текстур. Так-же в случае реализации рендера в текстуру для них.&lt;br /&gt;&lt;br /&gt;Как известно, на сложных сценах рисуется много объектов. Если не применять &lt;a href="http://en.wikipedia.org/wiki/Geometry_instancing"&gt;инстансинг&lt;/a&gt;, то встает проблема минимизации числа вызовов рисования геометрии, имеется ввиду вызовы соответствующей функциональности в Direct3D9, Direct3D10 и в OpenGL:  IDirect3DDevice9::DrawIndexedPrimitive, ID3D10::DrawIndexed, glDrawElements, glDrawRangeElements. &lt;a href="http://en.wikipedia.org/wiki/Geometry_instancing"&gt;Инстансинг&lt;/a&gt; стоит в планах, а пока для каждого объекта сцены ставиться вершинный и индексный буфер. Если объектов будет тысячи, на моей тестовой сцене это число уже больше, то число переключений вершинных и индексных буферов буферов будет снижать быстродействие. Возникла идея, собрать все меши имеющее одинаковый формат вершин в единый вершинный буфер, аналогично поступить с индексными. Это будет еще более актуально, если число объектов отличающихся по геометрической форме будет большим.&lt;br /&gt;Вот некоторая статистика для сцены вместе с тенями для 1377 объектов, всего разных объектов для текущей сцены около 50:&lt;br /&gt;Число переключений буферов в случае общих вершинных и индексных: 59, 58&lt;br /&gt;Число переключений буферов в случае отдельных вершинных и индексных: 96, 84&lt;br /&gt;&lt;br /&gt;Улучшилась работа &lt;a href="http://andreyogl-d3d.blogspot.com/2008/11/blog-post_10.html"&gt;профайла&lt;/a&gt;. Сделал усреднение времени по 10 кадрам, теперь значения не "прыгают". Фильтрация показа малых значений времени.&lt;br /&gt;&lt;br /&gt;В файле описания уровня можно задавать Render Target'ы, привязанные к объектам сцены. Параметры, такие как размеры, формат пикселей, пишутся там-же. Если Render Target служит для отражения то указывается в параметре для какой плоскости это происходит. В таком случае при обходе &lt;a href="http://en.wikipedia.org/wiki/Scene_graph"&gt;Scene Graph&lt;/a&gt;'a, будет происходить сбор как самих видимых объектов, так и заполняться список видимых объектов для каждого заданного Render Target'а. Такой подход удобен для реализации отражений для моделирования воды, зеркал или еще чего нибудь. В данный момент реализовываю отражение в воде.&lt;br /&gt;&lt;br /&gt;Добавлена реализация менеджера камер. Камеры можно задавать из файла уровня, вместе с параметрами и некого имени. Текущую камеру можно подменить, это дает мозможность смотреть сцену с различных точек. Планируется сделать доступ к такой функциональности из &lt;a href="http://www.lua.org/"&gt;Lua&lt;/a&gt; скриптов. В планах исправить ошибки с реализацией треков камеры. Движок может записывать треки камеры в заданный файл, запуская отдельный поток, происходит это в специальном режиме, включаемой командой консоли. Готовые треки камеры можно задавать в уровне или грузить на лету. Пускать текущую камеру по заданному треку, пока что можно с помощью консольной команды.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4338251266540090894-8082229956570538352?l=andreyogl-d3d.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreyogl-d3d.blogspot.com/feeds/8082229956570538352/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4338251266540090894&amp;postID=8082229956570538352' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/8082229956570538352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/8082229956570538352'/><link rel='alternate' type='text/html' href='http://andreyogl-d3d.blogspot.com/2009/07/blog-post.html' title='Различные доработки.'/><author><name>Andrey</name><uri>http://www.blogger.com/profile/16201443526225351421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_JwI00ZTPVto/S-HWkBK2ZJI/AAAAAAAAAJ4/hJhI6NBcUgA/S220/IMG_0423_!.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4338251266540090894.post-4506777637426451100</id><published>2009-05-02T01:54:00.000-07:00</published><updated>2010-01-25T13:45:30.250-08:00</updated><title type='text'>FastArray</title><content type='html'>Сейчас очень много сделано в движке. Есть некоторые недоделанные реализации чего либо.&lt;br /&gt;К примеру &lt;span id="SPELLING_ERROR_0"&gt;Hierarchy&lt;/span&gt; &lt;span id="SPELLING_ERROR_1"&gt;Occlusion&lt;/span&gt; &lt;span id="SPELLING_ERROR_2"&gt;Culling&lt;/span&gt;, обход &lt;span id="SPELLING_ERROR_3"&gt;SceneGraph&lt;/span&gt; для поиска объектов являющихся &lt;span id="SPELLING_ERROR_4"&gt;RenderTarget&lt;/span&gt;'&lt;span id="SPELLING_ERROR_5"&gt;ами&lt;/span&gt; вода, зеркала и т.д. Постепенно проводиться оптимизация движка. В частности замер &lt;span id="SPELLING_ERROR_6"&gt;профайлером&lt;/span&gt; работу отдельных функций.  На данный момент есть частое добавление объектов в динамический  массив в каждом кадре. Как для от рисовки в текстуру теней так и для поиска видимых объектов. Для этого использовался ранее обычный &lt;span id="SPELLING_ERROR_7"&gt;std&lt;/span&gt;::&lt;span id="SPELLING_ERROR_8"&gt;vector&lt;/span&gt; с заранее вызванным &lt;span id="SPELLING_ERROR_9"&gt;std&lt;/span&gt;::&lt;span id="SPELLING_ERROR_10"&gt;vector&lt;/span&gt;::&lt;span id="SPELLING_ERROR_11"&gt;reserve&lt;/span&gt;. Почитав пост известного всем &lt;span style="font-weight: bold;"&gt;&lt;span id="SPELLING_ERROR_12"&gt;IronPeter&lt;/span&gt;&lt;/span&gt;'а &lt;a href="http://blog.gamedeff.com/?p=104"&gt;Банановые шкурки&lt;/a&gt;, я подумал что сам метод &lt;span id="SPELLING_ERROR_13"&gt;std&lt;/span&gt;::&lt;span id="SPELLING_ERROR_14"&gt;vector&lt;/span&gt;::&lt;span id="SPELLING_ERROR_15"&gt;push&lt;/span&gt;_&lt;span id="SPELLING_ERROR_16"&gt;back&lt;/span&gt; уж очень универсален, там есть проверка на текущий размер с выделением памяти при необходимости и много других вызовов. К примеру &lt;span id="SPELLING_ERROR_17"&gt;std&lt;/span&gt;::&lt;span id="SPELLING_ERROR_18"&gt;vector&lt;/span&gt;::&lt;span id="SPELLING_ERROR_19"&gt;operator&lt;/span&gt; [] очень быстрый, но лишен универсальности, к примеру проверка выхода за диапазон, для этого есть &lt;span id="SPELLING_ERROR_20"&gt;std&lt;/span&gt;::&lt;span id="SPELLING_ERROR_21"&gt;vector&lt;/span&gt;::&lt;span id="SPELLING_ERROR_22"&gt;at&lt;/span&gt;.  Иногда возникает вопрос, почему разработчик &lt;span id="SPELLING_ERROR_23"&gt;STL&lt;/span&gt; &lt;a href="http://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B5%D0%BF%D0%B0%D0%BD%D0%BE%D0%B2,_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%BE%D0%B2%D0%B8%D1%87"&gt;Александр Степанов&lt;/a&gt; не добавил быструю реализацию &lt;span id="SPELLING_ERROR_24"&gt;push&lt;/span&gt;_&lt;span id="SPELLING_ERROR_25"&gt;back&lt;/span&gt;, назвав ее к примеру &lt;span id="SPELLING_ERROR_26"&gt;fast&lt;/span&gt;_&lt;span id="SPELLING_ERROR_27"&gt;push&lt;/span&gt;_&lt;span id="SPELLING_ERROR_28"&gt;back&lt;/span&gt;?&lt;br /&gt;Для некоторых частных специфических &lt;span id="SPELLING_ERROR_29"&gt;задач&lt;/span&gt;, требующих минимальной загрузки &lt;span id="SPELLING_ERROR_30"&gt;CPU,&lt;/span&gt; проверять выход за пределы не нужно вообще, к примеру как в этом случае - быстрое добавление данных с инкрементом указателя, который смещается к концу масса, причем размер массива уже известен.&lt;br /&gt;Поэтому я написал свою довольно простую реализацию &lt;span id="SPELLING_ERROR_31"&gt;FastArray&lt;/span&gt; унаследовав с защищенным доступом от &lt;span id="SPELLING_ERROR_32"&gt;std&lt;/span&gt;::&lt;span id="SPELLING_ERROR_33"&gt;vector&lt;/span&gt;. Реализация выглядит так:&lt;br /&gt;&lt;br /&gt;&lt;table width = "100%" bgcolor="#f4f4f4"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;font color="white"&gt;&lt;br /&gt;&lt;font color="#660000" &gt;#ifndef&lt;/font&gt; &lt;font color="#000000" &gt;__FASTARRAY_H__&lt;/font&gt;&lt;br /&gt;&lt;font color="#660000" &gt;#define&lt;/font&gt; &lt;font color="#000000" &gt;__FASTARRAY_H__&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#660000" &gt;#include&lt;/font&gt; &lt;font color="#006666" &gt;"exceptions.h"&lt;/font&gt;&lt;br /&gt;&lt;font color="#660000" &gt;#include&lt;/font&gt; &lt;font color="#006666" &gt;&amp;lt;cassert&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#660000" &gt;#include&lt;/font&gt; &lt;font color="#006666" &gt;&amp;lt;vector&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;font color="#008800" &gt;// Fast Dynamic Array&lt;/font&gt;&lt;/i&gt;&lt;br /&gt;&lt;b&gt;&lt;font color="#0000ff" &gt;template&lt;/font&gt;&lt;/b&gt;&lt;font color="#000099" &gt;&amp;lt;&lt;/font&gt;&lt;b&gt;&lt;font color="#0000ff" &gt;typename&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;T&lt;/font&gt;&lt;font color="#000099" &gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;b&gt;&lt;font color="#0000ff" &gt;class&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;FastArray&lt;/font&gt; &lt;font color="#000099" &gt;:&lt;/font&gt; &lt;b&gt;&lt;font color="#0000ff" &gt;protected&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;std&lt;/font&gt;&lt;font color="#000099" &gt;::&lt;/font&gt;&lt;font color="#000000" &gt;vector&lt;/font&gt;&lt;font color="#000099" &gt;&amp;lt;&lt;/font&gt;&lt;font color="#000000" &gt;T&lt;/font&gt;&lt;font color="#000099" &gt;&amp;gt;&lt;/font&gt; &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;&lt;b&gt;&lt;font color="#0000ff" &gt;private&lt;/font&gt;&lt;/b&gt;&lt;font color="#000099" &gt;:&lt;/font&gt;&lt;br /&gt;  &lt;b&gt;&lt;font color="#0000ff" &gt;typedef&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;std&lt;/font&gt;&lt;font color="#000099" &gt;::&lt;/font&gt;&lt;font color="#000000" &gt;vector&lt;/font&gt;&lt;font color="#000099" &gt;&amp;lt;&lt;/font&gt;&lt;font color="#000000" &gt;T&lt;/font&gt;&lt;font color="#000099" &gt;&amp;gt;&lt;/font&gt; &lt;font color="#000000" &gt;BaseClass&lt;/font&gt;&lt;font color="#000099" &gt;;&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000000" &gt;T&lt;/font&gt;&lt;font color="#000099" &gt;*&lt;/font&gt; &lt;font color="#000000" &gt;last&lt;/font&gt;&lt;font color="#000099" &gt;;&lt;/font&gt;&lt;br /&gt;&lt;b&gt;&lt;font color="#0000ff" &gt;public&lt;/font&gt;&lt;/b&gt;&lt;font color="#000099" &gt;:&lt;/font&gt;&lt;br /&gt;  &lt;b&gt;&lt;font color="#0000ff" &gt;typedef&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;T&lt;/font&gt;&lt;font color="#000099" &gt;*&lt;/font&gt; &lt;font color="#000000" &gt;iterator&lt;/font&gt;&lt;font color="#000099" &gt;;&lt;/font&gt;&lt;br /&gt;  &lt;b&gt;&lt;font color="#0000ff" &gt;typedef&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color="#0000ff" &gt;const&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;T&lt;/font&gt;&lt;font color="#000099" &gt;*&lt;/font&gt; &lt;font color="#000000" &gt;const_iterator&lt;/font&gt;&lt;font color="#000099" &gt;;&lt;/font&gt;&lt;br /&gt;  &lt;b&gt;&lt;font color="#0000ff" &gt;void&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;resize&lt;/font&gt;&lt;font color="#000099" &gt;(&lt;/font&gt;&lt;font color="#000000" &gt;size_t&lt;/font&gt; &lt;font color="#000000" &gt;count&lt;/font&gt;&lt;font color="#000099" &gt;)&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;BaseClass&lt;/font&gt;&lt;font color="#000099" &gt;::&lt;/font&gt;&lt;font color="#000000" &gt;resize&lt;/font&gt;&lt;font color="#000099" &gt;(&lt;/font&gt;&lt;font color="#000000" &gt;count&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;last&lt;/font&gt; &lt;font color="#000099" &gt;=&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;*&lt;/font&gt;&lt;font color="#000000" &gt;BaseClass&lt;/font&gt;&lt;font color="#000099" &gt;::&lt;/font&gt;&lt;font color="#000000" &gt;end&lt;/font&gt;&lt;font color="#000099" &gt;();&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;b&gt;&lt;font color="#0000ff" &gt;void&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;reserve&lt;/font&gt;&lt;font color="#000099" &gt;(&lt;/font&gt;&lt;font color="#000000" &gt;size_t&lt;/font&gt; &lt;font color="#000000" &gt;count&lt;/font&gt;&lt;font color="#000099" &gt;)&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;BaseClass&lt;/font&gt;&lt;font color="#000099" &gt;::&lt;/font&gt;&lt;font color="#000000" &gt;reserve&lt;/font&gt;&lt;font color="#000099" &gt;(&lt;/font&gt;&lt;font color="#000000" &gt;count&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;last&lt;/font&gt; &lt;font color="#000099" &gt;=&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;*&lt;/font&gt;&lt;font color="#000000" &gt;BaseClass&lt;/font&gt;&lt;font color="#000099" &gt;::&lt;/font&gt;&lt;font color="#000000" &gt;end&lt;/font&gt;&lt;font color="#000099" &gt;();&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000000" &gt;const_iterator&lt;/font&gt; &lt;font color="#000000" &gt;end&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;b&gt;&lt;font color="#0000ff" &gt;const&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000ff" &gt;return&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;last&lt;/font&gt;&lt;font color="#000099" &gt;;&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000000" &gt;iterator&lt;/font&gt; &lt;font color="#000000" &gt;end&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000ff" &gt;return&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;last&lt;/font&gt;&lt;font color="#000099" &gt;;&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000000" &gt;const_iterator&lt;/font&gt; &lt;font color="#000000" &gt;begin&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;b&gt;&lt;font color="#0000ff" &gt;const&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000ff" &gt;return&lt;/font&gt;&lt;/b&gt; &lt;font color="#000099" &gt;&amp;amp;*&lt;/font&gt;&lt;font color="#000000" &gt;BaseClass&lt;/font&gt;&lt;font color="#000099" &gt;::&lt;/font&gt;&lt;font color="#000000" &gt;begin&lt;/font&gt;&lt;font color="#000099" &gt;();&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000000" &gt;iterator&lt;/font&gt; &lt;font color="#000000" &gt;begin&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;   &lt;br /&gt;    &lt;b&gt;&lt;font color="#0000ff" &gt;return&lt;/font&gt;&lt;/b&gt; &lt;font color="#000099" &gt;&amp;amp;*&lt;/font&gt;&lt;font color="#000000" &gt;BaseClass&lt;/font&gt;&lt;font color="#000099" &gt;::&lt;/font&gt;&lt;font color="#000000" &gt;begin&lt;/font&gt;&lt;font color="#000099" &gt;();&lt;/font&gt;  &lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000000" &gt;T&lt;/font&gt;&lt;font color="#000099" &gt;&amp;amp;&lt;/font&gt; &lt;font color="#000000" &gt;back&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;assert&lt;/font&gt;&lt;font color="#000099" &gt;(&lt;/font&gt;&lt;font color="#000000" &gt;last&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;&amp;amp;&lt;/font&gt; &lt;font color="#006666" &gt;"NULL Pointer"&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;assert&lt;/font&gt;&lt;font color="#000099" &gt;(!&lt;/font&gt;&lt;font color="#000000" &gt;empty&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;&amp;amp;&lt;/font&gt; &lt;font color="#006666" &gt;"Empty Array"&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000ff" &gt;return&lt;/font&gt;&lt;/b&gt; &lt;font color="#000099" &gt;*(&lt;/font&gt;&lt;font color="#000000" &gt;last&lt;/font&gt; &lt;font color="#000099" &gt;-&lt;/font&gt; &lt;font color="#ff0000" &gt;1&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;b&gt;&lt;font color="#0000ff" &gt;const&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;T&lt;/font&gt;&lt;font color="#000099" &gt;&amp;amp;&lt;/font&gt; &lt;font color="#000000" &gt;back&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;b&gt;&lt;font color="#0000ff" &gt;const&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;assert&lt;/font&gt;&lt;font color="#000099" &gt;(&lt;/font&gt;&lt;font color="#000000" &gt;last&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;&amp;amp;&lt;/font&gt; &lt;font color="#006666" &gt;"NULL Pointer"&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;assert&lt;/font&gt;&lt;font color="#000099" &gt;(!&lt;/font&gt;&lt;font color="#000000" &gt;empty&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;&amp;amp;&lt;/font&gt; &lt;font color="#006666" &gt;"Empty Array"&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000ff" &gt;return&lt;/font&gt;&lt;/b&gt; &lt;font color="#000099" &gt;*(&lt;/font&gt;&lt;font color="#000000" &gt;last&lt;/font&gt; &lt;font color="#000099" &gt;-&lt;/font&gt; &lt;font color="#ff0000" &gt;1&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000000" &gt;T&lt;/font&gt;&lt;font color="#000099" &gt;&amp;amp;&lt;/font&gt; &lt;font color="#000000" &gt;front&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;assert&lt;/font&gt;&lt;font color="#000099" &gt;(!&lt;/font&gt;&lt;font color="#000000" &gt;empty&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;&amp;amp;&lt;/font&gt; &lt;font color="#006666" &gt;"Empty Array"&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;BaseClass&lt;/font&gt;&lt;font color="#000099" &gt;::&lt;/font&gt;&lt;font color="#000000" &gt;front&lt;/font&gt;&lt;font color="#000099" &gt;();&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;b&gt;&lt;font color="#0000ff" &gt;const&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;T&lt;/font&gt;&lt;font color="#000099" &gt;&amp;amp;&lt;/font&gt; &lt;font color="#000000" &gt;front&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;b&gt;&lt;font color="#0000ff" &gt;const&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;assert&lt;/font&gt;&lt;font color="#000099" &gt;(!&lt;/font&gt;&lt;font color="#000000" &gt;empty&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;&amp;amp;&lt;/font&gt; &lt;font color="#006666" &gt;"Empty Array"&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000ff" &gt;return&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;BaseClass&lt;/font&gt;&lt;font color="#000099" &gt;::&lt;/font&gt;&lt;font color="#000000" &gt;front&lt;/font&gt;&lt;font color="#000099" &gt;();&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;b&gt;&lt;font color="#0000ff" &gt;bool&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;empty&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;b&gt;&lt;font color="#0000ff" &gt;const&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000ff" &gt;return&lt;/font&gt;&lt;/b&gt; &lt;font color="#000099" &gt;&amp;amp;&lt;/font&gt;&lt;font color="#000000" &gt;BaseClass&lt;/font&gt;&lt;font color="#000099" &gt;::&lt;/font&gt;&lt;font color="#000000" &gt;front&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;font color="#000099" &gt;==&lt;/font&gt; &lt;font color="#000000" &gt;last&lt;/font&gt;&lt;font color="#000099" &gt;;&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000000" &gt;size_t&lt;/font&gt; &lt;font color="#000000" &gt;size&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;b&gt;&lt;font color="#0000ff" &gt;const&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;assert&lt;/font&gt;&lt;font color="#000099" &gt;(&lt;/font&gt;&lt;font color="#000000" &gt;last&lt;/font&gt; &lt;font color="#000099" &gt;&amp;gt;=&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;*&lt;/font&gt;&lt;font color="#000000" &gt;begin&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;&amp;amp;&lt;/font&gt; &lt;font color="#006666" &gt;"Out of Range"&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000ff" &gt;return&lt;/font&gt;&lt;/b&gt; &lt;b&gt;&lt;font color="#0000ff" &gt;static_cast&lt;/font&gt;&lt;/b&gt;&lt;font color="#000099" &gt;&amp;lt;&lt;/font&gt;&lt;font color="#000000" &gt;size_t&lt;/font&gt;&lt;font color="#000099" &gt;&amp;gt;(&lt;/font&gt;&lt;font color="#000000" &gt;last&lt;/font&gt; &lt;font color="#000099" &gt;-&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;*&lt;/font&gt;&lt;font color="#000000" &gt;begin&lt;/font&gt;&lt;font color="#000099" &gt;());&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000000" &gt;size_t&lt;/font&gt; &lt;font color="#000000" &gt;capacity&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;b&gt;&lt;font color="#0000ff" &gt;const&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000ff" &gt;return&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;BaseClass&lt;/font&gt;&lt;font color="#000099" &gt;::&lt;/font&gt;&lt;font color="#000000" &gt;capacity&lt;/font&gt;&lt;font color="#000099" &gt;();&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;b&gt;&lt;font color="#0000ff" &gt;void&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;pop_back&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;assert&lt;/font&gt;&lt;font color="#000099" &gt;(&lt;/font&gt;&lt;font color="#000000" &gt;last&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;&amp;amp;&lt;/font&gt; &lt;font color="#006666" &gt;"NULL Pointer"&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;assert&lt;/font&gt;&lt;font color="#000099" &gt;(&lt;/font&gt;&lt;font color="#000000" &gt;last&lt;/font&gt; &lt;font color="#000099" &gt;&amp;gt;=&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;*&lt;/font&gt;&lt;font color="#000000" &gt;begin&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;&amp;amp;&lt;/font&gt; &lt;font color="#006666" &gt;"Out of Range"&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000099" &gt;--&lt;/font&gt;&lt;font color="#000000" &gt;last&lt;/font&gt;&lt;font color="#000099" &gt;;&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;b&gt;&lt;font color="#0000ff" &gt;void&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;push_back&lt;/font&gt;&lt;font color="#000099" &gt;(&lt;/font&gt;&lt;b&gt;&lt;font color="#0000ff" &gt;const&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;T&lt;/font&gt;&lt;font color="#000099" &gt;&amp;amp;&lt;/font&gt; &lt;font color="#000000" &gt;val&lt;/font&gt;&lt;font color="#000099" &gt;)&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;assert&lt;/font&gt;&lt;font color="#000099" &gt;(&lt;/font&gt;&lt;font color="#000000" &gt;last&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;&amp;amp;&lt;/font&gt; &lt;font color="#006666" &gt;"NULL Pointer"&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000099" &gt;*(&lt;/font&gt;&lt;font color="#000000" &gt;last&lt;/font&gt;&lt;font color="#000099" &gt;++)&lt;/font&gt; &lt;font color="#000099" &gt;=&lt;/font&gt; &lt;font color="#000000" &gt;val&lt;/font&gt;&lt;font color="#000099" &gt;;&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000000" &gt;T&lt;/font&gt;&lt;font color="#000099" &gt;&amp;amp;&lt;/font&gt; &lt;b&gt;&lt;font color="#0000ff" &gt;operator&lt;/font&gt;&lt;/b&gt; &lt;font color="#000099" &gt;[]&lt;/font&gt; &lt;font color="#000099" &gt;(&lt;/font&gt;&lt;font color="#000000" &gt;size_t&lt;/font&gt; &lt;font color="#000000" &gt;index&lt;/font&gt;&lt;font color="#000099" &gt;)&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;assert&lt;/font&gt;&lt;font color="#000099" &gt;(&amp;amp;*&lt;/font&gt;&lt;font color="#000000" &gt;begin&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;font color="#000099" &gt;+&lt;/font&gt; &lt;font color="#000000" &gt;index&lt;/font&gt; &lt;font color="#000099" &gt;&amp;lt;&lt;/font&gt; &lt;font color="#000000" &gt;last&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;&amp;amp;&lt;/font&gt; &lt;font color="#006666" &gt;"Out of Range"&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000ff" &gt;return&lt;/font&gt;&lt;/b&gt; &lt;font color="#000099" &gt;*(&lt;/font&gt;&lt;font color="#000000" &gt;begin&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;font color="#000099" &gt;+&lt;/font&gt; &lt;font color="#000000" &gt;index&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;b&gt;&lt;font color="#0000ff" &gt;const&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;T&lt;/font&gt;&lt;font color="#000099" &gt;&amp;amp;&lt;/font&gt; &lt;b&gt;&lt;font color="#0000ff" &gt;operator&lt;/font&gt;&lt;/b&gt; &lt;font color="#000099" &gt;[]&lt;/font&gt; &lt;font color="#000099" &gt;(&lt;/font&gt;&lt;font color="#000000" &gt;size_t&lt;/font&gt; &lt;font color="#000000" &gt;index&lt;/font&gt;&lt;font color="#000099" &gt;)&lt;/font&gt; &lt;b&gt;&lt;font color="#0000ff" &gt;const&lt;/font&gt;&lt;/b&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;assert&lt;/font&gt;&lt;font color="#000099" &gt;(&amp;amp;*&lt;/font&gt;&lt;font color="#000000" &gt;begin&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;font color="#000099" &gt;+&lt;/font&gt; &lt;font color="#000000" &gt;index&lt;/font&gt; &lt;font color="#000099" &gt;&amp;lt;&lt;/font&gt; &lt;font color="#000000" &gt;last&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;&amp;amp;&lt;/font&gt; &lt;font color="#006666" &gt;"Out of Range"&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;    &lt;b&gt;&lt;font color="#0000ff" &gt;return&lt;/font&gt;&lt;/b&gt; &lt;font color="#000099" &gt;*(&lt;/font&gt;&lt;font color="#000000" &gt;begin&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;font color="#000099" &gt;+&lt;/font&gt; &lt;font color="#000000" &gt;index&lt;/font&gt;&lt;font color="#000099" &gt;);&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;b&gt;&lt;font color="#0000ff" &gt;void&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;clear&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;font color="#000000" &gt;last&lt;/font&gt; &lt;font color="#000099" &gt;=&lt;/font&gt; &lt;font color="#000099" &gt;&amp;amp;*&lt;/font&gt;&lt;font color="#000000" &gt;begin&lt;/font&gt;&lt;font color="#000099" &gt;();&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000000" &gt;FastArray&lt;/font&gt;&lt;font color="#000099" &gt;(&lt;/font&gt;&lt;font color="#000000" &gt;size_t&lt;/font&gt; &lt;font color="#000000" &gt;count&lt;/font&gt;&lt;font color="#000099" &gt;,&lt;/font&gt; &lt;b&gt;&lt;font color="#0000ff" &gt;const&lt;/font&gt;&lt;/b&gt; &lt;font color="#000000" &gt;T&lt;/font&gt;&lt;font color="#000099" &gt;&amp;amp;&lt;/font&gt; &lt;font color="#000000" &gt;val&lt;/font&gt; &lt;font color="#000099" &gt;=&lt;/font&gt; &lt;font color="#000000" &gt;T&lt;/font&gt;&lt;font color="#000099" &gt;())&lt;/font&gt; &lt;font color="#000099" &gt;:&lt;/font&gt; &lt;font color="#000000" &gt;BaseClass&lt;/font&gt;&lt;font color="#000099" &gt;(&lt;/font&gt;&lt;font color="#000000" &gt;count&lt;/font&gt;&lt;font color="#000099" &gt;,&lt;/font&gt; &lt;font color="#000000" &gt;val&lt;/font&gt;&lt;font color="#000099" &gt;),&lt;/font&gt; &lt;br /&gt;                        &lt;font color="#000000" &gt;last&lt;/font&gt;&lt;font color="#000099" &gt;(&amp;amp;&lt;/font&gt;&lt;font color="#000000" &gt;BaseClass&lt;/font&gt;&lt;font color="#000099" &gt;::&lt;/font&gt;&lt;font color="#000000" &gt;back&lt;/font&gt;&lt;font color="#000099" &gt;())&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;    &lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000000" &gt;FastArray&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt; &lt;font color="#000099" &gt;:&lt;/font&gt; &lt;font color="#000000" &gt;last&lt;/font&gt;&lt;font color="#000099" &gt;(&amp;amp;&lt;/font&gt;&lt;font color="#000000" &gt;BaseClass&lt;/font&gt;&lt;font color="#000099" &gt;::&lt;/font&gt;&lt;font color="#000000" &gt;back&lt;/font&gt;&lt;font color="#000099" &gt;())&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;~&lt;/font&gt;&lt;font color="#000000" &gt;FastArray&lt;/font&gt;&lt;font color="#000099" &gt;()&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;{&lt;/font&gt;&lt;br /&gt;  &lt;font color="#000099" &gt;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#000099" &gt;};&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#660000" &gt;#endif&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Такая реализация обеспечивает быстрое добавление в конец и очистку массива, так-же работу с итераторами. Единственным минусом является небезопасное добавление, если число элементов превышает длину массива.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4338251266540090894-4506777637426451100?l=andreyogl-d3d.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreyogl-d3d.blogspot.com/feeds/4506777637426451100/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4338251266540090894&amp;postID=4506777637426451100' title='Комментарии: 9'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/4506777637426451100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/4506777637426451100'/><link rel='alternate' type='text/html' href='http://andreyogl-d3d.blogspot.com/2009/05/fastarray.html' title='FastArray'/><author><name>Andrey</name><uri>http://www.blogger.com/profile/16201443526225351421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_JwI00ZTPVto/S-HWkBK2ZJI/AAAAAAAAAJ4/hJhI6NBcUgA/S220/IMG_0423_!.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4338251266540090894.post-834770238724690488</id><published>2009-03-07T10:06:00.000-08:00</published><updated>2009-03-08T09:10:48.352-07:00</updated><title type='text'>Parallel Split Shadow Map тени.</title><content type='html'>Наконец Внедрил Parallel Split Shadow Map в движок. Реализация основана на демке &lt;a href="http://hax.fi/asko/PSSM.html"&gt;PSSM&lt;/a&gt;&lt;br /&gt;Разбиения рассчитаны по логарифмической схеме &lt;a href="http://appsrv.cse.cuhk.edu.hk/%7Efzhang/pssm_vrcia/keypoint1.htm"&gt;logarithmic split scheme&lt;/a&gt;.&lt;br /&gt;&lt;a href="http://hax.fi/asko/PSSM.html"&gt;&lt;/a&gt;Было несколько ошибок: Дикие растяжения теней проблема из-за неправильного построения Crop Matrix, проблемы с глубиной, исчезновение объектов и листьев ландшафта.&lt;br /&gt;Crop Matrix это некая матрица трансформации с масштабированием и смещением. Как раз она корректирует текущую матрицу проекции источника света подгоняя под ограничивающую область текущего сплита, для оптимального использования разрешения текстуры теней, избегая проблем алгоритма стандартных теней &lt;a href="http://www.gamedev.net/reference/programming/features/smaliasing/"&gt;Shadow Map Aliasin&lt;/a&gt;&lt;a href="http://www.gamedev.net/reference/programming/features/smaliasing/"&gt;g&lt;/a&gt;. Спасибо Арсению Капулкину(Zeux) за подсказку.&lt;br /&gt;Вторая проблема была связана с рисованием объектов через FFP(что я планирую исправить на шейдеры по умолчанию) в Direct3D9/OpenGL при выключении шейдера на большом расстоянии, я просто не учел матрицу проекции для текущего  split.&lt;br /&gt;Третья проблема тоже простая, для видимого объекта ставился флаг видимости, и если он виден в текущем разбиении н не виден в предыдущем или последующем флаг сбрасывался и объект не рисовался.&lt;br /&gt;Четвертая проблема еще проще, рисовался повторно ландшафт, затирая то, что уже отрисовано создавая эффект выпадания листьев.&lt;br /&gt;Приведу несколько удачных скриншотов показывающих разницу между Parallel Split Shadowm Map и Standart Shadow Map. Скриншоты сделаны в режиме Direct3D9 рендера.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;SSM&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_JwI00ZTPVto/SbLNVR2UHcI/AAAAAAAAAGY/9vKFcWwkwlM/s1600-h/ScreenShot9.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="http://2.bp.blogspot.com/_JwI00ZTPVto/SbLNVR2UHcI/AAAAAAAAAGY/9vKFcWwkwlM/s400/ScreenShot9.jpg" alt="" id="BLOGGER_PHOTO_ID_5310532676075396546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;PSSM&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JwI00ZTPVto/SbLNQSbHgkI/AAAAAAAAAGQ/D_6Uzw1tV2c/s1600-h/ScreenShot10.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="http://1.bp.blogspot.com/_JwI00ZTPVto/SbLNQSbHgkI/AAAAAAAAAGQ/D_6Uzw1tV2c/s400/ScreenShot10.jpg" alt="" id="BLOGGER_PHOTO_ID_5310532590330413634" border="0" /&gt;&lt;/a&gt;SSM&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_JwI00ZTPVto/SbLNJq8sVaI/AAAAAAAAAGI/h_oG_MeE8Xo/s1600-h/ScreenShot7.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="http://3.bp.blogspot.com/_JwI00ZTPVto/SbLNJq8sVaI/AAAAAAAAAGI/h_oG_MeE8Xo/s400/ScreenShot7.jpg" alt="" id="BLOGGER_PHOTO_ID_5310532476654605730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;PSSM&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JwI00ZTPVto/SbLNEDFf1jI/AAAAAAAAAGA/r-QFuhXUTqM/s1600-h/ScreenShot8.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="http://4.bp.blogspot.com/_JwI00ZTPVto/SbLNEDFf1jI/AAAAAAAAAGA/r-QFuhXUTqM/s400/ScreenShot8.jpg" alt="" id="BLOGGER_PHOTO_ID_5310532380054771250" border="0" /&gt;&lt;/a&gt;SSM&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JwI00ZTPVto/SbLM0VIqS4I/AAAAAAAAAFw/6wUb2aorAlM/s1600-h/ScreenShot5.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="http://4.bp.blogspot.com/_JwI00ZTPVto/SbLM0VIqS4I/AAAAAAAAAFw/6wUb2aorAlM/s400/ScreenShot5.jpg" alt="" id="BLOGGER_PHOTO_ID_5310532110021970818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;PSSM&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JwI00ZTPVto/SbLM65WtTxI/AAAAAAAAAF4/tJdmDe7HJbw/s1600-h/ScreenShot6.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="http://1.bp.blogspot.com/_JwI00ZTPVto/SbLM65WtTxI/AAAAAAAAAF4/tJdmDe7HJbw/s400/ScreenShot6.jpg" alt="" id="BLOGGER_PHOTO_ID_5310532222823780114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;SSM&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_JwI00ZTPVto/SbLNgomrQoI/AAAAAAAAAGg/TXeC0bUrghw/s1600-h/ScreenShot1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="http://2.bp.blogspot.com/_JwI00ZTPVto/SbLNgomrQoI/AAAAAAAAAGg/TXeC0bUrghw/s400/ScreenShot1.jpg" alt="" id="BLOGGER_PHOTO_ID_5310532871162380930" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;PSSM&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JwI00ZTPVto/SbLMigvde7I/AAAAAAAAAFo/J0VvyezA4XI/s1600-h/ScreenShot0.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="http://4.bp.blogspot.com/_JwI00ZTPVto/SbLMigvde7I/AAAAAAAAAFo/J0VvyezA4XI/s400/ScreenShot0.jpg" alt="" id="BLOGGER_PHOTO_ID_5310531803899853746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В процессе внедрения PSSM использовал подход в выставлении отладочного пиксельного шейдера, который выставляется для объектов текущего разбиения подсвечивая их красным цветом игнорируя текстуры и освещение. Спасибо Сергею Милойкову(Zemedelec) за предоставленный совет. Данная функциональность удобно включалась командой с консоли "debug_split i" - где i номер разбиения.&lt;br /&gt;"debug_split -1" - отключал отладку.&lt;br /&gt;Выглядит это вот так:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Split 0&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JwI00ZTPVto/SbLN5jnRh3I/AAAAAAAAAG4/g_4ulM28-LI/s1600-h/ScreenShot11.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="http://4.bp.blogspot.com/_JwI00ZTPVto/SbLN5jnRh3I/AAAAAAAAAG4/g_4ulM28-LI/s400/ScreenShot11.jpg" alt="" id="BLOGGER_PHOTO_ID_5310533299319441266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Split 1&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JwI00ZTPVto/SbLN2GY4CbI/AAAAAAAAAGw/Zgvxj4jaHms/s1600-h/ScreenShot12.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="http://1.bp.blogspot.com/_JwI00ZTPVto/SbLN2GY4CbI/AAAAAAAAAGw/Zgvxj4jaHms/s400/ScreenShot12.jpg" alt="" id="BLOGGER_PHOTO_ID_5310533239934814642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Split 2&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JwI00ZTPVto/SbLNyPmk2jI/AAAAAAAAAGo/6bmulF1IqBc/s1600-h/ScreenShot13.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 320px;" src="http://1.bp.blogspot.com/_JwI00ZTPVto/SbLNyPmk2jI/AAAAAAAAAGo/6bmulF1IqBc/s400/ScreenShot13.jpg" alt="" id="BLOGGER_PHOTO_ID_5310533173688719922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Как видно из отладки объекты могут рисоваться повторно если попали сразу в несколько разбиений, что подсаживает производительность. Над этом буду думать.&lt;br /&gt;В планах исправить небольшие недочеты в режиме теней PSSM, доработать реализацию под OpenGL, скорей всего там просто просто учесть порядок хранения матриц.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4338251266540090894-834770238724690488?l=andreyogl-d3d.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreyogl-d3d.blogspot.com/feeds/834770238724690488/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4338251266540090894&amp;postID=834770238724690488' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/834770238724690488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/834770238724690488'/><link rel='alternate' type='text/html' href='http://andreyogl-d3d.blogspot.com/2009/03/parallel-split-shadow-map.html' title='Parallel Split Shadow Map тени.'/><author><name>Andrey</name><uri>http://www.blogger.com/profile/16201443526225351421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_JwI00ZTPVto/S-HWkBK2ZJI/AAAAAAAAAJ4/hJhI6NBcUgA/S220/IMG_0423_!.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_JwI00ZTPVto/SbLNVR2UHcI/AAAAAAAAAGY/9vKFcWwkwlM/s72-c/ScreenShot9.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4338251266540090894.post-342891978667623834</id><published>2009-02-20T10:08:00.000-08:00</published><updated>2009-10-04T22:09:07.157-07:00</updated><title type='text'>Тени в OpenGL рендере. Прогресс и дальнейшие планы.</title><content type='html'>Сначала я сделал тени для Direct3D 9. Потом переделал для OpenGL. Тени работали, но отличались в OpenGL по сравнению Direct3D в худшую сторону. Эту задачу я отложил до лучших времен. Иногда к ней возвращался но так и не мог понять в чем дело. Реализация у меня была с использованием рендера в текстуру и с использованием расширений &lt;a href="http://www.opengl3.org/registry/specs/ARB/vertex_program.txt"&gt;GL_ARB_vertex_program&lt;/a&gt; и &lt;a href="http://opengl3.org/registry/specs/ARB/fragment_program.txt"&gt;GL_ARB_fragment_progra&lt;/a&gt;&lt;a href="http://opengl3.org/registry/specs/ARB/fragment_program.txt"&gt;m.&lt;/a&gt; (Код получен как результат компиляции Cg компилятором.)На данный момент частично используется GLSL полученный как результат компиляции из Cg.Сначала я думал что проблема в проблема была в использовании или инициализации рендера в текстуру с использованием &lt;a href="http://www.opengl3.org/registry/specs/EXT/framebuffer_object.txt"&gt;GL_EXT_frame_buffer_object&lt;/a&gt;  в связке с текстурами с плавающей точкой через расширение &lt;a href="http://opengl3.org/registry/specs/ARB/texture_float.txt"&gt;GL_ARB_texture_float&lt;/a&gt;. Но вскоре выяснилось что я немного неправильно построил матрицу источника света и матрицу текстуры. Теперь тень пиксель в пиксель совпадает с Direct3D.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;OpenGL:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JwI00ZTPVto/SZ8F3b2iDaI/AAAAAAAAACQ/go3SXE2tAlQ/s1600-h/ScreenShot9.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 256px;" src="http://1.bp.blogspot.com/_JwI00ZTPVto/SZ8F3b2iDaI/AAAAAAAAACQ/go3SXE2tAlQ/s320/ScreenShot9.jpg" alt="" id="BLOGGER_PHOTO_ID_5304965335993159074" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Direct3D:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_JwI00ZTPVto/SZ8FXL4QU_I/AAAAAAAAACI/L1tQIPvfidY/s1600-h/ScreenShot7.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 256px;" src="http://2.bp.blogspot.com/_JwI00ZTPVto/SZ8FXL4QU_I/AAAAAAAAACI/L1tQIPvfidY/s320/ScreenShot7.jpg" alt="" id="BLOGGER_PHOTO_ID_5304964781949604850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;В общем я решил пока не удалять OpenGL рендер из движка. Не так все плохо. Но еще есть проблемы на ATI.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;На данный момент добавил рендер всей сцены в глубину. Результат сохраняется в float текстуру. Используя это эту возможность  расширил в связи с этим менеджер постропцессинга, который может использовать эту текстуру. К примеру к примеру на основании этого реализовал эффект постпроцессинга Dof - &lt;a href="http://en.wikipedia.org/wiki/Depth_of_field"&gt;Depth of Filed&lt;/a&gt;. Спасибо за переработанный шейдер из различных SDK Глебу Гущину(innuendo), а помощь в исправлении расчета преобразования глубины Арсению Капулкину(Zeux).&lt;br /&gt;На данный момент идет улучшение теней с использованием алгоритма&lt;br /&gt;&lt;a href="http://appsrv.cse.cuhk.edu.hk/%7Efzhang/pssm_vrcia/"&gt;Parallel Split Shadow Map&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;В дальнейших планах исправление ошибок. Сейчас их накопилось много. Есть серьезные, а есть просто много мелочей. Параллельно буду писать редактор. Пусть пока простой - расстановка объектов, cохранение и загрузка.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4338251266540090894-342891978667623834?l=andreyogl-d3d.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreyogl-d3d.blogspot.com/feeds/342891978667623834/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4338251266540090894&amp;postID=342891978667623834' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/342891978667623834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/342891978667623834'/><link rel='alternate' type='text/html' href='http://andreyogl-d3d.blogspot.com/2009/02/opengl.html' title='Тени в OpenGL рендере. Прогресс и дальнейшие планы.'/><author><name>Andrey</name><uri>http://www.blogger.com/profile/16201443526225351421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_JwI00ZTPVto/S-HWkBK2ZJI/AAAAAAAAAJ4/hJhI6NBcUgA/S220/IMG_0423_!.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_JwI00ZTPVto/SZ8F3b2iDaI/AAAAAAAAACQ/go3SXE2tAlQ/s72-c/ScreenShot9.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4338251266540090894.post-3158779375055640015</id><published>2009-01-17T10:54:00.000-08:00</published><updated>2009-10-01T05:57:20.755-07:00</updated><title type='text'>Передача констант в шейдеры.</title><content type='html'>Всем известно что передавать константы лучше все сразу, а не по отдельности, либо минимизировать эти вызовы.&lt;br /&gt;Достичь это можно несколькими путями и по разному для каждого API. Опишу отдельно для Direct3D9, Direct3D10, OpenGL.&lt;br /&gt;Для Direct3D9 лучше Не использовать ID3DXEffect для шейдеров, не использовать ID3DXConstantTable для установки констант. Они не несомненно удобны но не очень быстрые в работе. Почему сейчас расскажу.&lt;br /&gt;Возьмем любой метод ID3DXEffect/ID3DXConstantTable  для установки констант. Все они имеют параметр D3DXHANDLE - это либо строка либо указатель возвращаемый&lt;br /&gt;другими методами. Напрашивается вопрос как значение этого параметра внутри распознается. Внутри это может быть либо свой указатель либо строка с именем константы.&lt;br /&gt;Что конкретно определяется проверкой установленного старшего бита параметра, если установлен то HANDLE, если нет то строка. Таким образом, мы имеем некие потери при установки константы. При чем внутри таких вызовов будут еще и проверки. Если это строка то будет поиск по строке, пусть даже через Hash. В случае с указателем чуть быстрее. Итого, представив много шейдера на сложной сцене, с большим числом констант, которые еще что хуже всего передаются по имени через строку.&lt;br /&gt;В данных интерфейсах есть средства для засылки констант группой, за справкой отсылаю к DirectX SDK. Но нет средств что-бы заслать все константы для всего шейдера разом, что по идее должно быть идеально. Что бы слать все, лучше использовать напрямую интерфейсы IDirect3DPixelShader9/IDirect3DVeretxShader9 и использовать методы:&lt;br /&gt;IDirect3DDevice9::SetPixelShaderConstant*/IDirect3DDevice9::SetVertexShaderConstant*&lt;br /&gt;при таком подходе можно заслать единообразно все константы определенного типа за 1 вызов начиная со стартового регистра. Причем ID3DXConstantTable/ID3DXEffect  являются wrapper'ами над этими методами.&lt;br /&gt;Для Direct3D10 все намного проще. Есть константные буферы которые и предназначены для передачи группы констант. Кроме того данная функциональность есть в ID3D10Effect  интерфейсе.&lt;br /&gt;К сожалению в OpenGL с этим немного похуже ситуация. В расширениях &lt;a href="http://www.opengl.org/registry/specs/ARB/fragment_program.txt"&gt;GL_ARB_fragment_program&lt;/a&gt;/&lt;a href="http://www.opengl.org/registry/specs/ARB/vertex_program.txt"&gt;GL_ARB_vertex_program&lt;/a&gt; есть функция glProgramLocalParameter4fvARB, но она не позволяет слать больше 4 float(1 регистр).&lt;br /&gt;Можно использовать для матриц константы GL_MATRIX0_ARB - GL_MATRIX31_ARB&lt;br /&gt;и передавать через glMatrixMode это чуть улучшает ситуацию. Недавно я использовал новое расшерение &lt;a href="http://opengl.org/registry/specs/EXT/gpu_program_parameters.txt"&gt;GL_EXT_gpu_program_parameters&lt;/a&gt; оно позовляет засылать константы пачками. Причем это прямой аналог передачи констант для Direct3D9. Радует поддержка расширения на ATI.&lt;br /&gt;Для GLSL передавать все константы для шейдера за 1 вызов не получится. Потому что нет у порядочности хранения uniform переменных. И функции для передачи параметров могут передавать либо матрицу либо vector4 и т.д. Можно передать матрицы 1 вызовом но их нужно хранить в массиве. Но с появлением расширения &lt;a href="http://www.opengl.org/registry/specs/EXT/bindable_uniform.txt"&gt;GL_EXT_bindable_uniform&lt;/a&gt; ситуация улучшилась но оно поддерживается пока только nVidia картами.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4338251266540090894-3158779375055640015?l=andreyogl-d3d.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreyogl-d3d.blogspot.com/feeds/3158779375055640015/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4338251266540090894&amp;postID=3158779375055640015' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/3158779375055640015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/3158779375055640015'/><link rel='alternate' type='text/html' href='http://andreyogl-d3d.blogspot.com/2009/01/blog-post.html' title='Передача констант в шейдеры.'/><author><name>Andrey</name><uri>http://www.blogger.com/profile/16201443526225351421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_JwI00ZTPVto/S-HWkBK2ZJI/AAAAAAAAAJ4/hJhI6NBcUgA/S220/IMG_0423_!.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4338251266540090894.post-8763790567548838951</id><published>2008-11-13T13:51:00.000-08:00</published><updated>2008-11-13T14:19:18.071-08:00</updated><title type='text'>Lod'ы шейдеров в Direct3D10 и отсутствие FFP</title><content type='html'>Привел от рисовку объектов при Direct3D10 рендере в порядок. Теперь они не исчезают при большом расстоянии от камеры.&lt;br /&gt;В движке есть понятие Lod для шейдеров. С каким-то шагом можно задавать более сложные шейдеры для объектов. Это дает прирост производительность на старом железе(а может и на новом). К примеру возьмём дерево, которое анимируется на ветру вершинным шейдером, в шейдере есть тригонометрическая функция для нее генерируется достаточно много инструкций, очевидно дерево можно не анимировать с очень большого расстояния, в этом случае включится простой шейдер, просто трансформирующий вершину. Другой пример - нет смысла делать эффект бампа и освещения на большом расстоняии - можно ограничится диффузионным освещением или вообще без него. Конечно переключение возможно будет заметно.  Аналогичная ситуация с анимацией травы. Можно сделать лоды для скелетной анимации. Но там более сложные параметры.&lt;br /&gt;В случае OpenGL/Direct3D9, если не будет найден подходящий лод, то будет выставлены NULL шейдеры, т.к. для них есть фиксированный конвейер то можно вызвать IDirect3DDevice9::SetTransform(world) и glLoadMatrixf(worldViewMatrix). Для Direct3D10 в этом случае не будет ничего рисоваться. Я решил эту проблему таким образом. Для каждого формата вершин создал список шейдеров по умолчанию. В случае выставления NULL шейдера, будет браться шейдер по умолчанию, если есть вершинный буфер.&lt;br /&gt;Это простое и удобное решение. Не нужно дополнительных шейдеров, тем более шейдера по умолчанию простые и короткие, поэтому их код хранится прямо в реализации класса рендера движка. Для шейдеров с альфа тестом, есть дополнительный список шейдеров по умолчанию для каждого формата, само собой с параметром - текущий AlphaRef, тут имеется ввиду значение, передаваемое в IDirect3DDevice9::SetRenderState(D3DRS_ALPHAREF, AlphaRef) в Direct3D9 и в  glAlphaFunc(func, AlphaRef) в OpenGL. В Direct3D10 убран альфа тест из FFP, поэтому нужен такой параметр по которому делается discard.&lt;br /&gt;Таким образом объекты перестали исчезать.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4338251266540090894-8763790567548838951?l=andreyogl-d3d.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreyogl-d3d.blogspot.com/feeds/8763790567548838951/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4338251266540090894&amp;postID=8763790567548838951' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/8763790567548838951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/8763790567548838951'/><link rel='alternate' type='text/html' href='http://andreyogl-d3d.blogspot.com/2008/11/lod-direct3d10-ffp.html' title='Lod&apos;ы шейдеров в Direct3D10 и отсутствие FFP'/><author><name>Andrey</name><uri>http://www.blogger.com/profile/16201443526225351421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_JwI00ZTPVto/S-HWkBK2ZJI/AAAAAAAAAJ4/hJhI6NBcUgA/S220/IMG_0423_!.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4338251266540090894.post-9132029861145437950</id><published>2008-11-10T22:18:00.000-08:00</published><updated>2008-11-10T23:24:07.683-08:00</updated><title type='text'>Добавлен встроенный профайл</title><content type='html'>Добавил в движок встроенный профайл. По очень простой схеме,&lt;br /&gt;некий класс содержащий данные о текущей строке имени файла и имени функции. Этот класс имеет конструктор с такими параметрами. С помощью макроса&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;#define PROFILE Profile::ProfileData data(__FILE__, __LINE__, __FUNCTION__);&lt;/span&gt;&lt;br /&gt;можно в начале любой функции добавлять отсчёт времени. В конструкторе запоминается стартовое время работы. В деструкторе формируется строка в виде "File, line, function, time"&lt;br /&gt;и рассчитывается время работы функции,  данные добавляются с список. Все банально и просто. Нужно ещё решить как-то проблему мигания значение цифр, что происходит из-за разброса  значений времени.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4338251266540090894-9132029861145437950?l=andreyogl-d3d.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreyogl-d3d.blogspot.com/feeds/9132029861145437950/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4338251266540090894&amp;postID=9132029861145437950' title='Комментарии: 12'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/9132029861145437950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/9132029861145437950'/><link rel='alternate' type='text/html' href='http://andreyogl-d3d.blogspot.com/2008/11/blog-post_10.html' title='Добавлен встроенный профайл'/><author><name>Andrey</name><uri>http://www.blogger.com/profile/16201443526225351421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_JwI00ZTPVto/S-HWkBK2ZJI/AAAAAAAAAJ4/hJhI6NBcUgA/S220/IMG_0423_!.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4338251266540090894.post-8885894363981739078</id><published>2008-11-06T12:34:00.000-08:00</published><updated>2008-11-06T13:05:20.086-08:00</updated><title type='text'>Объединение одинаковых пересекающихся объектов на сцене.</title><content type='html'>При сильно загруженной сцене бывает очень много вызовов от рисовок геометрии, всем известными под названием DIP (IDirect3DDevice9::DrawIndexedPrimitive для Direct3D9, glDrawElements для OpenGL и ID3D10Device::DrawIndexed для Direct3D10). Большое количество таких вызовов может нанести серьезный удар по быстродействию рендера, особенно это более актуально для Direct3D 9, именно в в момент вызова идет проверка на валидность пиксельного и вершинного шейдера, правильная линовка данных передаваемых из вершинного в пиксельный, проверка вершинных деклараций на соответствие того что использует вершинный шейдер и что находится в вершинном буфере, так-же индексы вершин и остальные параметры.  В OpenGL все намного проще, после выполнения каждой функции может возникнуть ошибка. Таким образов время как-бы равномерно распределяется между всеми вызовами функция перед вызовом от рисовки.&lt;br /&gt;Ну в Direct3D 10 DIP cost значительно снижен.&lt;br /&gt;Так-же частые вызовы может серьёзно нагрузить CPU по вызовам функций. Обычно до 1000 DIP на кадр ещё не все так плохо.&lt;br /&gt;Итак при загрузки сцены я сделал некую простейшую оптимизацию, ищем объекты с одинаковы мешами и если они пересекаются своими ограничивающими боксами, собираем их в 1 мешь с учтя матрицу трансформации. Что это дает?&lt;br /&gt;1) уменьшение нагрузки на CPU при обходе Scene Graph и при сортировке объектов;&lt;br /&gt;2) уменьшение DIP cost при отриcовке в Depth текстуру для теней;&lt;br /&gt;3) уменьшение DIP cost при финальной от рисовке объектов;&lt;br /&gt;Минусы в том что будет небольшой перерасход памяти. Но если к примеру у меня на сцене дерево ели имеет 350 полигонов и их несколько сотен, то объедение по 3-4 в 1 мешь будут значительно сокращать DIP cost. Пока тесты особых положительных результатов не дали но число DIP и число объектов в кадре значительно сокращены в грубом приближении на 30% в среднем. Повышение FPS вроде не более 10%. Буду тестировать на более слабом железе. На будущее конечно нужно подумать об использовании Instansing'а. Железо сейчас c такой функциональностью уже достаточно доступно и инстансинг есть уже в 3 API в том числе и поддержка у ATI для OpenGL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4338251266540090894-8885894363981739078?l=andreyogl-d3d.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreyogl-d3d.blogspot.com/feeds/8885894363981739078/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4338251266540090894&amp;postID=8885894363981739078' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/8885894363981739078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/8885894363981739078'/><link rel='alternate' type='text/html' href='http://andreyogl-d3d.blogspot.com/2008/11/blog-post.html' title='Объединение одинаковых пересекающихся объектов на сцене.'/><author><name>Andrey</name><uri>http://www.blogger.com/profile/16201443526225351421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_JwI00ZTPVto/S-HWkBK2ZJI/AAAAAAAAAJ4/hJhI6NBcUgA/S220/IMG_0423_!.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4338251266540090894.post-7360988495131671972</id><published>2008-10-31T12:59:00.000-07:00</published><updated>2008-10-31T14:09:15.290-07:00</updated><title type='text'>Подгонка шейдеров под все графические API</title><content type='html'>Пока Direct3D10 рендер ещё сырой, иногда возвращаюсь к нему и постепенно дописываю.&lt;br /&gt;Cейчас избавился в движке от OpenGL state(передаю матрицы трансформаций напрямую) .&lt;br /&gt;Когда он был заменял макросы на соответствующие параметры при компиляции из Cg в GL_ARB_vertex_program. Код GLSL полученный из Cg не содержит GL state - видно nVidia сразу продумала это на будущее как deprecated функциональность.&lt;br /&gt;При использовании этих макросов компилятор HLSL для Direct3D10 почему-то неверно распределял регистры в отличие от компилятора HLSL Direct3D9. Я пока не стал разбираться с этим, а временно скинул и переписал шейдеры специально для Direct3D10. Немного переписав шейдеры и добавив системный макрос D3D10 я избавился отлишней папки с шейдерами для Direct3D10.Настало время разобраться с использованием Cg для Direct3D10.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4338251266540090894-7360988495131671972?l=andreyogl-d3d.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreyogl-d3d.blogspot.com/feeds/7360988495131671972/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4338251266540090894&amp;postID=7360988495131671972' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/7360988495131671972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/7360988495131671972'/><link rel='alternate' type='text/html' href='http://andreyogl-d3d.blogspot.com/2008/10/api.html' title='Подгонка шейдеров под все графические API'/><author><name>Andrey</name><uri>http://www.blogger.com/profile/16201443526225351421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_JwI00ZTPVto/S-HWkBK2ZJI/AAAAAAAAAJ4/hJhI6NBcUgA/S220/IMG_0423_!.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4338251266540090894.post-7649620025883230393</id><published>2008-10-22T21:55:00.000-07:00</published><updated>2008-10-22T22:13:51.642-07:00</updated><title type='text'>Добавлена оптимизация перемножения матриц через SSE</title><content type='html'>Добавил в движок поддержку SSE в частности для перемножения матриц 4x4, 4x3. Написал аллокатор для STL std::vector выделяющий память, выровненную по границе 16 байт. Используются функции _aligned_malloc,_aligned_free.  Большое спасибо Арсению Капулкину(Zeux) за исправленный код.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4338251266540090894-7649620025883230393?l=andreyogl-d3d.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreyogl-d3d.blogspot.com/feeds/7649620025883230393/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4338251266540090894&amp;postID=7649620025883230393' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/7649620025883230393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/7649620025883230393'/><link rel='alternate' type='text/html' href='http://andreyogl-d3d.blogspot.com/2008/10/sse.html' title='Добавлена оптимизация перемножения матриц через SSE'/><author><name>Andrey</name><uri>http://www.blogger.com/profile/16201443526225351421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_JwI00ZTPVto/S-HWkBK2ZJI/AAAAAAAAAJ4/hJhI6NBcUgA/S220/IMG_0423_!.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4338251266540090894.post-289843050129407235</id><published>2008-10-03T14:43:00.000-07:00</published><updated>2010-01-21T22:30:13.673-08:00</updated><title type='text'>Разработка 3D движка</title><content type='html'>Итак, постепенно сюда буду писать прогресс разработки собственного трехмерного движка. Этой идеей уже сейчас никого не удивишь. Очень много людей пытаются написать 3D движок.&lt;br /&gt;Целью разработки прежде всего является желание стать профессиональным программистом.&lt;br /&gt;Разработка происходит в свободное время, временами с перерывами и ненормированным графиком(2-3 часа в день в среднем) и начата довольно давно где-то в конце 2004 года. В общей сложности общее время плотной работы 2 года. Одновременно с движком изучался С/C++ 3D графика и остальные смежные области, так и программирование в целом. Особого плана работы не было. Делалось то что получалось постепенно расширялась функциональность, проводилась оптимизация, улучшение архитектуры. Некоторые ошибки, недочёты, до сих пор не исправлены, Причины тут разные: либо отсутствие времени, опыта, или желание улучить то что по силам в данный момент, вернувшись к тому что поправить/доработать сложней. Движок не претендует на полноту и совершенство т.к. все понимают задача эта нетривиальная. Итак опишу что сейчас сделано и реализовано:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;I. Не графическая функциональность&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1)&lt;/span&gt; Физика: гора неработающего кода на Tokamak в дальнейшем будет выкинут и заменен на Ageia PhysX. Есть базовая функциональность. позволяющая в будущем добавить физическую библиотеку&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2) &lt;/span&gt;Звук на основе библиотеки OpenAL с потоковой загрузкой ogg(libvorbis) и mp3(libmad),&lt;br /&gt;3D звук(требует тестирования)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3) &lt;/span&gt;Поддержка Lua скриптов с доступом из скрипта нескольких переменных что позволяет ка минимум менять анимацию, реализовывать слежение за камерой, Debug Log у консоль из скриптов&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4)&lt;/span&gt; Консоль - незаменимое средство отладки диагностики и управления движком от перезагрузки ресурсов до смены текущего рендера. Является так-же средством просмотра лога в реальном времени изменения/переключения режимов работы движка и смены рендера.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5)&lt;/span&gt; Самый начальный уровень сети инициализация сокетов Брекли создание сервера и клиентов. Посылка данных.(требуется доработка)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6)&lt;/span&gt; Защита от фатальных ошибок(целочисленное деление на ноль, нарушенный доступ к памяти), протоколирование работы, c записью Dump'а памяти на диск.&lt;br /&gt;7) видео проигрыватель на основе theora;&lt;br /&gt;8) файловая система с поддержкой zip;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;II. Графика&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1)&lt;/span&gt; Поддержка Direct3D9/Direct3D10/OpenGL. Смена рендера возможно командой консоли changerender 0(1)(2) где параметр тип рендера.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2)&lt;/span&gt; поддержка шейдерных языков HLSL/Cg/GLSL(из Сg кода)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3)&lt;/span&gt; Shadow Map тени с само затенением.(Standart Shadow Map) - в данный момент ведется улучшения теней посредством алгоритма Parallel Split Shadow Map.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4)&lt;/span&gt; попиксельное освещение.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5) &lt;/span&gt;Свой формат шейдеров(описание шейдера + константы) с менеджером шейдеров, Гибкая возможность задания констант, не изменяя код движка, прямо в файле&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6)&lt;/span&gt; Свой формат материалов на основе идей из RenderMonkey и Ogre.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7)&lt;/span&gt; Гибкая система частиц с набором неограниченного числа различных независимых эмиттеров со своим набором аффекторов. + сохранение/загрузка из файла с менеджированием.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8) &lt;/span&gt;Иерархическая организация сцены в виде Scene Graph.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9)&lt;/span&gt; Поддержка динамических объектов в Scene Graph.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;10)&lt;/span&gt; Frustum Culling(Оптимизированая проверка Box'а всего по 2 точкам)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;11)&lt;/span&gt; Occluision Culling(Software, ведутся исследования для реализации Иеррахического Occlusion Query HQQ)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;12)&lt;/span&gt; Рендер множества объектов(как в виде генерации мешей, на площади или текстурированных прямоугольников(плашек), в данный момент используется для редера растительности)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;13)&lt;/span&gt; Свой формат статических моделей;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;14)&lt;/span&gt; Скелетная анимация + свой формат моделей;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;15)&lt;/span&gt; Морфичная анимация + свой формат моделей;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;16) &lt;/span&gt;Рендеринг ландшафта с использованием технологии "Chunked Lod"(требует заделывания щелей между лодами);&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;17)&lt;/span&gt; Задание отсечения объектов по дистанции;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;18)&lt;/span&gt; Задание альфа теста по дистанции;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;19) &lt;/span&gt;Лоды для шейдеров(возможно требует доработки)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;20)&lt;/span&gt; Менеджер полно экранного постпроцессинга с загрузкой описания постпроцессинга из файла. (Bloom, Depth of Filed)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Из тулзов разработан редактор системы частиц, экспортер скелетной&lt;br /&gt;и морфичной анимации из 3DS Max, экспортер статических мешей.&lt;br /&gt;&lt;br /&gt;Многие спросят зачем используется OpenGL? Тут все просто это первый API который я начал изучать, Не хочу кидать его поддержку  т.к. там не так много ошибок как раньше хотя поддерживать его сложней всего, тут холивар устраивать не будем, у каждого есть мнение на этот счет. Мне кажется профессионал должен знать в совершенстве все 3D API.&lt;br /&gt;&lt;br /&gt;Код писался на C/C++. В коде отсутствуют глобальные переменные и функции(кроме WinMain)  Используется STL/boost(boost::any, boost::shared_ptr). Код по возможности писался кросплатформенным. Движок гарантированно компилится на Microsoft Visual C++ 2005/2008, Intel C++ 10.x, gcc(MinGW) с последним компилятором возникли проблемы при компиляции Direct3D10.&lt;br /&gt;&lt;br /&gt;Пока скриншоты выкладывать не буду, хотя есть что показать поправлю побольше ошибок + немного улучшу.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4338251266540090894-289843050129407235?l=andreyogl-d3d.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreyogl-d3d.blogspot.com/feeds/289843050129407235/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4338251266540090894&amp;postID=289843050129407235' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/289843050129407235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/289843050129407235'/><link rel='alternate' type='text/html' href='http://andreyogl-d3d.blogspot.com/2008/10/3d.html' title='Разработка 3D движка'/><author><name>Andrey</name><uri>http://www.blogger.com/profile/16201443526225351421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_JwI00ZTPVto/S-HWkBK2ZJI/AAAAAAAAAJ4/hJhI6NBcUgA/S220/IMG_0423_!.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4338251266540090894.post-5850783234176223195</id><published>2008-08-14T21:29:00.001-07:00</published><updated>2008-09-08T12:30:50.915-07:00</updated><title type='text'>Cg 2.1 Beta</title><content type='html'>Вышел Cg 2.1 Beta. Очень радует поддержка Direrct3D10. Не так давно спрашивал про это у nVidia разработчиков, ответили не планируется пока поддержки. Компилятор свой для Direct3D10 они не писали что тоже радует, не будет ошибок и несовместимостей. для компиляции используют функцию D3DX10CompileFromMemory&lt;b&gt;,&lt;/b&gt; для получения всех констант используется D3DX10ReflectShader. Не совсем понятно почему результат cgGetProgramString(cgProgram, CG_COMPILED_PROGRAM); выдает hlsl код опять с измененными именами констант, точка входа именуются "main" Вот к примеру результат компиляции:&lt;br /&gt;// hlsl10v output by Cg compiler&lt;br /&gt;// cgc version 2.1.0009, build date Aug  6 2008&lt;br /&gt;// command line args: -q -profile vs_4_0 -entry VSmain -profileopts -d3d&lt;br /&gt;//vendor NVIDIA Corporation&lt;br /&gt;//version 2.1.0.9&lt;br /&gt;//profile vs_4_0&lt;br /&gt;//program VSmain&lt;br /&gt;//semantic ViewProjMatrix : WorldViewProj&lt;br /&gt;//semantic MatTexture : C4&lt;br /&gt;//semantic tex1 : TEXUNIT0&lt;br /&gt;//semantic tex2 : TEXUNIT1&lt;br /&gt;//semantic ShadowMap : TEXUNIT2&lt;br /&gt;//var float4x4 ViewProjMatrix : WorldViewProj : _ZZ2SViewProjMatrix[0], 4 : -1 : 1&lt;br /&gt;//var float4x4 MatTexture : C4 : _ZZ2SMatTexture[0], 4 : -1 : 1&lt;br /&gt;//var sampler2D tex1 : TEXUNIT0 :  : -1 : 0&lt;br /&gt;//var sampler2D tex2 : TEXUNIT1 :  : -1 : 0&lt;br /&gt;//var sampler2D ShadowMap : TEXUNIT2 :  : -1 : 0&lt;br /&gt;//var float4 Pos : $vin.POSITION : POSITION : 0 : 1&lt;br /&gt;//var float2 texCoord : $vin.TEXCOORD0 : TEXCOORD0 : 1 : 1&lt;br /&gt;//var float4 VSmain.Pos : $vout.POSITION :  : -1 : 1&lt;br /&gt;//var float2 VSmain.texCoord : $vout.TEXCOORD0 :  : -1 : 1&lt;br /&gt;//var float4 VSmain.shadowCrd : $vout.TEXCOORD1 :  : -1 : 1&lt;br /&gt;&lt;br /&gt;#pragma pack_matrix(row_major)&lt;br /&gt;&lt;br /&gt;struct VS_OUTPUT {&lt;br /&gt;   float4 Pos : POSITION;&lt;br /&gt;   float2 texCoord : TEX0;&lt;br /&gt;   float4 shadowCrd : TEX1;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;struct X1X {&lt;br /&gt;   float4 POSITION : SV_Position;&lt;br /&gt;   float2 TEX0 : TEX0;&lt;br /&gt;   float4 TEX1 : TEX1;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;float4 _ZZ3SrZh0001;&lt;br /&gt;float4 _ZZ3SrZh0003;&lt;br /&gt;X1X _ZZ3SZDcout;&lt;br /&gt;uniform float4x4 _ZZ2SViewProjMatrix : WorldViewProj;&lt;br /&gt;uniform float4x4 _ZZ2SMatTexture : C4;&lt;br /&gt;&lt;br /&gt;// main procedure, the original name was VSmain&lt;br /&gt;X1X main(in float4 _ZZ4SPos : POSITION, in float2 _ZZ4StexCoord : TEX0)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;   VS_OUTPUT _ZZ4SOut;&lt;br /&gt;&lt;br /&gt;   _ZZ3SrZh0001 = _ZZ4SPos.x*_ZZ2SViewProjMatrix._11_12_13_14;&lt;br /&gt;   _ZZ3SrZh0001 = _ZZ3SrZh0001 + _ZZ4SPos.y*_ZZ2SViewProjMatrix._21_22_23_24;&lt;br /&gt;   _ZZ3SrZh0001 = _ZZ3SrZh0001 + _ZZ4SPos.z*_ZZ2SViewProjMatrix._31_32_33_34;&lt;br /&gt;   _ZZ3SrZh0001 = _ZZ3SrZh0001 + _ZZ4SPos.w*_ZZ2SViewProjMatrix._41_42_43_44;&lt;br /&gt;   _ZZ4SOut.Pos = _ZZ3SrZh0001;&lt;br /&gt;   _ZZ3SrZh0003 = _ZZ4SPos.x*_ZZ2SMatTexture._11_12_13_14;&lt;br /&gt;   _ZZ3SrZh0003 = _ZZ3SrZh0003 + _ZZ4SPos.y*_ZZ2SMatTexture._21_22_23_24;&lt;br /&gt;   _ZZ3SrZh0003 = _ZZ3SrZh0003 + _ZZ4SPos.z*_ZZ2SMatTexture._31_32_33_34;&lt;br /&gt;   _ZZ3SrZh0003 = _ZZ3SrZh0003 + _ZZ4SPos.w*_ZZ2SMatTexture._41_42_43_44;&lt;br /&gt;   _ZZ4SOut.shadowCrd = _ZZ3SrZh0003;&lt;br /&gt;   _ZZ4SOut.texCoord = _ZZ4StexCoord;&lt;br /&gt;   _ZZ3SZDcout.POSITION = _ZZ4SOut.Pos;&lt;br /&gt;   _ZZ3SZDcout.TEX0 = _ZZ4SOut.texCoord;&lt;br /&gt;   _ZZ3SZDcout.TEX1 = _ZZ4SOut.shadowCrd;&lt;br /&gt;   return _ZZ3SZDcout;&lt;br /&gt;} // main end&lt;br /&gt;Ну на самом деле данный код не планируется подсовывать D3D10CompileShader проще сделать все стандартно&lt;br /&gt;взять ID3D10Blob* из cgD3D10GetCompiledProgram и самому создать шейдер миную Cg RunTime, точно так-же как я сделал в случае использования Cg в OpenGL для профилей&lt;br /&gt;Direct3D9, и OpenGL (glslv,glslf,arbvp1,arvfp1).&lt;br /&gt;В общем можно встраивать это в движок&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4338251266540090894-5850783234176223195?l=andreyogl-d3d.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreyogl-d3d.blogspot.com/feeds/5850783234176223195/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4338251266540090894&amp;postID=5850783234176223195' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/5850783234176223195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/5850783234176223195'/><link rel='alternate' type='text/html' href='http://andreyogl-d3d.blogspot.com/2008/08/cg-21-beta.html' title='Cg 2.1 Beta'/><author><name>Andrey</name><uri>http://www.blogger.com/profile/16201443526225351421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_JwI00ZTPVto/S-HWkBK2ZJI/AAAAAAAAAJ4/hJhI6NBcUgA/S220/IMG_0423_!.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4338251266540090894.post-2510372893946651200</id><published>2008-08-06T11:49:00.000-07:00</published><updated>2010-07-01T02:05:08.091-07:00</updated><title type='text'>Начал вести блог</title><content type='html'>Ну вот подключил я себе интернет, чувствую себя в цивилизации. Сюда буду иногда выкладывать свои работы. Ну и высказываться.&lt;br /&gt;Итак 1 из первых тестовых проектов на OpenGL. Тут я разбивал геометрию на патчи и строил Octree дерево. Это был 1 из первых алгоритмов реализованных мной с нуля. Вот &lt;a href="http://ifolder.ru/18376894"&gt;демка для скачивания&lt;/a&gt;,требует поддержки расширения GL_ARB_vertex_buffer_objects.&lt;br /&gt;Вот пара скриншотов:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JwI00ZTPVto/SJn1_QGk4uI/AAAAAAAAAA0/344C2YP_xCg/s1600-h/octree2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 498px; height: 369px;" src="http://1.bp.blogspot.com/_JwI00ZTPVto/SJn1_QGk4uI/AAAAAAAAAA0/344C2YP_xCg/s320/octree2.jpg" alt="" id="BLOGGER_PHOTO_ID_5231482909170655970" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_JwI00ZTPVto/SJn0wKATvLI/AAAAAAAAAAU/oBo-ZhcG1o4/s1600-h/octree.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 485px; height: 296px;" src="http://3.bp.blogspot.com/_JwI00ZTPVto/SJn0wKATvLI/AAAAAAAAAAU/oBo-ZhcG1o4/s320/octree.jpg" alt="" id="BLOGGER_PHOTO_ID_5231481550324087986" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4338251266540090894-2510372893946651200?l=andreyogl-d3d.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andreyogl-d3d.blogspot.com/feeds/2510372893946651200/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4338251266540090894&amp;postID=2510372893946651200' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/2510372893946651200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4338251266540090894/posts/default/2510372893946651200'/><link rel='alternate' type='text/html' href='http://andreyogl-d3d.blogspot.com/2008/08/blog-post.html' title='Начал вести блог'/><author><name>Andrey</name><uri>http://www.blogger.com/profile/16201443526225351421</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://2.bp.blogspot.com/_JwI00ZTPVto/S-HWkBK2ZJI/AAAAAAAAAJ4/hJhI6NBcUgA/S220/IMG_0423_!.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_JwI00ZTPVto/SJn1_QGk4uI/AAAAAAAAAA0/344C2YP_xCg/s72-c/octree2.jpg' height='72' width='72'/><thr:total>6</thr:total></entry></feed>
