45.htm 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <!--
  2. demo.design 3D programming FAQ
  3. Idea, texts, screenshots:
  4. Andrew A. Aksyonoff,
  5. shodan@chat.ru
  6. Web-design, illustrations:
  7. Andrey Samoilov,
  8. asy@sense.simbirsk.su
  9. -->
  10. <html>
  11. <head>
  12. <title>demo.design 3D programming FAQ. Текстурирование. Билинейная фильтрация текстур.</title>
  13. <link rel=stylesheet href="../style.css" type="text/css">
  14. </head>
  15. <script language="javascript">
  16. <!--//
  17. browser = navigator.appName;
  18. version = parseFloat(navigator.appVersion);
  19. if (browser == "Netscape" && version >= 3.0) { jsenabled = 1; } else
  20. if (browser == "Microsoft Internet Explorer" && version >= 3.0) { jsenabled = 1; } else { jsenabled = 0; }
  21. function swap(img,ref) { if (jsenabled) {document.images[img].src = ref;} }
  22. function loadtocache(img,ref) { cache[img] = new Image(); cache[img].src = ref; }
  23. if (jsenabled) {
  24. cache = new Array();
  25. loadtocache(0,"../img/xdl.gif");
  26. loadtocache(1,"../img/xfaq.gif");
  27. loadtocache(2,"../img/xlinks.gif");
  28. loadtocache(3,"../img/xauthor.gif");
  29. loadtocache(4,"../img/xe.gif");
  30. loadtocache(5,"../img/xprev.gif");
  31. loadtocache(6,"../img/xnext.gif");}
  32. //-->
  33. </script>
  34. <body bgcolor=white><center>
  35. <!-- Title -->
  36. <img src="../img/b.gif" width=500 height=1 alt=""><br>
  37. <img src="../img/t.gif" width=500 height=1 alt=""><br>
  38. <img src="../img/b.gif" width=500 height=1 alt=""><br>
  39. <img src="../img/t.gif" width=500 height=2 alt=""><br>
  40. <table width=500 cellpadding=0 cellspacing=0 border=0>
  41. <td><img src="../img/t.gif" width=5 height=1 alt=""><a href="../main.htm" onmouseover="swap('logo','../img/xe.gif');" onmouseout="swap('logo','../img/e.gif');"><img src="../img/e.gif" name=logo width=60 height=50 hspace=10 border=0 alt=" в самое начало "></a></td>
  42. <td><p class=pagetitle><img src="../img/t.gif" width=265 height=1 alt=""><br>demo.design<br>3D programming FAQ</td>
  43. <td align=center><p class=navy><a href="../download.htm" onmouseover="swap('dl','../img/xdl.gif');" onmouseout="swap('dl','../img/dl.gif');"><img src="../img/dl.gif" name=dl width=40 height=40 border=0 hspace=5 alt=" download "></a><br>download</td>
  44. <td align=center><p class=navy><a href="../links.htm" onmouseover="swap('links','../img/xlinks.gif');" onmouseout="swap('links','../img/links.gif');"><img src="../img/links.gif" name=links width=40 height=40 border=0 hspace=5 alt=" коллекция линков "></a><br>links</td>
  45. <td align=center><p class=navy><a href="../author.htm" onmouseover="swap('author','../img/xauthor.gif');" onmouseout="swap('author','../img/author.gif');"><img src="../img/author.gif" name=author width=40 height=40 border=0 hspace=5 alt=" автора! "></a><br>author</td>
  46. </table>
  47. <img src="../img/t.gif" width=500 height=4 alt=""><br><img src="../img/b.gif" width=500 height=1 alt=""><br>
  48. <!-- Head -->
  49. <table width=500 cellpadding=0 cellspacing=10 border=0><td><div align=justify>
  50. <p class=title>
  51. <img src="../img/b4.gif" width=70 height=70 align=left hspace=0 alt="">
  52. <img src="../img/t.gif" width=5 height=70 align=left hspace=0 alt="">
  53. ТЕКСТУРИРОВАНИЕ<br>4.5. Билинейная фильтрация текстур
  54. <!-- Article -->
  55. <p>Да-да, это именно тот метод, с помощью которого смазывают текстуры всякие
  56. ускорители типа 3Dfx. Итак, пусть у нас есть какая-то текстура. Текстура у
  57. нас - это 2D картинка, а 2D картинка в свою очередь - набор замеров цвета
  58. через какие-то промежутки. В реальной же жизни цвет не меняется скачком
  59. через каждый, например, миллиметр, а является какой-то непрерывной функцией
  60. от положения, причем меняется довольно плавно. При обычном текстурировании
  61. мы получаем координаты в текстуре, округляем их до ближайшего целого числа
  62. и выбираем нужный цвет из текстуры. То есть мы как бы берем значение цвета
  63. в самой близкой к рисуемой точке сетки замеров цвета, поэтому у нас цвет
  64. резко меняется, оставаясь непрерывным между узлами сетки, поэтому возникает
  65. эффект больших квадратов.
  66. <p>При билинейной фильтрации цвет всего-навсего линейно интерполируется между
  67. узлами сетки замеров. То есть. Пусть в текущей точке у нас получились
  68. координаты текстуры u, v - какие-то нецелые, вообще говоря, числа. Тогда
  69. по целым частям u, v определяется, между какими узлами сетки (если угодно,
  70. между какими пикселами текстуры) находится наша точка, а по дробным - как
  71. близко она находится к каждому из узлов. Вот картинка.
  72. <p><center><img src="illu/illu45a.gif" width=180 height=180 alt="рисунок (illu/illu45a.gif)"></center>
  73. <p>Здесь 1, 2, 3, 4 - "окружающие" точку пикселы текстуры (они же узлы сетки
  74. замера цвета). Пусть iu, iv - целые части координат текстуры точки u, v; fu,
  75. fv - дробные части. Тогда 1, 2, 3, 4 имеют координаты в текстуре (iu,iv),
  76. (iu+1,iv), (iu,iv+1), (iu+1,iv+1). Проинтерполируем какую-то компоненту
  77. цвета (R, G или B) по прямым 1-3 и 2-4:
  78. <p class=expression>a.c = 1.c + (3.c - 1.c) * fv,<br>
  79. b.c = 2.c + (4.c - 2.c) * fv,<br>
  80. <p>то есть
  81. <p class=expression>a.c = c[iu][iv] + (c[iu][iv+1] - c[iu][iv]) * fv,<br>
  82. b.c = c[iu+1][iv] + (c[iu+1][iv+1] - c[iu+1][iv]) * fv,<br>
  83. <p>Теперь проинтерполируем цвет по прямой ab в нашей точке:
  84. <p class=expression>c = a.c + b.c * fu,<br>
  85. <p>Проинтерполировав по этой формуле каждую компоненту цвета, получим наконец
  86. готовый результат - цвет точки, но уже с учетом билинейной фильтрации.
  87. <p>Здесь у нас получилось по три умножения на компоненту. То есть в сумме девять
  88. умножений на пиксел. Можно, конечно, честно считать по этим формулам, делая
  89. девять умножений для каждого пиксела. Но можно заменить все умножения на
  90. выборки по таблице. u, v обычно - это fixedpoint; fu, fv - тоже (кстати, в
  91. случае с fixedpoint целые и дробные части вычисляются ровно одним and'ом).
  92. Пусть мы используем 24-битный цвет и 16:16 fixedpoint; тогда одна компонента
  93. цвета занимает 8 бит, а дробную часть можно одним сдвигом перевести в 24:8
  94. fixedpoint. Получаем 256 возможных значений для любой компоненты цвета и 256
  95. возможных значений для дробной части, то есть - табличка 256x256. Если цвет
  96. 15/16-битный, или используется более грубое (скажем, до пяти бит) округление
  97. дробной части, то табличка становится еще меньше. Памяти, конечно, не жалко,
  98. но кэш-память пока не резиновая, так что чем меньше lookup-таблица, тем оно
  99. лучше для скорости. Вот и все.
  100. <p>Осталось только упомянуть, что лучше занести в табличку не байты, а слова,
  101. для данного примера это будет 8:8 fixedpoint, и складывать все результаты
  102. тоже как слова, а потом сдвигом переводить обратно в целые числа. Иначе
  103. (особенно в случае 15/16-битных режимов) будет заметен небольшой шум на
  104. текстуре, появляющийся из-за ошибок округления.
  105. </div>
  106. </td></table>
  107. <!-- Bottom Navigation -->
  108. <img src="../img/b.gif" width=500 height=1 alt=""><br><img src="../img/t.gif" width=500 height=2 alt=""><br>
  109. <table width=500 cellpadding=0 cellspacing=0 border=0>
  110. <td><img src="../img/t.gif" width=5 height=1 alt=""><a href="../main.htm" onmouseover="swap('logo2','../img/xe.gif');" onmouseout="swap('logo2','../img/e.gif');"><img src="../img/e.gif" name=logo2 width=60 height=50 hspace=10 border=0 alt=" в самое начало "></a></td>
  111. <td><p class=pagetitle><img src="../img/t.gif" width=265 height=1 alt=""><br>demo.design<br>3D programming FAQ</td>
  112. <td align=center><p class=navy><a href="44.htm" onmouseover="swap('prev','../img/xprev.gif');" onmouseout="swap('prev','../img/prev.gif');"><img src="../img/prev.gif" name=prev width=40 height=40 border=0 hspace=5 alt=" предыдущая статья "></a><br>previous</td>
  113. <td align=center><p class=navy><a href="../content.htm" onmouseover="swap('faq','../img/xfaq.gif');" onmouseout="swap('faq','../img/faq.gif');"><img src="../img/faq.gif" name=faq width=40 height=40 border=0 hspace=5 alt=" содержание "></a><br>content</td>
  114. <td align=center><p class=navy><a href="46.htm" onmouseover="swap('next','../img/xnext.gif');" onmouseout="swap('next','../img/next.gif');"><img src="../img/next.gif" name=next width=40 height=40 border=0 hspace=5 alt=" следующая статья "></a><br>next</td>
  115. </table>
  116. <img src="../img/t.gif" width=500 height=4 alt=""><br>
  117. <img src="../img/b.gif" width=500 height=1 alt=""><br>
  118. <img src="../img/t.gif" width=500 height=1 alt=""><br>
  119. <img src="../img/b.gif" width=500 height=1 alt=""><br>
  120. </center></body>
  121. </html>