Мерцание текстуры

Ты чего ждёшь?
Иди пробуй, уже два решения накопилось.
 
Почитай что-нибудь про декали в майне и в java вообще, это второе)
 
декаль с англ переводится, как наклейка))
 
Значит хреново их рисуешь. Надо рисовать или строго по часовой стрелке, или строго против. Зависит от настроек CULL_FACE
 
Есть такая функция: GL11.glDepthRange(zNear, zFar)
Позволяет масштабировать биты глубины. Можно поставить GL11.glDepthRange(0,0.99f) перед отрисовкой одежды и (0,1.0f) после.
Еще вариант - нарисовать текстуру "на лету" с помощью EXTFramebufferObject, но это намного сложнее.
 
krok написал(а):
Ты уверен,что сработает?
Нет конечно, я же не сделал мод с одеждой и не вписал туда эту функцию. Тем не менее я с ней экспериментировал и она работает именно так как тут надо. В том, что касается EXTFramebufferObject - работать точно будет (но, возможно, не на всех видеокартах), но это море работы.
 
[font=Verdana, Helvetica, Arial, sans-serif]Попробовал.Лучше бы я этого не делал.Одежда рисуется поверх всего[/font]
Эм... а разве ты не этого добивался? Или ты имеешь в виду - поверх блоков? Так увеличь второй параметр - поставь 0,999f.
 
Тогда тебе этот метод не подойдет. В этом случае рисуй новую текстуру в буфере.
Через прокси подпишись на событие:
Код:
    @SubscribeEvent
    public void renderGameOverlayEvent(RenderGameOverlayEvent.Post event)
    {
        }
Чтобы не трахаться с камерой. И внутри этого события отрисуй текстуру одежды поверх текстуры кожи игрока, используя вывод в буфер кадров.
Код:
    if(texture==-1)
    {
        GL11.glGenTextures(textureIDBuffer);
        texture=textureIDBuffer.get(0);
        GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
        GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB8, textureWidth, textureHeight, 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, (java.nio.ByteBuffer)null);
        GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_CLAMP);
        GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_CLAMP);
        GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER,GL11. GL_LINEAR);
        GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);
    }
Так я делаю текстуру в которую выводу буфер.
А так я рисую внутри буфера:
Код:
        EXTFramebufferObject.glBindFramebufferEXT( EXTFramebufferObject.GL_FRAMEBUFFER_EXT, IHLMod.proxy.getFBOID());
        EXTFramebufferObject.glFramebufferTexture2DEXT( EXTFramebufferObject.GL_FRAMEBUFFER_EXT, EXTFramebufferObject.GL_COLOR_ATTACHMENT0_EXT,    GL11.GL_TEXTURE_2D, texture, 0);
        IHLMod.proxy.checkFramebuffer(IHLMod.proxy.getFBOID());
        EXTFramebufferObject.glBindRenderbufferEXT(EXTFramebufferObject.GL_RENDERBUFFER_EXT, IHLMod.proxy.getRenderBufferID());                // bind the depth renderbuffer
        EXTFramebufferObject.glRenderbufferStorageEXT(EXTFramebufferObject.GL_RENDERBUFFER_EXT, GL14.GL_DEPTH_COMPONENT24, textureWidth, textureHeight); // get the data space for it
        EXTFramebufferObject.glFramebufferRenderbufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT,EXTFramebufferObject.GL_DEPTH_ATTACHMENT_EXT,EXTFramebufferObject.GL_RENDERBUFFER_EXT, IHLMod.proxy.getRenderBufferID()); // bind it to the renderbuffer
//Здесь ты рисуешь свою новую текстуру
        EXTFramebufferObject.glBindFramebufferEXT(EXTFramebufferObject.GL_FRAMEBUFFER_EXT, IHLMod.proxy.getDefaultMinecraftFBOID());
Стандартный номер буфера в майнкрафте - 1, но ты можешь проверить это с помощью функции:
Код:
                boolean isframebuffer = EXTFramebufferObject.glIsFramebufferEXT(i);
                if(isframebuffer)
                {
                    defaultMinecraftFBOId=i;
                }


Потом просто при отрисовке игрока вместо базовой текстуры определяешь свою:
Код:
        GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
 
Назад
Сверху