<?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:blogger='http://schemas.google.com/blogger/2008' 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-455218241342887580</id><updated>2024-09-15T08:20:05.303+06:00</updated><category term="android"/><category term="opengl"/><category term=".Net"/><category term="shader"/><category term="API"/><category term="EF"/><category term="ADO.Net"/><category term="Linq"/><category term="TAPI"/><category term="UccAPI"/><category term="asterisk"/><category term="fun"/><category term="multitexturing"/><category term="tablet PC"/><title type='text'>Записульки программиста</title><subtitle type='html'>Для тех кому интересно все о программировании, .Net, android, c#, java, c++, технологии</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://vikulov.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://vikulov.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07925280476511523382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-455218241342887580.post-3834287412216408445</id><published>2014-01-05T13:38:00.000+07:00</published><updated>2014-01-05T14:27:43.872+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="opengl"/><category scheme="http://www.blogger.com/atom/ns#" term="shader"/><title type='text'>ShaderToy</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Удивительный сайт &lt;a href=&quot;https://www.shadertoy.com/&quot;&gt;ShaderToy&lt;/a&gt;&amp;nbsp;для себя открыл. На нем как раз можно учиться и учиться писать шейдеры. Насколько я понял пишем мы уже в fragment shader. Есть список входящих переменных, таких &amp;nbsp;как: текущее время, 4 текстуры на выбор. А самое главное куча сложных ( и красивых) и простых примеров. можно разобраться с техниками демо исключительно написанных на шейдере, без вычислений на cpu.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
Используется WebGL, так что нужен браузер с его поддержкой, но это уже не проблема. А webGL как раз таки используюет OpenGL ES 2.0. Поэтому можно быстро накидать зарисовку здесь и перенести на android iphone&lt;br /&gt;
&lt;br /&gt;
Вот, например, модификация простейшего Blur:&lt;br /&gt;
&lt;br /&gt;
void main(void)&lt;br /&gt;
{&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;vec2 uv = gl_FragCoord.xy / iResolution.xy;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;vec3 t=texture2D(iChannel0, uv).xyz;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;vec4 c1=vec4(texture2D(iChannel0, vec2(uv.x-0.1*sin(iGlobalTime*5.0),uv.y)).xyz,1);&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;vec4 c2=vec4(texture2D(iChannel0, vec2(uv.x+0.1*sin(iGlobalTime*5.0),uv.y)).xyz,1);&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;vec4 c3=vec4(texture2D(iChannel0, vec2(uv.x,uv.y-0.01*tan(iGlobalTime*5.0))).xyz,1);&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;vec4 c4=vec4(texture2D(iChannel0, vec2(uv.x,uv.y+0.01*tan(iGlobalTime*5.0))).xyz,1);&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;gl_FragColor = vec4(t,1.0);&lt;br /&gt;
&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;gl_FragColor = (vec4(t,1.0)+c1+c2+c3+c4)/5.0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFPDhHN16EkY8L4U_kwSJJo-rLjEGkFXFOtB9ii6WVNeufSn00LAtDGEUGM1IWXHy1Memh1daxLg5lXCE6KUNpT4f7wfxYVBV0Qz-U_qm_rigkvxPx6y3_JHjeTlIQs_Hf6RTeJNlc2us/s1600/1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;348&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFPDhHN16EkY8L4U_kwSJJo-rLjEGkFXFOtB9ii6WVNeufSn00LAtDGEUGM1IWXHy1Memh1daxLg5lXCE6KUNpT4f7wfxYVBV0Qz-U_qm_rigkvxPx6y3_JHjeTlIQs_Hf6RTeJNlc2us/s640/1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://vikulov.blogspot.com/feeds/3834287412216408445/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vikulov.blogspot.com/2014/01/shadertoy.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/3834287412216408445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/3834287412216408445'/><link rel='alternate' type='text/html' href='http://vikulov.blogspot.com/2014/01/shadertoy.html' title='ShaderToy'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07925280476511523382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFPDhHN16EkY8L4U_kwSJJo-rLjEGkFXFOtB9ii6WVNeufSn00LAtDGEUGM1IWXHy1Memh1daxLg5lXCE6KUNpT4f7wfxYVBV0Qz-U_qm_rigkvxPx6y3_JHjeTlIQs_Hf6RTeJNlc2us/s72-c/1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-455218241342887580.post-1959030613010620238</id><published>2013-12-20T13:46:00.004+07:00</published><updated>2013-12-20T14:01:27.182+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="opengl"/><category scheme="http://www.blogger.com/atom/ns#" term="shader"/><title type='text'>Зачем нужны Model, View, Projection матрицы в OpenGL ES</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
Тот, кто любит ковыряться в исходниках или примерах кода для OpenGL или DirectX (да и вообще для графики), очень часто встречает наличие матриц в шейдере. И чаще всего они имеют похожие названия (а также одну и туже размерность).&lt;br /&gt;
Есть три основных типа матриц:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Model&amp;nbsp;&lt;/li&gt;
&lt;li&gt;View&lt;/li&gt;
&lt;li&gt;Projection&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
Обычно путь отрисовки вашей 3D модели (объекта, логически сгруппированных объектов) происходит в несколько этапов:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;создание (загрузка в память)&lt;/li&gt;
&lt;li&gt;установка модели в мировом пространстве&lt;/li&gt;
&lt;li&gt;отрисовка мира в зависимости от положения камеры&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
Сама по себе модель изначально не привязана к внешнему миру, набор примитивов имеет координаты со смещением относительно условного (0;0;0).&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
Нам важно как модель повернута относительно оси X, к примеру, Становится это особенно важно, когда в память загружается набор примитивов один раз, а таких объектов в мире, например, пять штук. И мы хотим их поворачивать относительно собственной оси симметрии на разные углы.&lt;/div&gt;
&lt;div&gt;
Тут то и вступает в дело Model матрица. В ней то и указывается этот поворот относительно нашей выбранной оси. Она переводит локальные координаты модели в координаты нашего мира.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Так как у нас есть камера, соответственно мы можем ее поворачивать, вращать, ставить в другое место в нашем мировом пространстве. View матрица переводит координаты нашего мира в координаты камеры.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Запускаем мы графику на разных аппаратных платформах, соответственно могут быть разные экраны, разрешения экранов. Projection матрица переводит координаты камеры в координаты для отображения на экране.&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
В шейдер эти три матрицы передают как первоначальные параметры. Чтобы получить конечную точку модели на экране эти матрицы перемножают.&lt;br /&gt;
&lt;br /&gt;
Очевидно, что если камера не крутится и не двигается, а соотношение и размер экрана не меняется, то произведение View и Projection матриц равно константе для каждого фрейма. И нет особой необходимости пересчитывать их в каждом кадре в шейдере. Поэтому часто их произведение один раз рассчитывают на CPU, а шейдеру отправляют уже готовый результат, что уменьшает расчеты, увеличивает производительность.&lt;br /&gt;
&lt;br /&gt;
Можно встретить такие название переменных для матриц:&lt;br /&gt;
mvp, ViewProjection&lt;br /&gt;
&lt;br /&gt;
mvp - это готовое произведение ModelViewProjection&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ну и мой &lt;a href=&quot;http://stackoverflow.com/questions/5550620/the-purpose-of-model-view-projection-matrix&quot;&gt;вопрос&lt;/a&gt; по теме с ответом на StackOverFlow, за который я получил там золотой баджик :-)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://vikulov.blogspot.com/feeds/1959030613010620238/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vikulov.blogspot.com/2013/12/model-view-projection-opengl-es.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/1959030613010620238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/1959030613010620238'/><link rel='alternate' type='text/html' href='http://vikulov.blogspot.com/2013/12/model-view-projection-opengl-es.html' title='Зачем нужны Model, View, Projection матрицы в OpenGL ES'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07925280476511523382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-455218241342887580.post-5769540826063704355</id><published>2011-09-30T14:17:00.000+07:00</published><updated>2011-09-30T15:22:34.752+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="EF"/><title type='text'>Использование контекста EF во времени</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Меня давно интересовал такой вопрос: какой продолжительностью времени жизни должен обладать контекст Entity Framework?&lt;br /&gt;
&lt;br /&gt;
И вот недавно я нашел ответ:&lt;br /&gt;
&lt;a href=&quot;http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling&quot;&gt;http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Если кратко, то каждый раз когда мы выполняем логическую&amp;nbsp;(бизнес?)&amp;nbsp;операцию, так как EF позаботится о сохранении всех метаданных и поэтому повторное создание контекста будет быстрым. В свою очередь DB provider должен позаботиться о пуле соединений.&lt;br /&gt;
&lt;br /&gt;
пример:&lt;br /&gt;
&lt;blockquote&gt;
&lt;code&gt;&lt;span style=&quot;color: black; font-family: &#39;Courier New&#39;; font-size: x-small;&quot;&gt; &lt;span style=&quot;color: blue;&quot;&gt;using&lt;/span&gt; (SupplierServiceEntities Context = GetContext())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Session s = (&lt;span style=&quot;color: blue;&quot;&gt;from&lt;/span&gt; sess &lt;span style=&quot;color: blue;&quot;&gt;in&lt;/span&gt; Context.Sessions&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;where&lt;/span&gt; sess.Sid == sid &amp;amp;&amp;amp; EntityFunctions.AddMinutes(sess.DateOfLastAction, ExpireSessionTimeoutMinutes) &amp;gt; &lt;span style=&quot;color: #2b91af;&quot;&gt;DateTime&lt;/span&gt;.Now&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;color: blue;&quot;&gt;select&lt;/span&gt; sess).FirstOrDefault();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;if&lt;/span&gt; (s != &lt;span style=&quot;color: blue;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: blue;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: blue;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: grey; font-size: xx-small;&quot;&gt;* This source code was highlighted with &lt;a href=&quot;http://virtser.net/blog/post/source-code-highlighter.aspx&quot;&gt;&lt;span style=&quot;color: grey; font-size: xx-small;&quot;&gt;Source Code Highlighter&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/blockquote&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://vikulov.blogspot.com/feeds/5769540826063704355/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vikulov.blogspot.com/2011/09/ef.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/5769540826063704355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/5769540826063704355'/><link rel='alternate' type='text/html' href='http://vikulov.blogspot.com/2011/09/ef.html' title='Использование контекста EF во времени'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07925280476511523382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-455218241342887580.post-1027648266183815588</id><published>2011-09-09T12:48:00.001+07:00</published><updated>2011-09-09T13:32:56.080+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="ADO.Net"/><category scheme="http://www.blogger.com/atom/ns#" term="EF"/><category scheme="http://www.blogger.com/atom/ns#" term="Linq"/><title type='text'>Компилированные запросы Linq (Compiled query) и ADO.Net 4.0</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Многие пытаются сравнить производительность Entity Framework с чистым SQL. В любом случае запрос выполненный с помощью прямого SQL запроса будет быстрее чем использование LINQ хотя бы за счет маппинга полей.&lt;br /&gt;
&lt;br /&gt;
Но эту разницу можно сократить до минимума. В EF 4.0 Linq запрос компилируются (разбираются) каждый раз когда к ним обращаются. Сама по себе эта операция дорогостоящая и мы должны от нее избавиться.&lt;br /&gt;
&lt;br /&gt;
Делается это с помощью класса &lt;code&gt;CompiledQuery&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Класс&amp;nbsp;CompiledQuery имеет статический метод Compile, параметром которому идет выражение Linq. Результатом этой функции является делегат. Его и вызываем когда нужно получить данные через запрос.&lt;br /&gt;
&lt;br /&gt;
Пример:&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;//делегат, с помощью которого будет вызываться наш запрос&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;telephonyentities1, int,=&quot;&quot; list&lt;int=&quot;&quot;&gt;&lt;callcomment&gt;&lt;code&gt;&lt;basecontext, int,=&quot;&quot; iqueryable&lt;callcomment=&quot;&quot;&gt;&lt;telephonyentities1, int,=&quot;&quot; list&lt;int=&quot;&quot;&gt;&lt;callcomment&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;Func &amp;lt;telephonyEntities1, int, List&amp;lt;int&amp;gt;, IQueryable&amp;lt;CallComment&lt;/span&gt;&lt;/callcomment&gt;&lt;/telephonyentities1,&gt;&lt;/basecontext,&gt;&lt;/code&gt;&lt;/callcomment&gt;&lt;/telephonyentities1,&gt;&lt;telephonyentities1, int,=&quot;&quot; list&lt;int=&quot;&quot;&gt;&lt;callcomment&gt;&lt;code&gt;&lt;basecontext, int,=&quot;&quot; iqueryable&lt;callcomment=&quot;&quot;&gt;&lt;telephonyentities1, int,=&quot;&quot; list&lt;int=&quot;&quot;&gt;&lt;callcomment&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&amp;gt;&amp;nbsp;&lt;/span&gt; &amp;nbsp;_compiledCallCommentsGet = null;&lt;/callcomment&gt;&lt;/telephonyentities1,&gt;&lt;/basecontext,&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; public List&lt;callcomment&gt; CallCommentsGet(CallDetail callDetail)&lt;/callcomment&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (callDetail == null)&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw new ArgumentNullException(&quot;callDetail&quot;, &quot;callDetail не должен быть null&quot;);&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (callDetail.id &amp;lt;= 0)&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw new ArgumentException(&quot;callDetail.ID&quot;, &quot;callDetail должен иметь ID&quot;);&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; List&lt;callcomment&gt; list = null;&lt;/callcomment&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var context = GetSqlConnection();&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;//Смотрим создавали ли мы уже скомпилированный linq запрос&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (_compiledCallCommentsGet == null)&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;//сам процесс создания делегата&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _compiledCallCommentsGet = CompiledQuery.Compile&lt;/code&gt;&lt;/callcomment&gt;&lt;telephonyentities1, int,=&quot;&quot; list&lt;int=&quot;&quot;&gt;&lt;callcomment&gt;&lt;code&gt;&lt;basecontext, int,=&quot;&quot; iqueryable&lt;callcomment=&quot;&quot;&gt;&lt;telephonyentities1, int,=&quot;&quot; list&lt;int=&quot;&quot;&gt;&lt;callcomment&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&amp;lt;telephonyEntities1, int, List&amp;lt;int&amp;gt;, IQueryable&amp;lt;CallComment&lt;/span&gt;&lt;/callcomment&gt;&lt;/telephonyentities1,&gt;&lt;/basecontext,&gt;&lt;/code&gt;&lt;/callcomment&gt;&lt;/telephonyentities1,&gt;&lt;telephonyentities1, int,=&quot;&quot; list&lt;int=&quot;&quot;&gt;&lt;callcomment&gt;&lt;code&gt;&lt;basecontext, int,=&quot;&quot; iqueryable&lt;callcomment=&quot;&quot;&gt;&lt;telephonyentities1, int,=&quot;&quot; list&lt;int=&quot;&quot;&gt;&lt;callcomment&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: &#39;Times New Roman&#39;;&quot;&gt;&amp;gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/callcomment&gt;&lt;/telephonyentities1,&gt;&lt;/basecontext,&gt;&lt;/code&gt;&lt;/callcomment&gt;&lt;/telephonyentities1,&gt;&lt;callcomment&gt;&lt;code&gt;&lt;basecontext, int,=&quot;&quot; iqueryable&lt;callcomment=&quot;&quot;&gt;&lt;telephonyentities1, int,=&quot;&quot; list&lt;int=&quot;&quot;&gt;&lt;callcomment&gt;&amp;nbsp;(&lt;/callcomment&gt;&lt;/telephonyentities1,&gt;&lt;/basecontext,&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (ctx, id) =&amp;gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; from c in ctx.CallComments&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; where c.CallDetail.id == callDetail.id&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; orderby c.dateWhen descending&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; select c);&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;//вызываем linq запрос через наш делегат&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; list=_compiledCallCommentsGet.Invoke(context, callDetail.id).ToList();&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return list;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Особенности&lt;/b&gt;:&lt;br /&gt;
&lt;br /&gt;
К сожалению такую штуку скомпилировать не удастся:&lt;br /&gt;
&lt;code&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;code&gt;from cd in context.CallDetails&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;where cd.Call.DateWhen &amp;gt;= dateTimeFrom &amp;amp;&amp;amp; cd.Call.DateWhen &amp;lt; dateTimeTo &amp;amp;&amp;amp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(listOpInt.Any() == false || listOpInt.Contains(cd.Call.Operator.id))&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;select cd&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
потому что &quot;Only scalar parameters (such as Int32, Decimal, and Guid) are supported.&quot; ..&amp;gt;.&lt;br /&gt;
&lt;/callcomment&gt;&lt;/telephonyentities1,&gt;&lt;br /&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://vikulov.blogspot.com/feeds/1027648266183815588/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vikulov.blogspot.com/2011/09/linq-compiled-query-adonet-40.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/1027648266183815588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/1027648266183815588'/><link rel='alternate' type='text/html' href='http://vikulov.blogspot.com/2011/09/linq-compiled-query-adonet-40.html' title='Компилированные запросы Linq (Compiled query) и ADO.Net 4.0'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07925280476511523382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-455218241342887580.post-635437775511047509</id><published>2011-05-02T13:59:00.002+07:00</published><updated>2011-05-02T14:06:39.740+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="multitexturing"/><category scheme="http://www.blogger.com/atom/ns#" term="opengl"/><category scheme="http://www.blogger.com/atom/ns#" term="shader"/><title type='text'>OpenGL ES 2.0 на android. MultiTexturing</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;MultiTexturing - это простая техника, с помощью которой можно смешивать 2 и более текстуры. Данная техника применяется, например, для отображения света фонарика на стене.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji1dP2FWs2WtE0rN8n1ZimerUBjlMIYwIufx3tpYYaP9vpgJowIvM-QHyxxLuO_72JH8iBwjVae5yV3P3icwVrS5_m1xP71aB5-HNnaaNq92gzdYkoWm2136xzn-8PLXueFvSEFSSvpac/s1600/device3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji1dP2FWs2WtE0rN8n1ZimerUBjlMIYwIufx3tpYYaP9vpgJowIvM-QHyxxLuO_72JH8iBwjVae5yV3P3icwVrS5_m1xP71aB5-HNnaaNq92gzdYkoWm2136xzn-8PLXueFvSEFSSvpac/s320/device3.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;В моем примере&amp;nbsp;используются&amp;nbsp;2 текстуры.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN4n6OnsTXwjqDx0HhBEHSTHdXZEd-ymgzzBySi-HWoUkjhcASEv1JBITLKT90ttYbBjd2L-Z6gDvQqi2STZ09SyWQ5-F8O-TtwTCIbRMkyWZG8SKi78XyKtg9b0AjCsi8FSbzhnHl1Uc/s1600/basemap.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN4n6OnsTXwjqDx0HhBEHSTHdXZEd-ymgzzBySi-HWoUkjhcASEv1JBITLKT90ttYbBjd2L-Z6gDvQqi2STZ09SyWQ5-F8O-TtwTCIbRMkyWZG8SKi78XyKtg9b0AjCsi8FSbzhnHl1Uc/s200/basemap.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdO6vk6jVF4TflpUyKmQh_Z30DTSTSap8FsyKB3Qt-CkZXRJFMBl12NA2CiwV1saY9XMpzFk6H-b1fJxDSF6TU-dpNTF-O5ghVYmkoFmusXvWVpxGPaHRw9RyBHN02QyWZCvIcrK1hyphenhyphenUo/s1600/diffuse.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdO6vk6jVF4TflpUyKmQh_Z30DTSTSap8FsyKB3Qt-CkZXRJFMBl12NA2CiwV1saY9XMpzFk6H-b1fJxDSF6TU-dpNTF-O5ghVYmkoFmusXvWVpxGPaHRw9RyBHN02QyWZCvIcrK1hyphenhyphenUo/s200/diffuse.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Сам код смешивания прост и находится в пикcельном шейдере (fragment shader):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;precision mediump float; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; uniform sampler2D s_baseMap; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;uniform sampler2D s_lightMap; &amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;void main() &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;vec4 baseColor; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;vec4 lightColor; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;baseColor = texture2D( s_baseMap, gl_PointCoord );&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;lightColor = texture2D( s_lightMap, gl_PointCoord );&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;gl_FragColor = baseColor * (lightColor + 0.25); &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
s_baseMap &amp;nbsp;и&amp;nbsp;s_lightMap это как раз наши текстуры, значения в них заполняются при инициализации шейдера. Код при прорисовке фрейма onDraw:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Use the program object&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GLES20.glUseProgram(mProgramObject);&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Load the vertex position&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mVertices.position(0);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GLES20.glVertexAttribPointer ( mPositionLoc, 3, GLES20.GL_FLOAT,&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; false,&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 5 * 4, mVertices );&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Load the texture coordinate&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mVertices.position(3);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GLES20.glVertexAttribPointer ( mTexCoordLoc, 2, GLES20.GL_FLOAT,&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; false,&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 5 * 4,&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mVertices );&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GLES20.glEnableVertexAttribArray ( mPositionLoc );&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GLES20.glEnableVertexAttribArray ( mTexCoordLoc );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Bind the base map&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GLES20.glActiveTexture ( GLES20.GL_TEXTURE0 );&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GLES20.glBindTexture ( GLES20.GL_TEXTURE_2D, mBaseMapTexId );&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Set the base map sampler to texture unit to 0&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GLES20.glUniform1i ( mBaseMapLoc, 0 );&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Bind the light map&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GLES20.glActiveTexture ( GLES20.GL_TEXTURE1 );&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GLES20.glBindTexture ( GLES20.GL_TEXTURE_2D, mLightMapTexId );&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Set the light map sampler to texture unit 1&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GLES20.glUniform1i ( mLightMapLoc, 1 );&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GLES20.glDrawElements ( GLES20.GL_POINTS, 6, GLES20.GL_UNSIGNED_SHORT, mIndices );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Исходный код проекта можно посмотреть здесь:&amp;nbsp;&lt;a href=&quot;http://code.google.com/p/android-opengles-samples-for-vikulov-blogspot-com/source/browse/#svn%2Ftrunk%2FopenGlSprites&quot;&gt;http://code.google.com/p/android-opengles-samples-for-vikulov-blogspot-com/source/browse/#svn%2Ftrunk%2FopenGlSprites&lt;/a&gt;.&lt;br /&gt;
В нем так же показано как использовать режим прорисовки точек GL_POINTS, как пользоваться&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; color: #008800; font-family: Monaco, &#39;DejaVu Sans Mono&#39;, &#39;Bitstream Vera Sans Mono&#39;, &#39;Lucida Console&#39;, monospace; font-size: 12px; white-space: pre-wrap;&quot;&gt;gl_PointSize &lt;/span&gt;и&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; color: #008800; font-family: Monaco, &#39;DejaVu Sans Mono&#39;, &#39;Bitstream Vera Sans Mono&#39;, &#39;Lucida Console&#39;, monospace; font-size: 12px; white-space: pre-wrap;&quot;&gt;gl_PointCoord&lt;/span&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vikulov.blogspot.com/feeds/635437775511047509/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vikulov.blogspot.com/2011/05/opengl-es-20-android-multitexturing.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/635437775511047509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/635437775511047509'/><link rel='alternate' type='text/html' href='http://vikulov.blogspot.com/2011/05/opengl-es-20-android-multitexturing.html' title='OpenGL ES 2.0 на android. MultiTexturing'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07925280476511523382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji1dP2FWs2WtE0rN8n1ZimerUBjlMIYwIufx3tpYYaP9vpgJowIvM-QHyxxLuO_72JH8iBwjVae5yV3P3icwVrS5_m1xP71aB5-HNnaaNq92gzdYkoWm2136xzn-8PLXueFvSEFSSvpac/s72-c/device3.png" height="72" width="72"/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-455218241342887580.post-6863551440267526874</id><published>2011-04-10T15:08:00.000+07:00</published><updated>2011-04-10T15:08:41.918+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="opengl"/><title type='text'>OpenGL ES 2.0 на android. Простой и текстурированный квадрат</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Вот такой пример создания простых фигур. Создаем простой квадрат, а потом еще один, но уже с текстурой.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt67sM5zscb1Ejtisma_ukP6L23U_j7ItiN21S8LxMz59C7-hDPI5kReeUNV3kgZwuu3YcE2rLS-iCeHeM6LLIue7laERnhKIByBICkQq5B4p12ahbC2YRzt5CRemkt6kXS3OhwPx6_2c/s1600/device3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt67sM5zscb1Ejtisma_ukP6L23U_j7ItiN21S8LxMz59C7-hDPI5kReeUNV3kgZwuu3YcE2rLS-iCeHeM6LLIue7laERnhKIByBICkQq5B4p12ahbC2YRzt5CRemkt6kXS3OhwPx6_2c/s320/device3.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;Под катом как написать такое приложение&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Для начала можно взять шаблон проекта для eclipse из предыдущего &lt;a href=&quot;http://vikulov.blogspot.com/2011/04/opengl-es-20-android.html&quot;&gt;поста&lt;/a&gt;.&lt;br /&gt;
Исходный код проекта можно взять &lt;a href=&quot;https://code.google.com/p/android-opengles-samples-for-vikulov-blogspot-com/source/browse/#svn%2Ftrunk%2FOpenglTemplate&quot;&gt;здесь&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы в отображаемом приложении была перспектива, нужно создать три матрицы: матрица модели (Model matrix),&amp;nbsp;матрица&amp;nbsp;проекции (Projection matrix), и матрица вида (View matrix). Такой подход очень удобен тем, что&amp;nbsp;матрица модели отвечает за расположение вершин (vertex) в виртуальном мире,&amp;nbsp;матрица&amp;nbsp;проекции отвечает за создание, например, перспективы (также можно в ней создать эффект fisheye), а&amp;nbsp;матрица вида за положение камеры в пространстве. Получается, что можно независимо управлять камерой, например, нажатием тачскрина, и одновременно поворачивать наши модели (вершины) в пространстве. Обычно в матрице проекции &lt;s&gt;скрываются&lt;/s&gt;&amp;nbsp;отражаются детали экрана, физическое соотношение размеров экрана.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Класс Square, в нем мы создаем вершины. Мы создаем вершины и создаем массив&amp;nbsp;indices, в котором будут индексы для создания 2ух треугольников, из которых состоит квадрат.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
public class Square {
float vertices[] = { -1.0f, -1.0f, 0.0f, // 0, Top Left
1.0f, -1.0f, 0.0f, // 1, Bottom Left
1.0f, 1.0f, 0.0f, // 2, Bottom Right
-1.0f, 1.0f, 0.0f // 3, Top Right
};

short[] indices = { 0, 1, 2, 2, 3, 0 };

// Our vertex buffer.
private FloatBuffer vertexBuffer;
// Our index buffer.
private ShortBuffer indexBuffer;
public Square()
{
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
vbb.order(ByteOrder.nativeOrder());
vertexBuffer = vbb.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);
// short is 2 bytes, therefore we multiply the number if
// vertices with 2.
ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
ibb.order(ByteOrder.nativeOrder());
indexBuffer = ibb.asShortBuffer();
indexBuffer.put(indices);
indexBuffer.position(0);
}
FloatBuffer getVertexBuffer(){
return vertexBuffer;
}
ShortBuffer getIndexBuffer(){
return indexBuffer;
}
}

&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
// Load the vertex data

//задаем соответствие вектора&amp;nbsp;aPosition в шейдере и нашего буффера вершин квадрата
GLES20.glVertexAttribPointer(GLES20.glGetAttribLocation(program, &quot;aPosition&quot;), 3,GLES20.GL_FLOAT, false, 0, sq.getVertexBuffer());

//задаем параметр цвета для нашего шейдера
GLES20.glVertexAttrib4f(GLES20.glGetAttribLocation(program, &quot;acolor&quot;),&amp;nbsp;1f,1f,0f,0.5f);
GLES20.glEnableVertexAttribArray(0);

//производим перемножение матриц Вида, проекции и модели
Matrix.setIdentityM(mMMatrix, 0);
Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, mMMatrix, 0);
Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);

//задаем соответствие матрицы&amp;nbsp;uMVPMatrixв шейдере и нашего буффера вершин квадрата
GLES20.glUniformMatrix4fv(GLES20.glGetUniformLocation(program, &quot;uMVPMatrix&quot;), 1, false,mMVPMatrix, 0);

//отрисовываем наш квадрат
// GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 4);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT,sq.getIndexBuffer());
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
А вот шейдеры&lt;br /&gt;
&lt;br /&gt;
Vertex shader:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: с&quot;&gt;
uniform mat4 uMVPMatrix;
attribute vec4 aPosition;
attribute vec4 acolor;
varying vec4 vcolor;
void main() {
&amp;nbsp;&amp;nbsp;gl_Position = uMVPMatrix * aPosition;
&amp;nbsp;&amp;nbsp;vcolor=acolor;
}

&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;Fragment shader:&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;/div&gt;&lt;pre class=&quot;brush: с++&quot;&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;precision mediump float;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;varying vec4 vcolor;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;void main() {&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;vec4 color = vcolor;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&amp;nbsp;&amp;nbsp;gl_FragColor = color;&lt;/div&gt;&lt;div style=&quot;margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;&quot;&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vikulov.blogspot.com/feeds/6863551440267526874/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vikulov.blogspot.com/2011/04/opengl-es-20-android_10.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/6863551440267526874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/6863551440267526874'/><link rel='alternate' type='text/html' href='http://vikulov.blogspot.com/2011/04/opengl-es-20-android_10.html' title='OpenGL ES 2.0 на android. Простой и текстурированный квадрат'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07925280476511523382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjt67sM5zscb1Ejtisma_ukP6L23U_j7ItiN21S8LxMz59C7-hDPI5kReeUNV3kgZwuu3YcE2rLS-iCeHeM6LLIue7laERnhKIByBICkQq5B4p12ahbC2YRzt5CRemkt6kXS3OhwPx6_2c/s72-c/device3.png" height="72" width="72"/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-455218241342887580.post-9039155510075872588</id><published>2011-04-07T14:12:00.000+07:00</published><updated>2011-04-07T14:12:44.976+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="opengl"/><title type='text'>OpenGL ES 2.0 на android. Начало</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Пожалуй, самое главное отличие версий OpenGL ES&amp;nbsp;1.x и 2.0 - это появление в версии 2.0&amp;nbsp;pipeline with programmable shading, то есть &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%A8%D0%B5%D0%B9%D0%B4%D0%B5%D1%80&quot;&gt;шейдеров&lt;/a&gt;&amp;nbsp;(shaders). Почти все красоты современных игр сделаны с использованием шейдеров. В&amp;nbsp;&amp;nbsp;OpenGL ES шейдеры бывают двух типов: Vertex shaders и Fragment shaders. Описание и использование&amp;nbsp;OpenGL ES 2.0 можно найти в книге&amp;nbsp;OpenGL®ES 2.0&amp;nbsp;Programming Guide.&lt;br /&gt;
&lt;br /&gt;
Реализация&amp;nbsp;OpenGL ES 2.0 в android, используя java классы, появляется начиная с версии android 2.2. Создать приложение для android очень просто, а вот отладку производить не очень, так как эмулятор не имеет поддержки&amp;nbsp;OpenGL ES 2.0 (по крайней мере, я не смог этого добить на данный момент, а сейчас у меня есть устройство с поддержкой второй версии, и эмулятор не требуется :-) )&lt;br /&gt;
&lt;br /&gt;
Под катом, как написать простое приложение на&amp;nbsp;&amp;nbsp;OpenGL ES 2.0 для&amp;nbsp;android&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Нам потребуется eclipse, android sdk.&lt;br /&gt;
&lt;br /&gt;
Для создания простейшего приложения, нам потребуется наследовать&amp;nbsp;GLSurfaceView и реализовать интерфейс&amp;nbsp;GLSurfaceView.Renderer.&amp;nbsp;GLSurfaceView - это реализация&amp;nbsp;SurfaceView, которая использует поверхность для отображения результатов OpenGL прорисовки.&amp;nbsp;GLSurfaceView.Renderer интерфейс ответственен за прорисовку.&lt;br /&gt;
&lt;br /&gt;
Важно вызвать&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;setEGLContextClientVersion(2);
&lt;/pre&gt;&lt;br /&gt;
иначе все возможности&amp;nbsp;OpenGL ES 2.0 будут не доступны. В конструкторе поверхности создается реализованный рендерер&amp;nbsp;MyGLRenderer.&lt;br /&gt;
&lt;br /&gt;
Собственно класс&amp;nbsp;SimpleOpenGlView:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;public class SimpleOpenGlView extends GLSurfaceView {
&amp;nbsp;&amp;nbsp;private MyGLRenderer mRenderer=null;
&amp;nbsp;&amp;nbsp;public SimpleOpenGlView(Context context) {
&amp;nbsp;&amp;nbsp; &amp;nbsp;super(context);
&amp;nbsp;&amp;nbsp; &amp;nbsp;mRenderer = new MyGLRenderer(context);
&amp;nbsp;&amp;nbsp; &amp;nbsp;setEGLContextClientVersion(2);
&amp;nbsp;&amp;nbsp; &amp;nbsp;setRenderer(mRenderer);
&amp;nbsp;&amp;nbsp;}
}

&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
А вот класс MyGLRenderer &lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;public class MyGLRenderer implements GLSurfaceView.Renderer {
 private Context mContext=null; 
 public MyGLRenderer(Context context) {
  mContext=context;
 } 
 @Override
 public void onDrawFrame(GL10 glUnused) {  
  GLES20.glClearColor(0.2f, 0.7f, 0.5f, 1.0f);
        GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
 }
 @Override
 public void onSurfaceChanged(GL10 glUnused, int width, int height) {
  GLES20.glViewport(0, 0, width, height);
 }
 @Override
 public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
 }
}
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
Реализованный метод&amp;nbsp;onDrawFrame вызывается каждый раз, когда отрисовывается кадр,&amp;nbsp;onSurfaceChanged вызывается, например, когда размеры поверхности меняются, например, когда устройство поворачивается в пространстве на 90 градусов &amp;nbsp;и изменяется обзор.&amp;nbsp;onSurfaceCreated &amp;nbsp;вызывается когда поверхность создается или пересоздается.&lt;br /&gt;
&lt;br /&gt;
Как можно заметить, у методов есть параметр&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre;&quot;&gt;glUnused&lt;/span&gt;. Он не используется, так как предоставляет доступ к функционалу&amp;nbsp;&amp;nbsp;OpenGL ES 1.x, вместо него используем статические функции&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: monospace; white-space: pre;&quot;&gt;GLES20&lt;/span&gt;. В результате выполнения приложения получается зеленоватый экран.&lt;br /&gt;
&lt;br /&gt;
Да, и не забываем установить нашу поверхность как основной View в главном Activity&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mGLView = new SimpleOpenGlView(this);&lt;br /&gt;
setContentView(mGLView);&lt;br /&gt;
&lt;br /&gt;
Во вложении &lt;a href=&quot;http://www.2shared.com/file/7eQRVJO7/OpenglTemplate.html&quot;&gt;ссылка &lt;/a&gt;на шаблон проекта для android&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</content><link rel='enclosure' type='text/html' href='http://www.2shared.com/file/7eQRVJO7/OpenglTemplate.html' length='0'/><link rel='replies' type='application/atom+xml' href='http://vikulov.blogspot.com/feeds/9039155510075872588/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vikulov.blogspot.com/2011/04/opengl-es-20-android.html#comment-form' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/9039155510075872588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/9039155510075872588'/><link rel='alternate' type='text/html' href='http://vikulov.blogspot.com/2011/04/opengl-es-20-android.html' title='OpenGL ES 2.0 на android. Начало'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07925280476511523382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-455218241342887580.post-671980384442828725</id><published>2011-04-04T13:02:00.003+07:00</published><updated>2011-04-04T17:57:04.264+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="opengl"/><title type='text'>OpenGL ES 2.0: ссылки, примеры</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Здесь будут ссылки на мануалы, примеры для OpenGL ES&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
OpenGL®ES 2.0&amp;nbsp;Programming Guide - обязательна для прочтения (гуглится)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Хороший мануал для начинающих и выше уровнем - &lt;a href=&quot;http://db-in.com/blog/2011/01/all-about-opengl-es-2-x-part-13/&quot;&gt;здесь&lt;/a&gt;. Он действительно лучший из тех, что я читал об OpenGL ES 2.0&lt;/div&gt;</content><link rel='enclosure' type='' href='http://db-in.com/blog/2011/01/all-about-opengl-es-2-x-part-13/' length='0'/><link rel='replies' type='application/atom+xml' href='http://vikulov.blogspot.com/feeds/671980384442828725/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vikulov.blogspot.com/2011/04/opengl-es-20.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/671980384442828725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/671980384442828725'/><link rel='alternate' type='text/html' href='http://vikulov.blogspot.com/2011/04/opengl-es-20.html' title='OpenGL ES 2.0: ссылки, примеры'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07925280476511523382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-455218241342887580.post-636696709571511900</id><published>2011-04-02T22:24:00.000+07:00</published><updated>2011-04-02T22:24:23.391+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><title type='text'>Отладка приложений на реальном android</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Удивительно, но как удобно и быстро можно запускать на моем планшете (и не только на моем) из eclipse проекты andorid. Все очень просто,&amp;nbsp;настраиваем&amp;nbsp;устройство,&amp;nbsp;устанавливаем&amp;nbsp;драйвер&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #333333; font-family: arial, sans-serif; font-size: 13px; line-height: 16px;&quot;&gt;&lt;a href=&quot;http://developer.android.com/sdk/win-usb.html&quot; style=&quot;color: #006699;&quot;&gt;Google Windows USB Driver&lt;/a&gt;.&lt;/span&gt; В манифесте проекта устаналиваем&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: #007000; font-family: monospace; font-size: 13px; line-height: 13px;&quot;&gt;android:debuggable=&quot;true&quot;&lt;/span&gt;, либо через интерфейс редактирвания манифеста, либо вручную. Все. Запускаем и работаем.&lt;br /&gt;
&lt;br /&gt;
Утилита DDMS из папки tools android SDK может делать скриншоты. Вот например мой скриншот:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-1kCn40L5SRODS4g-PCn76iPmD6R777bkn0lfEvb3WxIpiog9tVAePZztv4fCSaKxppT0xgd5cqLZm2Sr1GzCK-AtsTV3wmzx7YxgN20focO8aDl7HgBPy_pACfE2JMIxUlON9ZOjSSg/s1600/device.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-1kCn40L5SRODS4g-PCn76iPmD6R777bkn0lfEvb3WxIpiog9tVAePZztv4fCSaKxppT0xgd5cqLZm2Sr1GzCK-AtsTV3wmzx7YxgN20focO8aDl7HgBPy_pACfE2JMIxUlON9ZOjSSg/s320/device.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vikulov.blogspot.com/feeds/636696709571511900/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vikulov.blogspot.com/2011/04/android.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/636696709571511900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/636696709571511900'/><link rel='alternate' type='text/html' href='http://vikulov.blogspot.com/2011/04/android.html' title='Отладка приложений на реальном android'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07925280476511523382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-1kCn40L5SRODS4g-PCn76iPmD6R777bkn0lfEvb3WxIpiog9tVAePZztv4fCSaKxppT0xgd5cqLZm2Sr1GzCK-AtsTV3wmzx7YxgN20focO8aDl7HgBPy_pACfE2JMIxUlON9ZOjSSg/s72-c/device.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-455218241342887580.post-3128261907365452063</id><published>2011-04-01T16:53:00.001+07:00</published><updated>2011-04-01T16:53:52.269+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="fun"/><title type='text'>Шутки программистов</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Наверное страшный боян, но мне очень нравится:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: c&quot;&gt;//счастливой отладки
#define TRUE FALSE
&lt;/pre&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vikulov.blogspot.com/feeds/3128261907365452063/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vikulov.blogspot.com/2011/04/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/3128261907365452063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/3128261907365452063'/><link rel='alternate' type='text/html' href='http://vikulov.blogspot.com/2011/04/blog-post.html' title='Шутки программистов'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07925280476511523382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-455218241342887580.post-9033115209013221595</id><published>2011-03-31T14:07:00.002+07:00</published><updated>2011-04-01T16:54:27.286+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="TAPI"/><title type='text'>Что такое TAPI и как его готовить</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;&lt;a href=&quot;http://ru.wikipedia.org/wiki/Microsoft_Telephony_API&quot;&gt;TAPI&lt;/a&gt; - это интерфейс прикладного программирования для телефонии. Достаточно мощный API для создания приложений, связанных с телефонией.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Есть три основные версии: 1,2 и 3 :-). Первая и вторая версии представляют собой набор C-style функций, третья же объектно-ориентированная, COM и может быть использована хоть где без особых усилий: .Net, VB, VBS - там, где можно использовать COM объекты.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Вообщем случае, требуется АТС, TSP драйвер от производителя АТС и приложение, использующее API TAPI.&lt;/div&gt;&lt;div&gt;&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Также Microsoft предлагает свой собственный TSP. Получается очень интересная штука. В наличие появляется сервер телефонии (например Windows server 2003 с включенным сервисом &quot;Телефония&quot;). На этом сервере устанавливается и настраивается TSP от производителя АТС. На клиентских хостах уже по умолчанию есть Microsoft TSP &amp;nbsp;- Microsoft Windows Remote Service Provider, и нет необходимости/зависимости от ПО сторонних разработчиков (других TSP).&lt;/div&gt;&lt;div&gt;Включается на стороне клиента командой:&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;&lt;code&gt;tcmsetup /c server&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Теперь на стороне клиента появится список телефонных линий, предоставляемых TSP сторонних АТС, которые доступны на сервере.&lt;br /&gt;
&lt;br /&gt;
Очень подробный список вопросов и ответов по TAPI:&lt;br /&gt;
&lt;a href=&quot;http://www.i-b-a-m.de/Andreas_Marschall&#39;s_TAPI_and_TSPI_FAQ.htm&quot;&gt;здесь&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
а &lt;a href=&quot;http://www.julmar.com/tapi/&quot;&gt;здесь&lt;/a&gt;&amp;nbsp;(Julmar) очень очень хорошие примеры использования TAPI.&lt;br /&gt;
&lt;br /&gt;
Я пользовался&amp;nbsp;&lt;span class=&quot;Apple-style-span&quot; style=&quot;-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; color: #777777; font-family: verdana, arial, sans-serif; font-size: 14px;&quot;&gt;&lt;span class=&quot;in&quot; style=&quot;color: #6b87b0; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;&quot;&gt;&lt;a href=&quot;http://www.julmar.com/tapi/atapi.zip&quot; style=&quot;color: #6b87b0; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;&quot;&gt;ATAPI&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;. Это обертка в объектно ориентированные классы(?) для MFC, но я перенес их для Builder c++ 6. В этой обертке есть баг, но он легко устраняется. Проявляется при отключении/включении телефонии.&lt;br /&gt;
&lt;br /&gt;
Единственная обертка для .Net, которую я нашел и которая достаточно удобна, как раз на этом сайте: &lt;a href=&quot;http://www.julmar.com/tapi/atapinet.zip&quot;&gt;ATAPI.NET&lt;/a&gt;. Исходных кодов не выложили, но есть примеры и все вполне интуитивно. У меня есть небольшой телефон, написанный на .Net платформе, так что если ктонибудь захочет, можно организовать.&lt;br /&gt;
&lt;br /&gt;
Вообще, область применения Tapi очень широка, от написания собственных Call-центров до написания автоматической обзванивающей софтинки, рабочие места операторов/специалистов и написание биллинга/логгера звонков.&lt;br /&gt;
&lt;br /&gt;
вот, например, скриншот моей программы учета звонков:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio1dAM4QptbW0VO5zhnNMVbppiWoIXPPGJskFwXALqGVavYmDK3EGNJZz2RghEHlr1CvDOF-5LXUU4EZDP8V2S3CJmFhkZnLoiBB6_9YuPI_zFdYaAD9K1OP-5eGnn_UzFfF_2KSrYi1E/s1600/logger.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;122&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio1dAM4QptbW0VO5zhnNMVbppiWoIXPPGJskFwXALqGVavYmDK3EGNJZz2RghEHlr1CvDOF-5LXUU4EZDP8V2S3CJmFhkZnLoiBB6_9YuPI_zFdYaAD9K1OP-5eGnn_UzFfF_2KSrYi1E/s320/logger.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vikulov.blogspot.com/feeds/9033115209013221595/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vikulov.blogspot.com/2011/03/tapi.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/9033115209013221595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/9033115209013221595'/><link rel='alternate' type='text/html' href='http://vikulov.blogspot.com/2011/03/tapi.html' title='Что такое TAPI и как его готовить'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07925280476511523382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio1dAM4QptbW0VO5zhnNMVbppiWoIXPPGJskFwXALqGVavYmDK3EGNJZz2RghEHlr1CvDOF-5LXUU4EZDP8V2S3CJmFhkZnLoiBB6_9YuPI_zFdYaAD9K1OP-5eGnn_UzFfF_2KSrYi1E/s72-c/logger.png" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-455218241342887580.post-5482867483319180099</id><published>2011-03-30T16:03:00.003+07:00</published><updated>2011-03-31T10:13:09.410+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="tablet PC"/><title type='text'>Китайский &quot;Убийца iPad&quot;</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;После месячного ожидания &amp;nbsp;наконец таки пришла посылка&amp;nbsp;&amp;nbsp;из Гонгконга&amp;nbsp;с моим &lt;a href=&quot;http://www.aliexpress.com/product-gs/353714531-freescale-8-inch-Tablet-pc-1Ghz-512-MB-memory-Android-2-2-free-shipping-wholesalers.html&quot;&gt;планшетом-андроидом&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Из плюсов:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;android 2.2&lt;/li&gt;
&lt;li&gt;G-сенсор&lt;/li&gt;
&lt;li&gt;вполне ничего видео&amp;nbsp;&lt;/li&gt;
&lt;li&gt;8&quot;&lt;/li&gt;
&lt;li&gt;шустренький&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Из минусов:&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;тачскрин НЕ мультитач&lt;/li&gt;
&lt;li&gt;процессор 800 MHz, а не 1000 MHz&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;Даже учитывая минусы я крайне доволен этим аппаратом. Еще не проверял, как будет работать разработка в эклипсе на нем, и я так и не понял насчет поддержки OpenGL ES 2.0&lt;br /&gt;
&lt;br /&gt;
UPDATE:&lt;br /&gt;
&lt;br /&gt;
OpenGL ES 2.0 есть!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vikulov.blogspot.com/feeds/5482867483319180099/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vikulov.blogspot.com/2011/03/ipad.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/5482867483319180099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/5482867483319180099'/><link rel='alternate' type='text/html' href='http://vikulov.blogspot.com/2011/03/ipad.html' title='Китайский &quot;Убийца iPad&quot;'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07925280476511523382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-455218241342887580.post-4559971690899454259</id><published>2011-03-30T11:32:00.005+07:00</published><updated>2011-04-01T17:14:05.859+07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="asterisk"/><category scheme="http://www.blogger.com/atom/ns#" term="UccAPI"/><title type='text'>Использование Microsoft UCCAPI вместе с asterisk</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Появилась задачка написать SIP телефон используя .Net, который бы мог работать с астериском (asterisk). Встал вопрос что использовать. Погуглив на предмет опенсорсных инструментов, нашел различные стеки SIP&#39;а на C#, но без реализации RTP стека. Есть полностью готовые к использованию стеки с возможностью потокового аудио/видео, но чаще всего они платные. Ну нет совершенно желания платить денежку :-)&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Наткнулся на&amp;nbsp;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb878684(v=office.12).aspx&quot;&gt;Microsoft UCCAPI&lt;/a&gt;. Появился он (оно?) как средство для создания альтернативного клиента Microsoft&amp;nbsp;Communicator, для общения с  Microsoft Office Communications Server 2007,&amp;nbsp;ну и соответственно между&amp;nbsp;Communicator&#39;ами.&lt;br /&gt;
&lt;br /&gt;
Хороший пример использования&amp;nbsp;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb878684(v=office.12).aspx&quot;&gt;Microsoft UCCAPI&lt;/a&gt;&amp;nbsp;можно найти в &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb878684(v=office.12).aspx&quot;&gt;SDK&lt;/a&gt;. Называется он IMVoIPSample.&lt;br /&gt;
&lt;br /&gt;
Особенность реализации стека SIP от Microsoft, то что он подключается (общается) к серверу только через TCP&lt;br /&gt;
&lt;br /&gt;
Итогом изучения&amp;nbsp;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb878684(v=office.12).aspx&quot;&gt;Microsoft UCCAPI&lt;/a&gt;&amp;nbsp;явилась небольшая программка, которая может позвонить на любой SIP телефон, звонит на АТСку, которая привязана к asterisk, принимает входящие звонки, настраивает аудио каналы для общения.&lt;br /&gt;
&lt;br /&gt;
Проблемы, с которыми я столкнулся:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;при входящем звонке на мой созданный &amp;nbsp;SIP телефон,&amp;nbsp;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/bb878684(v=office.12).aspx&quot;&gt;Microsoft UCCAPI&lt;/a&gt;&amp;nbsp;не возвращает OK. Проявляется это отсутствием гудков дозвона при звонке с АТС. Решается явным указанием звонка в плане asterisk.&lt;br /&gt;
&lt;br /&gt;
exten =&amp;gt; _6.,1,Ringing&lt;br /&gt;
exten =&amp;gt; _6.,n,Dial(SIP/${EXTEN:0})&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;настройка аудио кодеков. Необходимо явно ограничить используемые кодеки в астериск&lt;/li&gt;
&lt;li&gt;авторизация клиента на астериске&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vikulov.blogspot.com/feeds/4559971690899454259/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://vikulov.blogspot.com/2011/03/microsoft-uccapi.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/4559971690899454259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/455218241342887580/posts/default/4559971690899454259'/><link rel='alternate' type='text/html' href='http://vikulov.blogspot.com/2011/03/microsoft-uccapi.html' title='Использование Microsoft UCCAPI вместе с asterisk'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/07925280476511523382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>