DirectX 9 точечных спрайтов без масштабирования

У меня точечные спрайты работают почти сразу, но я застрял только в одном: они отображаются как спрайты 2×2 пикселей, что на самом деле не очень легко увидеть, особенно если есть другое движение. Теперь я попытался настроить все переменные, вот код, который, вероятно, работает лучше всего:

void renderParticles()
{
for(int i = 0; i < particleCount; i ++)
{
particlePoints[i] += particleSpeeds[i];
}

void* data;
pParticleBuffer->Lock(0, particleCount*sizeof(PARTICLE_VERTEX), &data, NULL);
memcpy(data, particlePoints, sizeof(particlePoints));
pParticleBuffer->Unlock();

pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
pd3dDevice->SetRenderState(D3DRS_POINTSPRITEENABLE, TRUE);
pd3dDevice->SetRenderState(D3DRS_POINTSCALEENABLE, TRUE);
pd3dDevice->SetRenderState(D3DRS_POINTSIZE, (DWORD)1.0f);
//pd3dDevice->SetRenderState(D3DRS_POINTSIZE_MAX, (DWORD)9999.0f);
//pd3dDevice->SetRenderState(D3DRS_POINTSIZE_MIN, (DWORD)0.0f);
pd3dDevice->SetRenderState(D3DRS_POINTSCALE_A, (DWORD)0.0f);
pd3dDevice->SetRenderState(D3DRS_POINTSCALE_B, (DWORD)0.0f);
pd3dDevice->SetRenderState(D3DRS_POINTSCALE_C, (DWORD)1.0f);

pd3dDevice->SetStreamSource(0, pParticleBuffer, 0, sizeof(D3DXVECTOR3));
pd3dDevice->DrawPrimitive(D3DPT_POINTLIST, 0, particleCount);

pd3dDevice->SetRenderState(D3DRS_POINTSPRITEENABLE, FALSE);
pd3dDevice->SetRenderState(D3DRS_POINTSCALEENABLE, FALSE);

}

Хорошо, когда я переоденусь POINTSCALE_A а также POINTSCALE_BНичего особо не меняется, то же самое для C. POINTSIZE также не имеет значения. Когда я пытаюсь назначить что-то POINTSIZE_MAX а также _MINнезависимо от того, что я назначаю, он всегда останавливает рендеринг спрайтов. Я тоже пробовал настройку POINTSIZE с POINTSCALEENABLE установить в false, там тоже не повезло.

Это похоже на то, что не так много людей, которые смотрели вокруг, нашли ответ. Объяснение механизма существует на MSDN, в то время как да, я проверил stackoverflow и нашел аналогичный вопрос без ответа. Другой источник я только предложил установить переменные max и min, которые, как я уже сказал, в значительной степени заставляют мои частицы исчезать.

ParticlePoints а также particleSpeeds являются массивами D3DXVector3, и я получаю от них то, что ожидаю. Книга, которой я следую, предлагает мне определить собственную вершину с помощью XYZ и diffuse, но я не вижу причин, чтобы быть честным, она просто добавляет намного больше к длинному списку объявлений.

Любая помощь приветствуется, спасибо заранее.

Редактировать: Дальнейшая настройка показала, что когда любое из значений шкалы выше 0.99999997f (по крайней мере, между этим значением и 0.99999998f, когда я вижу эффект), я получаю крошечную версию, если я положу их туда или ниже, я получу в значительной степени размер текстуры — хотя это все еще не так хорошо, как может быть большим, и это в значительной степени не справляется с задачей контроля.

0

Решение

Рад помочь 🙂 Мой комментарий как ответ:

Еще одна проблема, которую я видел, это то, что ты плаваешь на заклинание меча. Официальная документация предполагает следующее преобразование *((DWORD*)&Variable (доктор) для помещения в SetRenderState. Я не очень знаком с C ++, но я предположил бы, что это имеет значение, потому что ваше приведение устанавливает реальное dword, но API ожидает плавание в пространстве памяти dwords.

1

Другие решения


По вопросам рекламы [email protected]