Как DirectX определяет порядок намотки?

Как DirectX определяет порядок намотки полигонов? В частности, меня интересует отбраковка задней поверхности. Изучив это, я увидел, что он предполагает, что DX вычисляет нормаль к поверхности и берет скалярное произведение этого и вектора камеры и отбраковывает, если он > 0.

Во-первых, это та техника, которую на самом деле использует DirectX? Во-вторых, если это так, учитывая, что к каждой поверхности есть две нормали — одна напротив другой — как DirectX узнает, какую нормаль использовать?


person Justin R.    schedule 27.11.2013    source источник


Ответы (1)


Нет, это не используемый метод, ни opengl, ни directx не имеют концепции вектора обзора камеры. Что происходит, так это то, что вершины преобразуются в пространство с нормализованными координатами устройства (сначала позволяя пользователю преобразовать в постпроективное пространство в вершинном шейдере, а затем разделив компоненты xyz на w). В этой системе координат мы можем использовать компоненты x и y вершин для вычисления «площади со знаком» треугольника.

    float signedArea = 0;   
    for( int k = 1; k < output->count; k++ ) {
        signedArea += (output->vertices[k - 1].values[0] * output->vertices[k - 0].values[1]);
        signedArea -= (output->vertices[k - 0].values[0] * output->vertices[k - 1].values[1]);
    }

В зависимости от того, оцениваются ли вершины по часовой стрелке или против часовой стрелки, они дают положительную или отрицательную площадь. Если смотреть на треугольник сзади, положительная площадь станет отрицательной, и наоборот. И это значение впоследствии используется при определении того, следует ли растеризовать передний, задний или оба треугольника, обращенные к шрифту и обратно.

person Lawrence Kok    schedule 27.11.2013