Кто шарит в OpenGl?

5,018
47
783
В общем, поступила информация что отрисовку чего либо можно делать на блоке с помощью RenderWorldLastEvent
Как это вообще сделать я фиг знает. В общем, преположение такое
1)Вокруг обычного ванильного куба зарендерить еще один куб, совсем чуть чуть побольше его размерами
2) Наложить на этот новый блок мою текстуру
Вот выкладываю свои наработки, разобрался как текстуру зарендерить, помогите пожалуйста, кто чем может, кодом, желательно, так как в опенгл я не шарю,а изучать его ради одной штуки время жалко
Java:
public class LayerEvent {
    
    
    static Minecraft mc = Minecraft.getMinecraft();
    
    @SideOnly(Side.CLIENT)
    @SubscribeEvent
    public void layer(RenderWorldLastEvent e) {
        //IBlockAccess world = e.
        //BlockPos pos = e.getPos();
        //IBlockState state = e.getWorld().getBlockState(pos).getActualState(world, pos);   
        //Block block = e.getWorld().getBlockState(pos).getBlock();
    //    IBlockState state =  Minecraft.getMinecraft().world.getBlockState(pos)
    //    BlockModelShapes bms = Minecraft.getMinecraft().getBlockRendererDispatcher().getBlockModelShapes();
        TextureAtlasSprite texture = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite("realism:blocks/panehorizontal.png");
    //    IBakedModel ibakedmodel = bms.getModelForState(state);
    //    IBakedModel ibakedmodel1 = net.minecraftforge.client.ForgeHooksClient.getDamageModel(ibakedmodel, texture, state, world, pos);
    

    }
    @SideOnly(Side.CLIENT)
    @SubscribeEvent
    public void spriteRegisterEventPre(TextureStitchEvent.Pre event) { 
        ResourceLocation glass = new ResourceLocation("realism:blocks/panehorizontal.png"); 
        event.getMap().registerSprite(glass);
    }

}
 
Накладывать текстуры на блоки в RenderWorldLastEvent, это как рендерить 3d графику путем увеличения картинок.
 
5,018
47
783
Не имею права распространять эту информацию, но тебе достаточно просто зайти в нашу беседу реализма в дискорде и все поймешь.
 
5,018
47
783
Накладывать текстуры на блоки в RenderWorldLastEvent, это как рендерить 3d графику путем увеличения картинок.
Я вообще не разбираюсь, мб мне глупость посоветовали, а я и не в курсе
 
5,018
47
783
Добрался до самого главного - где рисуются квадраты. Как? ЧТо тут? Как тут все работает?
Java:
    private void renderQuadsSmooth(IBlockAccess blockAccessIn, IBlockState stateIn, BlockPos posIn, BufferBuilder buffer, List<BakedQuad> list, float[] quadBounds, BitSet bitSet, BlockModelRenderer.AmbientOcclusionFace aoFace)
    {
        Vec3d vec3d = stateIn.getOffset(blockAccessIn, posIn);
        double d0 = (double)posIn.getX() + vec3d.x;
        double d1 = (double)posIn.getY() + vec3d.y;
        double d2 = (double)posIn.getZ() + vec3d.z;
        int i = 0;

        for (int j = list.size(); i < j; ++i)
        {
            BakedQuad bakedquad = list.get(i);
            this.fillQuadBounds(stateIn, bakedquad.getVertexData(), bakedquad.getFace(), quadBounds, bitSet);
            aoFace.updateVertexBrightness(blockAccessIn, stateIn, posIn, bakedquad.getFace(), quadBounds, bitSet);
            buffer.addVertexData(bakedquad.getVertexData());
            buffer.putBrightness4(aoFace.vertexBrightness[0], aoFace.vertexBrightness[1], aoFace.vertexBrightness[2], aoFace.vertexBrightness[3]);
            if(bakedquad.shouldApplyDiffuseLighting())
            {
                float diffuse = net.minecraftforge.client.model.pipeline.LightUtil.diffuseLight(bakedquad.getFace());
                aoFace.vertexColorMultiplier[0] *= diffuse;
                aoFace.vertexColorMultiplier[1] *= diffuse;
                aoFace.vertexColorMultiplier[2] *= diffuse;
                aoFace.vertexColorMultiplier[3] *= diffuse;
            }
            if (bakedquad.hasTintIndex())
            {
                int k = this.blockColors.colorMultiplier(stateIn, blockAccessIn, posIn, bakedquad.getTintIndex());

                if (EntityRenderer.anaglyphEnable)
                {
                    k = TextureUtil.anaglyphColor(k);
                }

                float f = (float)(k >> 16 & 255) / 255.0F;
                float f1 = (float)(k >> 8 & 255) / 255.0F;
                float f2 = (float)(k & 255) / 255.0F;
                buffer.putColorMultiplier(aoFace.vertexColorMultiplier[0] * f, aoFace.vertexColorMultiplier[0] * f1, aoFace.vertexColorMultiplier[0] * f2, 4);
                buffer.putColorMultiplier(aoFace.vertexColorMultiplier[1] * f, aoFace.vertexColorMultiplier[1] * f1, aoFace.vertexColorMultiplier[1] * f2, 3);
                buffer.putColorMultiplier(aoFace.vertexColorMultiplier[2] * f, aoFace.vertexColorMultiplier[2] * f1, aoFace.vertexColorMultiplier[2] * f2, 2);
                buffer.putColorMultiplier(aoFace.vertexColorMultiplier[3] * f, aoFace.vertexColorMultiplier[3] * f1, aoFace.vertexColorMultiplier[3] * f2, 1);
            }
            else
            {
                buffer.putColorMultiplier(aoFace.vertexColorMultiplier[0], aoFace.vertexColorMultiplier[0], aoFace.vertexColorMultiplier[0], 4);
                buffer.putColorMultiplier(aoFace.vertexColorMultiplier[1], aoFace.vertexColorMultiplier[1], aoFace.vertexColorMultiplier[1], 3);
                buffer.putColorMultiplier(aoFace.vertexColorMultiplier[2], aoFace.vertexColorMultiplier[2], aoFace.vertexColorMultiplier[2], 2);
                buffer.putColorMultiplier(aoFace.vertexColorMultiplier[3], aoFace.vertexColorMultiplier[3], aoFace.vertexColorMultiplier[3], 1);
            }

            buffer.putPosition(d0, d1, d2);
        }
    }
 
Я не шарю в opengl, но я смог:alien: Код сырой!
Java:
BlockPos oldpos;
    @SubscribeEvent
    public void eventClick(RenderWorldLastEvent event) {
        Minecraft mc = Minecraft.getMinecraft();
        if(mc.player.getHeldItemMainhand().getItem() == ItemRegister.battery && RayTraceResultUtil.getRayTraceToBlock(mc.player, 1, 5, true) != null && !mc.isGamePaused()) {
            if(oldpos == null || !oldpos.equals(RayTraceResultUtil.getRayTraceToBlock(mc.player, 1, 5, true).getBlockPos())) {
                Block block = mc.world.getBlockState(RayTraceResultUtil.getRayTraceToBlock(mc.player, 1, 5, true).getBlockPos()).getBlock();
                oldpos=RayTraceResultUtil.getRayTraceToBlock(mc.player, 1, 5, true).getBlockPos();
                MaterialRegister.drawBlockTexture(mc.player, mc.getRenderPartialTicks(), RayTraceResultUtil.getRayTraceToBlock(mc.player, 1, 5, true).getBlockPos(), mc.world,"double_plant_syringa_top");
            }
            else {
                MaterialRegister.drawBlockTexture(mc.player, mc.getRenderPartialTicks(), oldpos, mc.world, "double_plant_syringa_top");
            }
        }
    }
MaterialRegister
Java:
private static void preRenderDamagedBlocks()
    {
        GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.DST_COLOR, GlStateManager.DestFactor.SRC_COLOR, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
        GlStateManager.enableBlend();
        GlStateManager.color(1.0F, 1.0F, 1.0F, 0.5F);
        GlStateManager.doPolygonOffset(-3.0F, -3.0F);
        GlStateManager.enablePolygonOffset();
        GlStateManager.alphaFunc(516, 0.1F);
        GlStateManager.enableAlpha();
        GlStateManager.pushMatrix();
    }

    private static void postRenderDamagedBlocks()
    {
        GlStateManager.disableAlpha();
        GlStateManager.doPolygonOffset(0.0F, 0.0F);
        GlStateManager.disablePolygonOffset();
        GlStateManager.enableAlpha();
        GlStateManager.depthMask(true);
        GlStateManager.popMatrix();
    }


public static void drawBlockTexture(Entity entityIn, float partialTicks, BlockPos blockpos, World world, String texture) {
        double d3 = entityIn.lastTickPosX + (entityIn.posX - entityIn.lastTickPosX) * (double) partialTicks;
        double d4 = entityIn.lastTickPosY + (entityIn.posY - entityIn.lastTickPosY) * (double) partialTicks;
        double d5 = entityIn.lastTickPosZ + (entityIn.posZ - entityIn.lastTickPosZ) * (double) partialTicks;
        Tessellator tessellatorIn = Tessellator.getInstance();
        BufferBuilder bufferBuilderIn = tessellatorIn.getBuffer();
        Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
        preRenderDamagedBlocks();
        bufferBuilderIn.begin(7, DefaultVertexFormats.BLOCK);
        bufferBuilderIn.setTranslation(-d3, -d4, -d5);
        bufferBuilderIn.noColor();
        IBlockState iblockstate = world.getBlockState(blockpos);
        TextureMap texturemap = Minecraft.getMinecraft().getTextureMapBlocks();
        BlockRendererDispatcher blockrendererdispatcher = Minecraft.getMinecraft().getBlockRendererDispatcher();
        blockrendererdispatcher.renderBlockDamage(iblockstate, blockpos, texturemap.getAtlasSprite("minecraft:blocks/"+texture), world);
        tessellatorIn.draw();
        bufferBuilderIn.setTranslation(0.0D, 0.0D, 0.0D);
        postRenderDamagedBlocks();
    }
Java:
public class RayTraceResultUtil {
    public static RayTraceResult getRayTraceToBlock(EntityLivingBase entity_base, float fasc, double dist, boolean interact) {
        Vec3d vec3 = new Vec3d(entity_base.posX, entity_base.posY + entity_base.getEyeHeight(), entity_base.posZ);
        Vec3d vec31 = entity_base.getLook(fasc);
        Vec3d vec32 = vec3.addVector(vec31.x * dist, vec31.y * dist, vec31.z * dist);
        RayTraceResult mop = entity_base.world.rayTraceBlocks(vec3, vec32, interact);
        return mop;
    }
}
 
Последнее редактирование:
Метод рисования можно даже сократить до такого:
Java:
public static void drawBlockTexture(Entity entityIn, float partialTicks, BlockPos blockpos, World world, String texture) {
        double d3 = entityIn.lastTickPosX + (entityIn.posX - entityIn.lastTickPosX) * (double) partialTicks;
        double d4 = entityIn.lastTickPosY + (entityIn.posY - entityIn.lastTickPosY) * (double) partialTicks;
        double d5 = entityIn.lastTickPosZ + (entityIn.posZ - entityIn.lastTickPosZ) * (double) partialTicks;
        Tessellator tessellatorIn = Tessellator.getInstance();
        BufferBuilder bufferBuilderIn = tessellatorIn.getBuffer();
        Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
        preRenderDamagedBlocks();
        bufferBuilderIn.begin(7, DefaultVertexFormats.BLOCK);
        bufferBuilderIn.setTranslation(-d3, -d4, -d5);
        bufferBuilderIn.noColor();
        IBlockState iblockstate = world.getBlockState(blockpos);
        TextureMap texturemap = Minecraft.getMinecraft().getTextureMapBlocks();
        BlockRendererDispatcher blockrendererdispatcher = Minecraft.getMinecraft().getBlockRendererDispatcher();
        blockrendererdispatcher.renderBlockDamage(iblockstate, blockpos, texturemap.getAtlasSprite("minecraft:blocks/"+texture), world);
        tessellatorIn.draw();
        bufferBuilderIn.setTranslation(0.0D, 0.0D, 0.0D);
        postRenderDamagedBlocks();
    }
 
2,505
81
397
Это может и допустимо для твоего примитивного случая, но не для случая Максика. Ему нужно рисовать плесень на всех блоках. А твой способ слиишком медленный.
 
5,018
47
783
Это может и допустимо для твоего примитивного случая, но не для случая Максика. Ему нужно рисовать плесень на всех блоках. А твой способ слиишком медленный.
Не на всех. На всех блоках определенного типа. Например, на земле плесени не будет. Только на постройках. Тем более, можно получить коры игрока и только в определенном радиусе рисовать
 

mod

156
2
12
чисто вопрос по теме: а разве вы не можете отделить объект при рендере на отдельный слой, а дальше как в фотошопе.....
 
5,018
47
783
чисто вопрос по теме: а разве вы не можете отделить объект при рендере на отдельный слой, а дальше как в фотошопе.....
если ток перепилить всю ванильную систему рендера
 

mod

156
2
12
а фон в эндере тогда как пашет? разве не так же :) ?
 
7,099
324
1,510
Какой фон?
 

CumingSoon

Местный стендапер
1,634
12
269
У меня идея дурацкая. На все нужные тебе блоки наложить плесень и сделать атлас. А потом использовать как текстуру. Тогда даже не нужно будет ничего лишнего рисовать, но будет затрата побольше по памяти
 
5,018
47
783
У меня идея дурацкая. На все нужные тебе блоки наложить плесень и сделать атлас. А потом использовать как текстуру. Тогда даже не нужно будет ничего лишнего рисовать, но будет затрата побольше по памяти
щас все работает тип топ, за исключением того, что проверка на блок идет после всех циклов. Глянь посл. сообщение в реализмтеме
 
1,976
68
220
Ёшки-кошки... И это ваш хвалёный 1.12.2, что простая двухслойная текстура рендерится ТАКИМИ костылищами?
В этом случае ну её на все три буквы.
 
Сверху