Z-буфер

Страницы работы

Содержание работы

Z-buffer - Z-буфер

Z-buffering can be used as sorting routines, but it is also used when you have to mix two objects together. That way, it looks like the objects are melting together, and gives a nice effect. Z-bufering can also be used as sorting, in fact it is just as fast as any other sorting, that only sorts the z value. Now, there are two ways of doing the z-buffer correct. One way, uses scanlines, and detects what faces are seen, the other just checks if the pixel you are about to plot have a higher z value that the one in your zbuffer array, or else it shouldnt plot it. The first way wont be commented here, but the second is fairly easy to explain.

Z-буферизация может использоваться как подпрограмма сортировки, но она также используется, когда Вы должны смешать два объекта вместе. Этим способом, это походит на объекты,  сплавленые вместе, и дает хороший эффект. Z-буферизация может также использоваться как сортировка, фактически она быстрее, чем любая другая сортировка, она только сортирует значение z. Теперь, имеются два способа выполнения правильного z-буфера. Один способ, использует растровые строки, и обнаруживает видимые плоскости, другой только проверяет, если пиксел, который Вы собираетесь нарисовать имеет значение выше, чем-то которое в вашем z-буфер массиве, или иначе рисовать. Первый способ не будет рассмотрен, но второй довольно прост, чтобы объяснить его.

Now, for a start we make a new buffer, lets call it zbuffer. This array must contain as many elements as there are pixels on the screen. The size of each element can vary from bytes (-127..128) to floats, depending on the size of the object and how precise the zbuffer should be. This buffer contains every z value in the screen, which means this is ideal for gouraud shading. We just change our hline routine to fill zvalues in the zbuffer and check the pixel we are about to plot have a higher zvalue. this would look like this:

Теперь, для начала мы делаем новый буфер, давайте назовем его - zbuffer. Этот массив должен содержать так много элементов сколько имеется пикселов на экране. Размер каждого элемента может изменяться в пределах  байта (-127 .. 128), в зависимости от размера объекта и насколько точным,  zbuffer должен быть. Этот буфер содержит все z значения на экране, а это означает, что это идеально для Гуро - оттенения. Мы только заменяем нашу hline подпрограмму, чтобы заполнить zvalues в zbuffer и проверять пиксел, который мы собираемся рисовать имеет ли он значение выше zvalue. Это выглядело следующим образом:

for (y=y1;y<y2;y++)

{

x += xslope;

z += zslope;

xpos[y][side] = x;

if (zbuffer[x+y*320] y< z)

{

zpos[y][side] = z;

zbuffer[x+y*320] = z;

}

}

All we need to do for every cycle is to clear the zbuffer with the lowest value we want. Actually, a zbuffer value of zero could give a very nice effect. Imagine an object with the position of 0,0,0. This object could be a box, which rotates in all direction. Now, with a zbuffer value of zero, this object would look like it was drowning in the background. With a higher value, this effect would be more visible and an object that comes from nonvisible to completly visible, would make a great effect.

Все, что мы должны делать для каждого цикла, должны очистить zbuffer с самым низким значением, которое мы хотим. Фактически, значение zbuffer нуля могло бы давать очень хороший эффект. Вообразите объект с позицией 0,0,0. Этот объект мог бы быть куб, который вращается во всех направлениях. Теперь, со значением zbuffer нуля, этот объект тонул бы на заднем плане. С более высоким значением, этот эффект был бы более видим и объект, который переходит от невидимого к полностью видимому, делал бы большой эффект.

Информация о работе