Исходник Шейдер в мейн меню (main menu shader) | exp 3.1

Начинающий
Статус
Оффлайн
Регистрация
3 Май 2023
Сообщения
158
Реакции[?]
1
Поинты[?]
0
кароче, челы кто не может починить белый экран, то вот вам нормальный shaderutils

ShaderUtils.java:
public class ShaderUtils implements Util {
    
    public static ShaderUtils MAIN_MENU;
    
    private final int shaderID = GL20.glCreateProgram();

    public ShaderUtils(String string) {
        GL20.glAttachShader(this.shaderID, this.createShader(string));
        GL20.glLinkProgram(this.shaderID);
    }

    public static void init() {
        MAIN_MENU = new ShaderUtils("#ifdef GL_ES\n" +
                "precision mediump float;\n" +
                "#endif\n" +
                "\n" +
                "#extension GL_OES_standard_derivatives : enable\n" +
                "\n" +
                "#define NUM_OCTAVES 16\n" +
                "\n" +
                "uniform float time;\n" +
                "uniform vec2 resolution;\n" +
                "\n" +
                "mat3 rotX(float a) {\n" +
                "    float c = cos(a);\n" +
                "    float s = sin(a);\n" +
                "    return mat3(\n" +
                "        1, 0, 0,\n" +
                "        0, c, -s,\n" +
                "        0, s, c\n" +
                "    );\n" +
                "}\n" +
                "mat3 rotY(float a) {\n" +
                "    float c = cos(a);\n" +
                "    float s = sin(a);\n" +
                "    return mat3(\n" +
                "        c, 0, -s,\n" +
                "        0, 1, 0,\n" +
                "        s, 0, c\n" +
                "    );\n" +
                "}\n" +
                "\n" +
                "float random(vec2 pos) {\n" +
                "    return fract(sin(dot(pos.xy, vec2(1399.9898, 78.233))) * 43758.5453123);\n" +
                "}\n" +
                "\n" +
                "float noise(vec2 pos) {\n" +
                "    vec2 i = floor(pos);\n" +
                "    vec2 f = fract(pos);\n" +
                "    float a = random(i + vec2(0.0, 0.0));\n" +
                "    float b = random(i + vec2(1.0, 0.0));\n" +
                "    float c = random(i + vec2(0.0, 1.0));\n" +
                "    float d = random(i + vec2(1.0, 1.0));\n" +
                "    vec2 u = f * f * (3.0 - 2.0 * f);\n" +
                "    return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y;\n" +
                "}\n" +
                "\n" +
                "float fbm(vec2 pos) {\n" +
                "    float v = 0.0;\n" +
                "    float a = 0.5;\n" +
                "    vec2 shift = vec2(100.0);\n" +
                "    mat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));\n" +
                "    for (int i=0; i<NUM_OCTAVES; i++) {\n" +
                "        v += a * noise(pos);\n" +
                "        pos = rot * pos * 2.0 + shift;\n" +
                "        a *= 0.5;\n" +
                "    }\n" +
                "    return v;\n" +
                "}\n" +
                "\n" +
                "void main(void) {\n" +
                "    vec2 p = (gl_FragCoord.xy * 1.0 - resolution.xy) / min(resolution.x, resolution.y);\n" +
                "\n" +
                "    float t = 0.0, d;\n" +
                "\n" +
                "    float time2 = 0.6 * time / 2.0;\n" +
                "\n" +
                "    vec2 q = vec2(0.0);\n" +
                "    q.x = fbm(p + 0.30 * time2);\n" +
                "    q.y = fbm(p + vec2(1.0));\n" +
                "    vec2 r = vec2(0.0);\n" +
                "    r.x = fbm(p + 1.0 * q + vec2(1.2, 3.2) + 0.135 * time2);\n" +
                "    r.y = fbm(p + 1.0 * q + vec2(8.8, 2.8) + 0.126 * time2);\n" +
                "    float f = fbm(p + r);\n" +
                "    vec3 color = mix(\n" +
                "        vec3(0.0, 0.0, 0),\n" +
                "        vec3(1, 0, 0.7),\n" +
                "        clamp((f * f) * 8.0, 0.0, 5.0)\n" +
                "    );\n" +
                "\n" +
                "    color = mix(\n" +
                "        color,\n" +
                "        vec3(0, 0, 1),\n" +
                "        clamp(length(q), 0.0, 1.0)\n" +
                "    );\n" +
                "\n" +
                "\n" +
                "    color = mix(\n" +
                "        color,\n" +
                "        vec3(1, 1, 1),\n" +
                "        clamp(length(r.x), 0.0, 1.0)\n" +
                "    );\n" +
                "\n" +
                "    color = (f * f * f + 0.6 * f * f + 0.9 * f) * color;\n" +
                "\n" +
                "    gl_FragColor = vec4(color, 1.0);\n" +
                "}");
        
    }

    public void drawQuads(float x, float y, float width, float height) {
        buffer.begin(9, DefaultVertexFormats.POSITION_TEX);
        buffer.pos(x, y).tex(0.0f, 0.0f).endVertex();
        buffer.pos(x, y + height).tex(0.0f, 1.0f).endVertex();
        buffer.pos(x + width, y + height).tex(1.0f, 1.0f).endVertex();
        buffer.pos(x + width, y).tex(1.0f, 0.0f).endVertex();
        tessellator.draw();
    }

    public void begin() {
        GL20.glUseProgram(this.shaderID);
    }

    public void end() {
        GL20.glUseProgram(0);
    }

    public void setUniform(String string, float ... fArray) {
        int n = GL20.glGetUniformLocation(this.shaderID, string);
        switch (fArray.length) {
            case 1: {
                ARBShaderObjects.glUniform1fARB(n, fArray[0]);
                break;
            }
            case 2: {
                ARBShaderObjects.glUniform2fARB(n, fArray[0], fArray[1]);
                break;
            }
            case 3: {
                ARBShaderObjects.glUniform3fARB(n, fArray[0], fArray[1], fArray[2]);
                break;
            }
            case 4: {
                ARBShaderObjects.glUniform4fARB(n, fArray[0], fArray[1], fArray[2], fArray[3]);
            }
        }
    }

    private int createShader(String string) {
        int gled = GL20.glCreateShader(35632);
        GL20.glShaderSource(gled, (CharSequence)FileUtil.readInputStream(new ByteArrayInputStream(string.getBytes())));
        GL20.glCompileShader(gled);
        return gled;
    }
}
дальше пишем в Expensive.java в методе clientLoad()
ShaderUtils.init();

и для того чтобы использовать шейдер в мейн меню пастим следующий код в метод render в классе MainScreen

MainScreen.java:
        ShaderUtils.MAIN_MENU.begin();
        ShaderUtils.MAIN_MENU.setUniform("time", mc.timer.getPartialTicks(1) / 20.0F);
        ShaderUtils.MAIN_MENU.setUniform("resolution", mc.getMainWindow().getScaledWidth(), mc.getMainWindow().getScaledHeight());
        ShaderUtils.MAIN_MENU.drawQuads(0,0, mc.getMainWindow().getScaledWidth(), mc.getMainWindow().getScaledHeight());
        ShaderUtils.MAIN_MENU.end();
 
Начинающий
Статус
Оффлайн
Регистрация
12 Авг 2021
Сообщения
148
Реакции[?]
3
Поинты[?]
2K
кароче, челы кто не может починить белый экран, то вот вам нормальный shaderutils

ShaderUtils.java:
public class ShaderUtils implements Util {
   
    public static ShaderUtils MAIN_MENU;
   
    private final int shaderID = GL20.glCreateProgram();

    public ShaderUtils(String string) {
        GL20.glAttachShader(this.shaderID, this.createShader(string));
        GL20.glLinkProgram(this.shaderID);
    }

    public static void init() {
        MAIN_MENU = new ShaderUtils("#ifdef GL_ES\n" +
                "precision mediump float;\n" +
                "#endif\n" +
                "\n" +
                "#extension GL_OES_standard_derivatives : enable\n" +
                "\n" +
                "#define NUM_OCTAVES 16\n" +
                "\n" +
                "uniform float time;\n" +
                "uniform vec2 resolution;\n" +
                "\n" +
                "mat3 rotX(float a) {\n" +
                "    float c = cos(a);\n" +
                "    float s = sin(a);\n" +
                "    return mat3(\n" +
                "        1, 0, 0,\n" +
                "        0, c, -s,\n" +
                "        0, s, c\n" +
                "    );\n" +
                "}\n" +
                "mat3 rotY(float a) {\n" +
                "    float c = cos(a);\n" +
                "    float s = sin(a);\n" +
                "    return mat3(\n" +
                "        c, 0, -s,\n" +
                "        0, 1, 0,\n" +
                "        s, 0, c\n" +
                "    );\n" +
                "}\n" +
                "\n" +
                "float random(vec2 pos) {\n" +
                "    return fract(sin(dot(pos.xy, vec2(1399.9898, 78.233))) * 43758.5453123);\n" +
                "}\n" +
                "\n" +
                "float noise(vec2 pos) {\n" +
                "    vec2 i = floor(pos);\n" +
                "    vec2 f = fract(pos);\n" +
                "    float a = random(i + vec2(0.0, 0.0));\n" +
                "    float b = random(i + vec2(1.0, 0.0));\n" +
                "    float c = random(i + vec2(0.0, 1.0));\n" +
                "    float d = random(i + vec2(1.0, 1.0));\n" +
                "    vec2 u = f * f * (3.0 - 2.0 * f);\n" +
                "    return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y;\n" +
                "}\n" +
                "\n" +
                "float fbm(vec2 pos) {\n" +
                "    float v = 0.0;\n" +
                "    float a = 0.5;\n" +
                "    vec2 shift = vec2(100.0);\n" +
                "    mat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));\n" +
                "    for (int i=0; i<NUM_OCTAVES; i++) {\n" +
                "        v += a * noise(pos);\n" +
                "        pos = rot * pos * 2.0 + shift;\n" +
                "        a *= 0.5;\n" +
                "    }\n" +
                "    return v;\n" +
                "}\n" +
                "\n" +
                "void main(void) {\n" +
                "    vec2 p = (gl_FragCoord.xy * 1.0 - resolution.xy) / min(resolution.x, resolution.y);\n" +
                "\n" +
                "    float t = 0.0, d;\n" +
                "\n" +
                "    float time2 = 0.6 * time / 2.0;\n" +
                "\n" +
                "    vec2 q = vec2(0.0);\n" +
                "    q.x = fbm(p + 0.30 * time2);\n" +
                "    q.y = fbm(p + vec2(1.0));\n" +
                "    vec2 r = vec2(0.0);\n" +
                "    r.x = fbm(p + 1.0 * q + vec2(1.2, 3.2) + 0.135 * time2);\n" +
                "    r.y = fbm(p + 1.0 * q + vec2(8.8, 2.8) + 0.126 * time2);\n" +
                "    float f = fbm(p + r);\n" +
                "    vec3 color = mix(\n" +
                "        vec3(0.0, 0.0, 0),\n" +
                "        vec3(1, 0, 0.7),\n" +
                "        clamp((f * f) * 8.0, 0.0, 5.0)\n" +
                "    );\n" +
                "\n" +
                "    color = mix(\n" +
                "        color,\n" +
                "        vec3(0, 0, 1),\n" +
                "        clamp(length(q), 0.0, 1.0)\n" +
                "    );\n" +
                "\n" +
                "\n" +
                "    color = mix(\n" +
                "        color,\n" +
                "        vec3(1, 1, 1),\n" +
                "        clamp(length(r.x), 0.0, 1.0)\n" +
                "    );\n" +
                "\n" +
                "    color = (f * f * f + 0.6 * f * f + 0.9 * f) * color;\n" +
                "\n" +
                "    gl_FragColor = vec4(color, 1.0);\n" +
                "}");
       
    }

    public void drawQuads(float x, float y, float width, float height) {
        buffer.begin(9, DefaultVertexFormats.POSITION_TEX);
        buffer.pos(x, y).tex(0.0f, 0.0f).endVertex();
        buffer.pos(x, y + height).tex(0.0f, 1.0f).endVertex();
        buffer.pos(x + width, y + height).tex(1.0f, 1.0f).endVertex();
        buffer.pos(x + width, y).tex(1.0f, 0.0f).endVertex();
        tessellator.draw();
    }

    public void begin() {
        GL20.glUseProgram(this.shaderID);
    }

    public void end() {
        GL20.glUseProgram(0);
    }

    public void setUniform(String string, float ... fArray) {
        int n = GL20.glGetUniformLocation(this.shaderID, string);
        switch (fArray.length) {
            case 1: {
                ARBShaderObjects.glUniform1fARB(n, fArray[0]);
                break;
            }
            case 2: {
                ARBShaderObjects.glUniform2fARB(n, fArray[0], fArray[1]);
                break;
            }
            case 3: {
                ARBShaderObjects.glUniform3fARB(n, fArray[0], fArray[1], fArray[2]);
                break;
            }
            case 4: {
                ARBShaderObjects.glUniform4fARB(n, fArray[0], fArray[1], fArray[2], fArray[3]);
            }
        }
    }

    private int createShader(String string) {
        int gled = GL20.glCreateShader(35632);
        GL20.glShaderSource(gled, (CharSequence)FileUtil.readInputStream(new ByteArrayInputStream(string.getBytes())));
        GL20.glCompileShader(gled);
        return gled;
    }
}
дальше пишем в Expensive.java в методе clientLoad()
ShaderUtils.init();

и для того чтобы использовать шейдер в мейн меню пастим следующий код в метод render в классе MainScreen

MainScreen.java:
        ShaderUtils.MAIN_MENU.begin();
        ShaderUtils.MAIN_MENU.setUniform("time", mc.timer.getPartialTicks(1) / 20.0F);
        ShaderUtils.MAIN_MENU.setUniform("resolution", mc.getMainWindow().getScaledWidth(), mc.getMainWindow().getScaledHeight());
        ShaderUtils.MAIN_MENU.drawQuads(0,0, mc.getMainWindow().getScaledWidth(), mc.getMainWindow().getScaledHeight());
        ShaderUtils.MAIN_MENU.end();
про """ """ не слышали?
 
Начинающий
Статус
Оффлайн
Регистрация
12 Авг 2021
Сообщения
148
Реакции[?]
3
Поинты[?]
2K
У меня и так работает
оно будет работать и так и так, но с """ """ было бы удобней


хуйня:
public class ShaderUtils implements Util {
    
    public static ShaderUtils MAIN_MENU;
    
    private final int shaderID = GL20.glCreateProgram();

    public ShaderUtils(String string) {
        GL20.glAttachShader(this.shaderID, this.createShader(string));
        GL20.glLinkProgram(this.shaderID);
    }

    public static void init() {
        
        
        MAIN_MENU = new ShaderUtils("""

        #ifdef GL_ES
precision mediump float;
#endif

#extension GL_OES_standard_derivatives : enable

#define NUM_OCTAVES 16

uniform float time;
uniform vec2 resolution;

mat3 rotX(float a) {
    float c = cos(a);
    float s = sin(a);
    return mat3(
        1, 0, 0,
        0, c, -s,
        0, s, c
    );
}
mat3 rotY(float a) {
    float c = cos(a);
    float s = sin(a);
    return mat3(
        c, 0, -s,
        0, 1, 0,
        s, 0, c
    );
}

float random(vec2 pos) {
    return fract(sin(dot(pos.xy, vec2(1399.9898, 78.233))) * 43758.5453123);
}

float noise(vec2 pos) {
    vec2 i = floor(pos);
    vec2 f = fract(pos);
    float a = random(i + vec2(0.0, 0.0));
    float b = random(i + vec2(1.0, 0.0));
    float c = random(i + vec2(0.0, 1.0));
    float d = random(i + vec2(1.0, 1.0));
    vec2 u = f * f * (3.0 - 2.0 * f);
    return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y;
}

float fbm(vec2 pos) {
    float v = 0.0;
    float a = 0.5;
    vec2 shift = vec2(100.0);
    mat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));
    for (int i=0; i<NUM_OCTAVES; i++) {
        v += a * noise(pos);
        pos = rot * pos * 2.0 + shift;
        a *= 0.5;
    }
    return v;
}

void main(void) {
    vec2 p = (gl_FragCoord.xy * 1.0 - resolution.xy) / min(resolution.x, resolution.y);

    float t = 0.0, d;

    float time2 = 0.6 * time / 2.0;

    vec2 q = vec2(0.0);
    q.x = fbm(p + 0.30 * time2);
    q.y = fbm(p + vec2(1.0));
    vec2 r = vec2(0.0);
    r.x = fbm(p + 1.0 * q + vec2(1.2, 3.2) + 0.135 * time2);
    r.y = fbm(p + 1.0 * q + vec2(8.8, 2.8) + 0.126 * time2);
    float f = fbm(p + r);
    vec3 color = mix(
        vec3(0.0, 0.0, 0),
        vec3(1, 0, 0.7),
        clamp((f * f) * 8.0, 0.0, 5.0)
    );

    color = mix(
        color,
        vec3(0, 0, 1),
        clamp(length(q), 0.0, 1.0)
    );

    color = mix(
        color,
        vec3(1, 1, 1),
        clamp(length(r.x), 0.0, 1.0)
    );

    color = (f * f * f + 0.6 * f * f + 0.9 * f) * color;

    gl_FragColor = vec4(color, 1.0);
    
    }       

         """);
        
    }

    public void drawQuads(float x, float y, float width, float height) {
        buffer.begin(9, DefaultVertexFormats.POSITION_TEX);
        buffer.pos(x, y).tex(0.0f, 0.0f).endVertex();
        buffer.pos(x, y + height).tex(0.0f, 1.0f).endVertex();
        buffer.pos(x + width, y + height).tex(1.0f, 1.0f).endVertex();
        buffer.pos(x + width, y).tex(1.0f, 0.0f).endVertex();
        tessellator.draw();
    }

    public void begin() {
        GL20.glUseProgram(this.shaderID);
    }

    public void end() {
        GL20.glUseProgram(0);
    }

    public void setUniform(String string, float ... fArray) {
        int n = GL20.glGetUniformLocation(this.shaderID, string);
        switch (fArray.length) {
            case 1: {
                ARBShaderObjects.glUniform1fARB(n, fArray[0]);
                break;
            }
            case 2: {
                ARBShaderObjects.glUniform2fARB(n, fArray[0], fArray[1]);
                break;
            }
            case 3: {
                ARBShaderObjects.glUniform3fARB(n, fArray[0], fArray[1], fArray[2]);
                break;
            }
            case 4: {
                ARBShaderObjects.glUniform4fARB(n, fArray[0], fArray[1], fArray[2], fArray[3]);
            }
        }
    }

    private int createShader(String string) {
        int gled = GL20.glCreateShader(35632);
        GL20.glShaderSource(gled, (CharSequence)FileUtil.readInputStream(new ByteArrayInputStream(string.getBytes())));
        GL20.glCompileShader(gled);
        return gled;
    }
}
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2021
Сообщения
59
Реакции[?]
0
Поинты[?]
0
ShaderUtil.mainmenu.attach();
ShaderUtil.mainmenu.setUniform("time", o/4);
ShaderUtil.mainmenu.setUniform("w", (float)windowWidth);
ShaderUtil.mainmenu.setUniform("h", (float)windowHeight);

drawQuads(0, 0, windowWidth, windowHeight, 7);

ShaderUtil.mainmenu.detach();
GlStateManager.disableBlend();
GlStateManager.popMatrix();

KawaseBlur.blur.updateBlur(3, 4);
drawButtons(matrixStack, mouseX, mouseY, partialTicks);

Expensive.getInstance().getAltWidget().render(matrixStack, mouseX, mouseY);
mc.gameRenderer.setupOverlayRendering();

тут ошибка в shaderutilи drawQuads подскажите че делать
 
Начинающий
Статус
Оффлайн
Регистрация
17 Апр 2023
Сообщения
201
Реакции[?]
2
Поинты[?]
0
а почему не сделать так?
eeee:
ShaderUtil.mainmenu.setUniform("resolution", (float)windowWidth, (float)windowHeight);
 
Начинающий
Статус
Оффлайн
Регистрация
15 Дек 2023
Сообщения
84
Реакции[?]
1
Поинты[?]
2K
1. Выбираем нужный шейдер
тута:
Пожалуйста, авторизуйтесь для просмотра ссылки.
(noad)
выбрали, нажимаем кнопку showcode слева сверху
переходим к пункту 2

2. Изменяем шейдер:
Заходим в код шейдера, ищем
uniform vec2 resolution
Меняем на:
uniform float w
uniform float h

Ищем строку похожую на эту:Посмотреть вложение 272616
Изменяем resolution.xy на vec2(w,h)
Если в коде есть resolution.x то меняем его на w
а ещё
Если в коде есть resolution.y то меняем его на h

3. Создаём файл шейдера в экспенсиве
идём по пути im/expensive/utils/shader/shaders/ и создаём там файл Mainmenu.java
вставляем туда код:

Mainmenu.java:
package im.expensive.utils.shader.shaders;

import im.expensive.utils.shader.IShader;

public class Mainmenu implements IShader {

    @Override
    public String glsl() {
        return """
                шадер
               """;
    }

}
после, меняем на строке 10 текст шадер на код шейдера который вы изменили в пункте 2

4. Регистрируем шейдер в списке шейдеров:
заходим в файл Shaders.java по пути im/expensive/utils/shader/
после 46 строки делаем новую строку и вставляем туда:
Java:
    @Getter
    private IShader mainmenu = new Mainmenu();
если возникает ошибка - Alt + Enter или импортируем шейдер через import im.expensive.utils.shader.shaders.Mainmenu; на 17 строку

5. Регистрируем шейдер в утилке:
заходим в файл ShaderUtil.java по пути im/expensive/utils/shader/
на 37 строку втсавляем:
public static ShaderUtil mainmenu = new ShaderUtil("Mainmenu");

6. Рендерим шейдер
заходим в файл MainScreen.java по пути im/expensive/ui/mainmenu/
и вместо 106 строки вставляем такой код:
Java:
for(float i=0;i<1488;i++){
            if(timer.isReached(10)){
                o++;
                i=0;
                timer.reset();
            }
        }
   
        GlStateManager.pushMatrix();
        GlStateManager.enableBlend();

        ShaderUtil.mainmenu.attach();
        ShaderUtil.mainmenu.setUniform("time", o/4);
        ShaderUtil.mainmenu.setUniform("w", (float)windowWidth);
        ShaderUtil.mainmenu.setUniform("h", (float)windowHeight);

        drawQuads(0, 0, windowWidth, windowHeight, 7);

        ShaderUtil.mainmenu.detach();
        GlStateManager.disableBlend();
       GlStateManager.popMatrix();
на 39 строку вставляем:
Java:
    public final StopWatch timer = new StopWatch();
    public float o = 0;
гатово :seemsgood: Посмотреть вложение 272622
я дурачьок конечно, но как фиксить1719591764728.png
 
Сверху Снизу