Войти
ПрограммированиеFAQ

Не получается нарисовать на экране треугольник. Когда я пробовал выводить точки с теми же координатами, что и вершины треугольника, их было видно! В чем дело?!

Здесь culling делает свое черное дело :) У каждого треугольника есть лицевая и тыльная стороны. Для увеличения производительности в графических библиотеках есть возможность отбраковки (culling) тыльных сторон треугольников (при большом желании, можно заставить делать отбраковку лицевых сторон). Но как компьютер узнает, какая сторона у полигона лицевая, а какая тыльная, если мы передаем ему всего лишь массив вершин? Очевидно, по порядку следования вершин в массиве! Например, можно определить лицевую сторону полигона, располагая его вершины в массиве так, чтобы они задавали полигон по часовой стрелке (clockwise, CW), или против часовой стрелки (counterclockwise, CCW). Для начала, чтобы лучше понять принцип отбраковки, рекомендую отключить culling вообще, а затем, поэкспериментировав, настроить все "под себя".

D3D 8.0
По умолчанию отбраковываются тыльные стороны полигонов, задающиеся против часовой стрелки (D3DCULL_CCW). Чтобы отбраковывать полигоны, задающиеся по часовой стрелке, нужно сделать следующее:
d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
Вообще отключить culling можно так:
d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

OpenGL
По умолчанию отбраковываются тыльные стороны полигонов (GL_BACK), что можно с легкостью изменить:
glCullFace(GL_FRONT);
Лицевой стороной, по умолчанию, считается сторона, заданная против часовой стрелки (GL_CCW). Для изменения выбора лицевой стороны на противоположную:
glFrontFace(GL_CW);
Вообще отключить culling можно так:
glDisable(GL_CULL_FACE);

7 августа 2005