Войти
ПрограммированиеФорумГрафика

2d текстура с прозрачностью на 3d поверхности перекрывает другой объект

#0
18:08, 18 мар 2023

Наверняка сталкивались с такой проблемой. Как её решить? Прикладываю видео. Также код могу продублировать.

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

ParticleSleepAttack::ParticleSleepAttack(): Particle(SHADER_PARTICLE_SLEEP_ATTACK_START)
{
  vao = new uint32_t[1];
  vbo = new uint32_t[1];

  uint32_t count = 5000;

  vdata = downloader_load_sprite_center(SLEEP_CLOUD);


  glGenVertexArrays(1, vao);
  glGenBuffers(1, vbo);
  glBindVertexArray (vao[0]);
  glBindBuffer (GL_ARRAY_BUFFER, vbo[0]);
  glBufferData (GL_ARRAY_BUFFER, sizeof (float) * vdata->size, vdata->f[0], GL_DYNAMIC_DRAW);

  glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, sizeof (float) * 5, (void *) 0);
  glEnableVertexAttribArray (0);

  glVertexAttribPointer (1, 2, GL_FLOAT, GL_FALSE, sizeof (float) * 5, (void *) 0);
  glEnableVertexAttribArray (1);

  max_vertex = 6;
  vdata->size = sizeof (float) * vdata->size;

  tm = timer_init(1);

  astep = new double[size_particles];
  positions.resize(size_particles);
  translates.resize(size_particles);
  rotates.resize(size_particles);

  Camera *camera = Camera::getInstance();

  glm::vec3 cpos = camera->pos;

  double pa = 0.0;
  uint32_t pq = 0;
  for (int i = 0; i < size_particles; i++) {
    astep[i] = pa;
    double px = cos(pa);
    double pz = sin(pa);
    glm::vec3 pp(px, 1.f, pz);
    positions[i] = pp;

    translates[i] = glm::translate(model, pp);

    pq += 20;
    pa = static_cast<double>(pq);

#if 1
    glm::quat q = glm::quatLookAt(cpos, glm::vec3(0.0f, 1.f, 0.f));

    float angleRad = glm::radians(static_cast<float>(90));
      glm::vec3 axisNorm = glm::normalize(glm::vec3(0.f, 1.f, 0.f));

      float w = glm::cos(angleRad);
      float v = glm::sin(angleRad);
      glm::vec3 qv = axisNorm * v;

    glm::quat qua(w, qv);
    glm::quat zz = glm::normalize(qua);

    printf ("%f %f %f %f\n", q.x, q.y, q.z, q.w);

    q += qua;
    q = glm::normalize(q);
    printf ("%f %f %f %f\n", q.x, q.y, q.z, q.w);
    rotates[i] = glm::mat4_cast(q);
#else
    rotates[i] = glm::mat4(1.f);
#endif
  }
}

#include <stdio.h>
void ParticleSleepAttack::step ()
{
  Camera *camera = Camera::getInstance();

  glm::vec3 cpos = camera->pos;

  printf ("cpos: %f %f %f\n", cpos.x, cpos.y, cpos.z);
  
  double pa = 0.0;

  for (int i = 0; i < size_particles; i++) {
#if 0
    double px = cos(pa);
    double pz = sin(pa);
    glm::vec3 pp(px, 0.f, pz);
    positions[i] = pp;

    translates[i] = glm::translate(model, pp);

    pq += 10;
    pa = static_cast<double>(pq);
#endif

#if 1
    glm::quat q = glm::quatLookAt(cpos, glm::vec3(0.0f, 1.f, 0.f));

    float angleRad = glm::radians(static_cast<float>(90));
      glm::vec3 axisNorm = glm::normalize(glm::vec3(0.f, 1.f, 0.f));

      float w = glm::cos(angleRad);
      float v = glm::sin(angleRad);
      glm::vec3 qv = axisNorm * v;

    glm::quat qua(w, qv);
    glm::quat zz = glm::normalize(qua);

    printf ("%f %f %f %f\n", q.x, q.y, q.z, q.w);

    q += glm::normalize(qua);
    q = glm::normalize(q);
    printf ("%f %f %f %f\n", q.x, q.y, q.z, q.w);
    
    rotates[i] = glm::mat4_cast(q);
#endif
  }
}
#1
(Правка: 18:51) 18:36, 18 мар 2023

текстура с прозрачностью перекрывает другой объект

Попробовать рисовать все объекты, а потом уже в конце текстуру.
Иногда последовательность в рендере объектов играет роль.

У тебя точно 3д текстура, а не 2д ?

#2
19:16, 18 мар 2023

v7
У меня есть идея
Кури урхо3д

#3
19:17, 18 мар 2023

Нет, текстура 2d, она накладывается на квадрат из двух треугольников.

#4
19:23, 18 мар 2023

innuendo

Написал бы по-английски название, а то непонятно. Да, и кстати, я видел что мне постоянно предлагают готовыми движками пользоваться. Так нельзя делать. Я имею ввиду мне и другим, кто хоть как-то, но делает их. Потому что если у нас не останется движко писателей, то будут проблемы. Какая например? Разработчики готовых движков смогут диктовать свои условия и вы будете зависеть от них, потому что кроме логики игр ничего не умеете. Но может ты и умеешь что-нибудь делать, но я останавливаться не хочу и лучше не продолжать холивар.

#5
19:51, 18 мар 2023

v7
Пишу в последний раз
Кури urho3d

#6
21:47, 18 мар 2023

Нет, текстура 2d, она накладывается на квадрат

Вот.
Рисовать все объекты, а потом уже в конце рендера выводить квадрат с текстурой.
И следи за дептч установками, чтобы не отключить дептч тест.

#7
5:34, 19 мар 2023

innuendo
> Пишу в последний раз

Ах, если бы.

#8
6:32, 19 мар 2023

Вот.
Рисовать все объекты, а потом уже в конце рендера выводить квадрат с текстурой.

А почему так?

#9
7:42, 19 мар 2023

Сделал черный фон у спрайта и увидел, что он закрывает весь экран, половину экрана. видимо размеры стоят не те, ну да, стоят то размеры спрайта, а мне нужны размеры в 3d

#10
8:21, 19 мар 2023

Можно ли интересно рисовать 3d объекты, которые находятся за другим объектом? Я знаю что opengl вроде как отсекает такую возможность, но всё же, может вы знаете, потому что выключать DEPTH_TEST не подходит, надо чтобы объект с прозрачным спрайтом рисовался. Блин, а если нельзя, то можно просто создать такой объект как в спрайте и его использовать для рисования.

#11
8:24, 19 мар 2023

Но как тогда в unity система частиц со спрайтами так работает?

#12
10:42, 19 мар 2023

glDepthMask(false) ставь на время рисования частиц.

#13
10:46, 19 мар 2023

А если она будет вокруг головы крутиться, то голова тоже будет перерисовываться? хотя сейчас попробую.

#14
21:15, 19 мар 2023

Dimich
> glDepthMask(false) ставь на время рисования частиц.
Совершенно неправильно. Нужно отсортировать полупрозрачное и рисовать
С дептх тестом, этож общеизвестно.

ПрограммированиеФорумГрафика