Как сделать МНОЖЕСТВО фейк-существ

CumingSoon

Местный стендапер
1,634
12
270
Хочу сделать гильзы. 1 беда,на каждого энтити тратится по 1 драв коллу(как говорит фолкен). У меня появилась идея,сделать лист с гильзами, потом добавить ВСЕ гильзы и отрисовать  1 драв коллом. В правильном направлении я думаю?(с нерасходующими не ресурсы партиклами вроде также должно быть). Вопрос теоретический, реализовать смогу сам.
 
Если можешь, то че спрашиваешь? Делай, и с форумчанами опытом поделись)
 
Не буду делиться. Это слишком просто(мне так кажется). Просто как проверить не знаю.(мы же можем добавлять много вершин,а рисовать все как 1)
 
Я, кстати, рисую гильзы по дроу коллу на штуку .-.
По-хорошему, рисовать их надо с помощью instanced rendering. Одна проблема: в нормальном виде он появляется в openGL только с версии 3.2. Впрочем, на более старых видеокартах гильзы можно и отключить, там уже важнее фпс, а не графониум.
 
То есть моя идея не катит? И как понять "instanced rendering"? Гугл что-то в с/с++ выдаёт,а его я не понимаю (
 
Да что там понимать, вызовы openGL функций выглядят почти одинаково.
Твоя идея... ты ж её не описал. Какой лист? Дисплей лист? Нет, это абсолютно бессмысленно. Если хочется средствами старого openGL отрисовать все гильзы в один дроу колл, то можно на процессоре считать координаты каждой вершины и добавлять их через тесселятор. Но это тоже медленно. Если в гильзе 50-100 вершин, то будет примерно как по дроу коллу на гильзу, мне кажется.
 
Код:
glVertex3f(0.0F, 0.0F, 0.0F); //добавляем вершину на координатах (0, 0, 0)
glVertex3f(0.0F, 0.0F, 1.0F);
glVertex3f(1.0F, 0.0F, 1.0F);
glVertex3f(1.0F, 0.0F, 0.0F);
//не обязательно рисовать только один квадрат, здесь можно добавить больше вершин. Естественно, при отрисовке треугольников общее количество вершин должно быть кратно трём, а при отрисовке квадратов - четырём.
glEnd();
из твоего гайда. Берём ArrayList и добавляем каждый элемент glVertex3f,а потом 1 раз рисуем
 
Нуууу, так оно точно будет медленно. Если уж на то пошло, то лучше через тесселлатор, он хотя бы в буфер сначала вершины пишет, а не гоняет драйвер по каждой вершине. И в любом случае надо считать позицию каждой вершины. Это несложно, но всё же чуть запарнее glTranslate/glRotate.
 
А можно кусочек(или статью)? Не могу понять сути(сложно).
 
Зачем? Minecraft рисует каждую частицу отдельным экземпляром класса и не особо тормозит. Я делал также для вот этого существа (язычки пламени):
c054cc3ab3b5c4e832ff70a020a8b361.jpg
 
Щто? Как связаны экземпляры класса (и зачем так длинно называть объекты) и один/много дроу коллов? Частицы майн рисует как раз в один draw call.
 
А что по поводу темы? Где он их рисует?  Как мне рисовать гильзы(сама гильза может хранить мировые координаты и тд)
 
А как ими пользовался?(не бейте, я не маг и не понимаю OGL)
 
Код:
public void renderParticles(Entity p_78874_1_, float p_78874_2_)
    {
        float f1 = ActiveRenderInfo.rotationX;
        float f2 = ActiveRenderInfo.rotationZ;
        float f3 = ActiveRenderInfo.rotationYZ;
        float f4 = ActiveRenderInfo.rotationXY;
        float f5 = ActiveRenderInfo.rotationXZ;
        EntityFX.interpPosX = p_78874_1_.lastTickPosX + (p_78874_1_.posX - p_78874_1_.lastTickPosX) * (double)p_78874_2_;
        EntityFX.interpPosY = p_78874_1_.lastTickPosY + (p_78874_1_.posY - p_78874_1_.lastTickPosY) * (double)p_78874_2_;
        EntityFX.interpPosZ = p_78874_1_.lastTickPosZ + (p_78874_1_.posZ - p_78874_1_.lastTickPosZ) * (double)p_78874_2_;

        for (int k = 0; k < 3; ++k)
        {
            final int i = k;

            if (!this.fxLayers[i].isEmpty())
            {
                switch (i)
                {
                    case 0:
                    default:
                        this.renderer.bindTexture(particleTextures);
                        break;
                    case 1:
                        this.renderer.bindTexture(TextureMap.locationBlocksTexture);
                        break;
                    case 2:
                        this.renderer.bindTexture(TextureMap.locationItemsTexture);
                }

                GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
                GL11.glDepthMask(false);
                GL11.glEnable(GL11.GL_BLEND);
                GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
                GL11.glAlphaFunc(GL11.GL_GREATER, 0.003921569F);
                Tessellator tessellator = Tessellator.instance;
                tessellator.startDrawingQuads();

                for (int j = 0; j < this.fxLayers[i].size(); ++j)
                {
                    final EntityFX entityfx = (EntityFX)this.fxLayers[i].get(j);
                    if (entityfx == null) continue;
                    tessellator.setBrightness(entityfx.getBrightnessForRender(p_78874_2_));

                    try
                    {
                        entityfx.renderParticle(tessellator, p_78874_2_, f1, f5, f2, f3, f4);
                    }
                    catch (Throwable throwable)
                    {
                        CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Rendering Particle");
                        CrashReportCategory crashreportcategory = crashreport.makeCategory("Particle being rendered");
                        crashreportcategory.addCrashSectionCallable("Particle", new Callable()
                        {
                            private static final String __OBFID = "CL_00000918";
                            public String call()
                            {
                                return entityfx.toString();
                            }
                        });
                        crashreportcategory.addCrashSectionCallable("Particle Type", new Callable()
                        {
                            private static final String __OBFID = "CL_00000919";
                            public String call()
                            {
                                return i == 0 ? "MISC_TEXTURE" : (i == 1 ? "TERRAIN_TEXTURE" : (i == 2 ? "ITEM_TEXTURE" : (i == 3 ? "ENTITY_PARTICLE_TEXTURE" : "Unknown - " + i)));
                            }
                        });
                        throw new ReportedException(crashreport);
                    }
                }

                tessellator.draw();
                GL11.glDisable(GL11.GL_BLEND);
                GL11.glDepthMask(true);
                GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F);
            }
        }
    }
Попробую с этим шаманить
 
GloomyFolken написал(а):
Я, кстати, рисую гильзы по дроу коллу на штуку .-.
По-хорошему, рисовать их надо с помощью instanced rendering. Одна проблема: в нормальном виде он появляется в openGL только с версии 3.2.
Вот поэтому я просил поделиться.
 
Я не знаю про instanced rendering. Поэтому буду делать,как бы партиклы. Проблема только:я не знаю,как сделать 3д модель,используя тесселатор.
 
Несложно, фордж сам по себе рисует обж через тесселлатор. Нужно только не делать startDrawingQuads()/draw() для каждой сущности, и самому считать положения вершин. Считать положение вершин тоже несложно, при помощи матриц из lwjgl-util. Вместо того, чтобы юзать glTranslate/glRotate, сам выполняешь нужные операции над своей матрицей, а потом умножаешь (Matrix4f#transform) координаты каждой вершины на эту матрицу. Вместо glTranslate() - Matrix4f#translate, вместо glRotate() - Matrix4f#rotate.
 
Прости за такое требование. Дашь статью или код,или ещё что-то?
 
Подсказку дам. Берёшь и кодишь, не понимаешь как кодить - гуглишь, читаешь, разбираешься, смотришь другой код. Когда-нибудь обязательно разберешься. Я описал настолько подробно, насколько можно. Кодить это за тебя я не собираюсь.
 
Назад
Сверху