Наверняка сталкивались с такой проблемой. Как её решить? Прикладываю видео. Также код могу продублировать.
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 } }
текстура с прозрачностью перекрывает другой объект
Попробовать рисовать все объекты, а потом уже в конце текстуру.
Иногда последовательность в рендере объектов играет роль.
У тебя точно 3д текстура, а не 2д ?
v7
У меня есть идея
Кури урхо3д
Нет, текстура 2d, она накладывается на квадрат из двух треугольников.
innuendo
Написал бы по-английски название, а то непонятно. Да, и кстати, я видел что мне постоянно предлагают готовыми движками пользоваться. Так нельзя делать. Я имею ввиду мне и другим, кто хоть как-то, но делает их. Потому что если у нас не останется движко писателей, то будут проблемы. Какая например? Разработчики готовых движков смогут диктовать свои условия и вы будете зависеть от них, потому что кроме логики игр ничего не умеете. Но может ты и умеешь что-нибудь делать, но я останавливаться не хочу и лучше не продолжать холивар.
v7
Пишу в последний раз
Кури urho3d
Нет, текстура 2d, она накладывается на квадрат
Вот.
Рисовать все объекты, а потом уже в конце рендера выводить квадрат с текстурой.
И следи за дептч установками, чтобы не отключить дептч тест.
innuendo
> Пишу в последний раз
Ах, если бы.
Вот.
Рисовать все объекты, а потом уже в конце рендера выводить квадрат с текстурой.
А почему так?
Сделал черный фон у спрайта и увидел, что он закрывает весь экран, половину экрана. видимо размеры стоят не те, ну да, стоят то размеры спрайта, а мне нужны размеры в 3d
Можно ли интересно рисовать 3d объекты, которые находятся за другим объектом? Я знаю что opengl вроде как отсекает такую возможность, но всё же, может вы знаете, потому что выключать DEPTH_TEST не подходит, надо чтобы объект с прозрачным спрайтом рисовался. Блин, а если нельзя, то можно просто создать такой объект как в спрайте и его использовать для рисования.
Но как тогда в unity система частиц со спрайтами так работает?
glDepthMask(false) ставь на время рисования частиц.
А если она будет вокруг головы крутиться, то голова тоже будет перерисовываться? хотя сейчас попробую.
Dimich
> glDepthMask(false) ставь на время рисования частиц.
Совершенно неправильно. Нужно отсортировать полупрозрачное и рисовать
С дептх тестом, этож общеизвестно.