Вопрос EspOutline

Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2023
Сообщения
44
Реакции[?]
0
Поинты[?]
0

Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:

  • бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
  • маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
  • приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
  • обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.

Спасибо!

Что не так ?
Сделанно быстро на коленке для теста
code:
    private final String vertexGLSL = """
            #version 120
           
            void main() {
                gl_TexCoord[0] = gl_MultiTexCoord0;
                gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
            }
            """;

    private final String outlineGLSL = """
            #versoin 120

            uniform sampler2D textureSampler;
            uniform vec4 borderColor;
            uniform float borderSize;
           
            void main() {
                vec2 uv = gl_TexCoord[0].st;
           
                vec4 texColor = texture2D(textureSampler, uv);
           
                if (texColor.a > 0.0) {
                    gl_FragColor = texColor;
                    return;
                }
           
                float border = 0.0;
           
                vec2 texelSize = vec2(borderSize) / 1.0;
           
                for (float x = -borderSize; x <= borderSize; x += texelSize.x) {
                    for (float y = -borderSize; y <= borderSize; y += texelSize.y) {
                        vec2 offset = vec2(x, y);
                        vec4 neighborColor = texture2D(textureSampler, uv + offset);
                        if (neighborColor.a > 0.0) {
                            border = 1.0;
                            break;
                        }
                    }
                    if (border > 0.0) break;
                }
           
                if (border > 0.0) {
                    gl_FragColor = borderColor;
                } else {
                    gl_FragColor = vec4(0.0);
                }
            }
            """;

    private final Listener<RenderEvent.Player.Model> modelListener = event -> {
        int windowWidth = mc.getMainWindow().getWidth();
        int windowHeight = mc.getMainWindow().getHeight();
        if (event.getType().equals(RenderEvent.RenderType.PRE)) {
            if (playerFramebuffer == null) {
                playerFramebuffer = new Framebuffer(windowWidth, windowHeight, true, Minecraft.IS_RUNNING_ON_MAC);
            } else {
                if (windowWidth != playerFramebuffer.framebufferWidth || windowHeight != playerFramebuffer.framebufferHeight) {
                    playerFramebuffer.resize(windowWidth, windowHeight, false);
                }
                playerFramebuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC);
            }
            playerFramebuffer.bindFramebuffer(true);
        } else if (event.getType().equals(RenderEvent.RenderType.POST)) {
            if (playerFramebuffer != null) {
                playerFramebuffer.unbindFramebuffer();

                int program = GL30.glCreateProgram();
                int fragment = GL30.glCreateShader(GL30.GL_FRAGMENT_SHADER);
                GL30.glShaderSource(fragment, new BufferedReader(new InputStreamReader(new ByteArrayInputStream(outlineGLSL.getBytes()))).lines().collect(Collectors.joining("\n")));
                GL30.glCompileShader(fragment);
                GL30.glAttachShader(program, fragment);
                int vertex = GL30.glCreateShader(GL30.GL_VERTEX_SHADER);
                GL30.glShaderSource(vertex, new BufferedReader(new InputStreamReader(new ByteArrayInputStream(vertexGLSL.getBytes()))).lines().collect(Collectors.joining("\n")));
                GL30.glCompileShader(vertex);
                GL30.glAttachShader(program, vertex);
                GL30.glLinkProgram(program);

                playerFramebuffer.bindFramebuffer(true);
                Color color = new Color(0xFF0000);
                GL30.glUseProgram(program);
                int par1 = GL30.glGetUniformLocation(program, "textureSampler");
                GL30.glUniform1i(par1, playerFramebuffer.getFramebufferTexture());
                int par2 = GL30.glGetUniformLocation(program, "borderColor");
                GL30.glUniform4i(par2, color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha());
                int par3 = GL30.glGetUniformLocation(program, "borderSize");
                GL30.glUniform1f(par3, 0.5F);
                Tessellator tessellator = Tessellator.getInstance();
                BufferBuilder bufferBuilder = tessellator.getBuffer();
                bufferBuilder.begin(GL30.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
                bufferBuilder.pos(0, 0, 0).tex(0, 0).endVertex();
                bufferBuilder.pos(0, windowHeight, 0).tex(0, 1).endVertex();
                bufferBuilder.pos(windowWidth, windowHeight, 0).tex(1, 1).endVertex();
                bufferBuilder.pos(windowWidth, 0, 0).tex(1, 0).endVertex();
                tessellator.draw();
                GL30.glUseProgram(0);
                playerFramebuffer.unbindFramebuffer();
                //GL30.glDeleteProgram(program);

                mc.getFramebuffer().bindFramebuffer(true);
                playerFramebuffer.bindFramebufferTexture();
                Tessellator tessellator2 = Tessellator.getInstance();
                BufferBuilder bufferBuilder2 = tessellator.getBuffer();
                bufferBuilder2.begin(GL30.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
                bufferBuilder2.pos(0, 0, 0).tex(0, 0).endVertex();
                bufferBuilder2.pos(0, windowHeight, 0).tex(0, 1).endVertex();
                bufferBuilder2.pos(windowWidth, windowHeight, 0).tex(1, 1).endVertex();
                bufferBuilder2.pos(windowWidth, 0, 0).tex(1, 0).endVertex();
                tessellator2.draw();
                playerFramebuffer.unbindFramebufferTexture();
                mc.getFramebuffer().bindFramebuffer(false);
            }
        }
    };
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2023
Сообщения
44
Реакции[?]
0
Поинты[?]
0
Преобразовал playerFramebuffer в JFrame, игроки есть "только они на прозрачном фоне", перемещаться но после наложения шейдера нечего не изменяется обводка не появилась, но после вывода playerFramebuffer в основной игроки пропадают
 
Сверху Снизу