[Решено] Светящийся вертекс

Статус
В этой теме нельзя размещать новые ответы.
1,976
68
220
Всем снова здрасти :D
Мне нужно отрисовать светящийся в темноте вертекс (чтобы яркий был, а не как обычно).
Посмотрел в молнии, нашёл там blend, поигрался с ним и понял, что если нарисовать много одинаковых квадратиков, то они будут достаточно яркие, но текстура будет невидна. А разобраться с тем, как сделать ярким один квадрат не смог. Подскажите, пожалуйста =)

Код:
private void renderCore(TileEntity te, double x, double y, double z) {
    GL11.glPushMatrix();
    //GL11.glDisable(GL11.GL_LIGHTING);
    //GL11.glEnable(GL11.GL_BLEND);
    GL11.glTranslated(x, y, z);
    GL11.glTranslatef(0.5F, 1.5F, 0.5F);
    GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);

    Tessellator tes = Tessellator.instance;
    FMLClientHandler.instance().getClient().renderEngine.bindTexture(core);
    tes.startDrawingQuads();
    //for (int i = 0; i < 25; i++)
        drawCore(tes);
    tes.draw();

    //GL11.glDisable(GL11.GL_BLEND);
    //GL11.glEnable(GL11.GL_LIGHTING);
    GL11.glPopMatrix();
}


public void drawCore(Tessellator tes) {
    tes.addVertexWithUV(0.125D, 0.7501D, -0.125D, 1.0D, 0.0D);
    tes.addVertexWithUV(-0.125D, 0.7501D, -0.125D, 0.0D, 0.0D);
    tes.addVertexWithUV(-0.125D, 1.2499D, -0.125D, 0.0D, 1.0D);
    tes.addVertexWithUV(0.125D, 1.2499D, -0.125D, 1.0D, 1.0D);

    tes.addVertexWithUV(0.125D, 0.7501D, 0.125D, 1.0D, 0.0D);
    tes.addVertexWithUV(0.125D, 0.7501D, -0.125D, 0.0D, 0.0D);
    tes.addVertexWithUV(0.125D, 1.2499D, -0.125D, 0.0D, 1.0D);
    tes.addVertexWithUV(0.125D, 1.2499D, 0.125D, 1.0D, 1.0D);

    tes.addVertexWithUV(-0.125D, 0.7501D, 0.125D, 1.0D, 0.0D);
    tes.addVertexWithUV(0.125D, 0.7501D, 0.125D, 0.0D, 0.0D);
    tes.addVertexWithUV(0.125D, 1.2499D, 0.125D, 0.0D, 1.0D);
    tes.addVertexWithUV(-0.125D, 1.2499D, 0.125D, 1.0D, 1.0D);

    tes.addVertexWithUV(-0.125D, 0.7501D, -0.125D, 1.0D, 0.0D);
    tes.addVertexWithUV(-0.125D, 0.7501D, 0.125D, 0.0D, 0.0D);
    tes.addVertexWithUV(-0.125D, 1.2499D, 0.125D, 0.0D, 1.0D);
    tes.addVertexWithUV(-0.125D, 1.2499D, -0.125D, 1.0D, 1.0D);
}

P.S. tes.setBrightness почему-то не помог :ermm:

один вертекс
htOEBEJ.png

много вертексов (около 20)
6ABWp81.png
 
1,137
5
3
mc.entityRenderer. enableLightmap (0.0)
OpenGlHelper.setLightmapTextureCoordinates(240, 240)
mc.entityRenderer. disableLightmap (0.0)
 
1,976
68
220
О, то, что надо. Во всяком случае светится :D
А если добавить GL11.glDisable(GL11.GL_LIGHTING); отрендерить, а потом GL11.glEnable(GL11.GL_LIGHTING); то будет ещё ярче.

А ещё ярче можно? :cool: Или это лучше делать по типу маяка или ламп из RedPower/Project:Red?
 
1,976
68
220
Сделал, всё хорошо, вот код, если кому понадобится освещать (думаю, с расстановкой вертексов сами справитесь)
Код:
    private void renderCore(TileEntity te, double x, double y, double z) {
        GL11.glDisable(GL11.GL_LIGHTING);
        Tessellator tes = Tessellator.instance;
        
        Minecraft.getMinecraft().entityRenderer.enableLightmap(0.0);
        Minecraft.getMinecraft().renderEngine.bindTexture(core);
        OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240);
        tes.startDrawingQuads();
        drawCore(tes, 0.125D);
        tes.draw();
        Minecraft.getMinecraft().entityRenderer.disableLightmap(0.0);

        GL11.glDisable(GL11.GL_TEXTURE_2D);
        GL11.glEnable(GL11.GL_BLEND);
        tes.startDrawingQuads();
        tes.setColorRGBA_F((1F / 255F * 227F), (1F / 255F * 171F), 1F, 0.25F);
        drawCore(tes, 0.13D);
        drawCore(tes, 0.135D);
        tes.draw();
        GL11.glDisable(GL11.GL_BLEND);
        GL11.glEnable(GL11.GL_TEXTURE_2D);
        
        GL11.glEnable(GL11.GL_LIGHTING);
    }
    
    private void renderOverlay() {
        
    }
    
    private void drawCore(Tessellator tes, double XZ) {
        tes.addVertexWithUV(XZ, 0.7501D, -XZ, 1.0D, 0.0D);
        tes.addVertexWithUV(-XZ, 0.7501D, -XZ, 0.0D, 0.0D);
        tes.addVertexWithUV(-XZ, 1.2499D, -XZ, 0.0D, 1.0D);
        tes.addVertexWithUV(XZ, 1.2499D, -XZ, 1.0D, 1.0D);

        tes.addVertexWithUV(XZ, 0.7501D, XZ, 1.0D, 0.0D);
        tes.addVertexWithUV(XZ, 0.7501D, -XZ, 0.0D, 0.0D);
        tes.addVertexWithUV(XZ, 1.2499D, -XZ, 0.0D, 1.0D);
        tes.addVertexWithUV(XZ, 1.2499D, XZ, 1.0D, 1.0D);

        tes.addVertexWithUV(-XZ, 0.7501D, XZ, 1.0D, 0.0D);
        tes.addVertexWithUV(XZ, 0.7501D, XZ, 0.0D, 0.0D);
        tes.addVertexWithUV(XZ, 1.2499D, XZ, 0.0D, 1.0D);
        tes.addVertexWithUV(-XZ, 1.2499D, XZ, 1.0D, 1.0D);

        tes.addVertexWithUV(-XZ, 0.7501D, -XZ, 1.0D, 0.0D);
        tes.addVertexWithUV(-XZ, 0.7501D, XZ, 0.0D, 0.0D);
        tes.addVertexWithUV(-XZ, 1.2499D, XZ, 0.0D, 1.0D);
        tes.addVertexWithUV(-XZ, 1.2499D, -XZ, 1.0D, 1.0D);
}
Но появилась проблема - если поставить два таких блока рядом - второй будет светится весь:
ISPbqt2.png
Как это исправить можно, есть идеи?) Может я забыл что-то выключить/включить?
 
608
5
15
Может передвинуть OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240); на квад, а не весь рендер?)
 
1,976
68
220
не-не-не, rednerCore это метод, вызываемый из renderTileEntityAt, где рендерится обычная модель. Просто для удобства разделил.Он идёт самый последний
 
608
5
15
Ну правильно, дай угадаю, а блоки впереди и сзади не светятся? Ты просто ванильную лайт мапу не ставишь после рендера и новый рендер следующего блока по X идёт твой, с этой лайт мапой.
[merge_posts_bbcode]Добавлено: 11.06.2016 12:12:03[/merge_posts_bbcode]

Хотя это же тайл рендер, а не симпл блок рендер...
 
1,976
68
220
Сделал так:
Код:
Minecraft.getMinecraft().entityRenderer.enableLightmap(0.0);
Minecraft.getMinecraft().renderEngine.bindTexture(core);
tes.startDrawingQuads();
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240);
drawCore(tes, 0.125D);
tes.draw();
Minecraft.getMinecraft().entityRenderer.disableLightmap(0.0);
Не помогло =(
Может я тебя неправильно понял?
[merge_posts_bbcode]Добавлено: 11.06.2016 12:17:54[/merge_posts_bbcode]

Светятся со всех сторон и даже на отдалении (до тех пор, пока ранее установленный блок не исчезнет с рендера. Потом "выключается" второй, третий и т.п.
aOZxBBv.png

[merge_posts_bbcode]Добавлено: 11.06.2016 12:21:59[/merge_posts_bbcode]

svk2140 написал(а):
Ты просто ванильную лайтмапу не ставишь после рендера
А как её ставить? Я просто в этом понимаю столько же, сколько воробушек в квантовой физике :silly:
 
1,137
5
3
svk2140 написал(а):
Ну правильно, дай угадаю, а блоки впереди и сзади не светятся? Ты просто ванильную лайт мапу не ставишь после рендера и новый рендер следующего блока по X идёт твой, с этой лайт мапой.
Лол?

Код:
Minecraft.getMinecraft().entityRenderer.enableLightmap(0.0);
Minecraft.getMinecraft().renderEngine.bindTexture(core);
tes.startDrawingQuads();
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240);
drawCore(tes, 0.125D);
tes.draw();
Minecraft.getMinecraft().entityRenderer.disableLightmap(0.0);
 
608
5
15
Ну так правильно, он её выключает и следующие рендеры идут без лайт мапы => светлыми.
[merge_posts_bbcode]Добавлено: 11.06.2016 12:44:49[/merge_posts_bbcode]

Не увидел строчку, но всеравно, даже если бы он её не выключал, они были бы светлыми => надо ставить ванильную.
 
1,137
5
3
А это что?

Код:
Minecraft.getMinecraft().entityRenderer.enableLightmap(0.0);
[merge_posts_bbcode]Добавлено: 11.06.2016 12:45:26[/merge_posts_bbcode]

Тем более, это не отключает лайтмапу, не надо.
 
608
5
15
Смотри:
Код:
Minecraft.getMinecraft().entityRenderer.enableLightmap(0.0);
...
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240);
...
Minecraft.getMinecraft().entityRenderer.disableLightmap(0.0);

И это он делает в конце всего рендера:
не-не-не, rednerCore это метод, вызываемый из renderTileEntityAt, где рендерится обычная модель. Просто для удобства разделил.Он идёт самый последний
И соответственно, в конце он её вырубает, затем идёт следующий рендер с вырубленой мапой.
[merge_posts_bbcode]Добавлено: 11.06.2016 12:50:37[/merge_posts_bbcode]

И я лично не знаю как работает лайт мапа. 
Код:
Minecraft.getMinecraft().entityRenderer.enableLightmap(0.0);
включит освещение как во всём остальном майне? Даже если он перед этим вызвал 
Код:
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240, 240);
? И что делают эти аргументы?
 
1,137
5
3
Короче,
enableLightmap изменяет текстуру лайтмапы, грузит(биндит) во второй слот и ставит первый слот(обычная текстура). disableLightmap меняет слот на лайтмапу, отключает GL_TEXTURЕ, ставит опять текстуру. А аргументы эти - UV лайтмапы. Вообще, они должны быть от 0 до 1, но тут ещё и координаты скейлятся

А ещё, они смешиваются, тем самым меняя освещение текстуры(в шейдере б умножались цвет пикселя на цвет света)
 
608
5
15
Но я прав? Получается ему в начале рендера энтити (а не метода который вызывается в конце, как щас) надо прописать:
Код:
Minecraft.getMinecraft().entityRenderer.enableLightmap(0.0); 
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 0, 1);
 
1,137
5
3
Зачем?
Код:
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 0, 1);
использовать что-то меньше 16 - бессмыслено
 
608
5
15
Так а как ему в начале рендера вернуть всё на свои места, что-бы было правильное освещение? Просто:
Код:
Minecraft.getMinecraft().entityRenderer.enableLightmap(0.0);

?
 
608
5
15
Что-бы было правильное освещение
 
608
5
15
Ну такое как в майне, бля, что-б правильно освещалась модель, по сравнению с окружением.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху