Как я создаю дешевые тени в OpenGL?

Если бы Вы не знаете тип во время проектирования, я сказал бы, что у Вас есть список ОБЪЕКТОВ (базовый класс для всех других типов).

List<object> list = new List<object>();
15
задан Martin 11 July 2009 в 21:57
поделиться

2 ответа

Я думаю, что на самом деле проще реализовать правильные тени, потому что OpenGL может сделать эту работу за вас.

Я нашел здесь рабочий код теней с большим количеством документации: http: / /www.opengl.org/resources/code/samples/mjktips/TexShadowReflectLight.html

Приведенный выше код визуализирует объект дважды: сначала обычно, затем с помощью специальной матрицы. Он выполняет множество не связанных между собой вещей, таких как управление мышью и отражения. Итак, вот интересные части.

Это вычисляет теневую матрицу:

/* Create a matrix that will project the desired shadow. */
void
shadowMatrix(GLfloat shadowMat[4][4],
  GLfloat groundplane[4],
  GLfloat lightpos[4])
{
  GLfloat dot;

  /* Find dot product between light position vector and ground plane normal. */
  dot = groundplane[X] * lightpos[X] +
    groundplane[Y] * lightpos[Y] +
    groundplane[Z] * lightpos[Z] +
    groundplane[W] * lightpos[W];

  shadowMat[0][0] = dot - lightpos[X] * groundplane[X];
  shadowMat[1][0] = 0.f - lightpos[X] * groundplane[Y];
  shadowMat[2][0] = 0.f - lightpos[X] * groundplane[Z];
  shadowMat[3][0] = 0.f - lightpos[X] * groundplane[W];

  shadowMat[X][1] = 0.f - lightpos[Y] * groundplane[X];
  shadowMat[1][1] = dot - lightpos[Y] * groundplane[Y];
  shadowMat[2][1] = 0.f - lightpos[Y] * groundplane[Z];
  shadowMat[3][1] = 0.f - lightpos[Y] * groundplane[W];

  shadowMat[X][2] = 0.f - lightpos[Z] * groundplane[X];
  shadowMat[1][2] = 0.f - lightpos[Z] * groundplane[Y];
  shadowMat[2][2] = dot - lightpos[Z] * groundplane[Z];
  shadowMat[3][2] = 0.f - lightpos[Z] * groundplane[W];

  shadowMat[X][3] = 0.f - lightpos[W] * groundplane[X];
  shadowMat[1][3] = 0.f - lightpos[W] * groundplane[Y];
  shadowMat[2][3] = 0.f - lightpos[W] * groundplane[Z];
  shadowMat[3][3] = dot - lightpos[W] * groundplane[W];

}

Я не претендую на полное понимание этого. lightpos - это положение источника света. Первые 3 координаты плоскости земли - это нормальный вектор поверхности земли. Четвертый - смещение (как далеко от 0,0,0).

И эта часть фактически отображает тень:

9
ответ дан 1 December 2019 в 05:02
поделиться

Эта статья , кажется, покрывает ваши требования, используя OpenGL и аппаратное ускорение для создания подробной карты теней.

Если бы я пытался выполнить это, у меня возникло бы искушение использовать литье лучей. Для каждого треугольника в B создайте вектор от треугольника к свету. Если он попадает во что-нибудь на своем пути, он находится в тени. Это было бы медленно, если бы вы не использовали приличную структуру ускорения и быстрый тест на попадание в треугольник. Мне нравятся иерархии ограничивающих объемов ; многие программы также используют их для обнаружения столкновений.

0
ответ дан 1 December 2019 в 05:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: