Собственный туман (1.7.10)

Может быть... Вечером, проверю... Но опять же, повторюсь, фог денсити работает нормально... Хотя, строчку с проверкой тоже не выводит :-\
[merge_posts_bbcode]Добавлено: 08.06.2016 13:39:48[/merge_posts_bbcode]

А вообще, я тут задумался над фразой:
XuPuPG написал(а):
Что бы добыть gl_FragCoord.z надо написать свою шейдерную программу в моде,и прицепить файлы вершинного и фрагментного шейдеров.а потом в этих файлах добывать всё что тебе надо.в майне уже есть шейдеры,только они на json , типа демонстрация возможностей(лагучие).
Всё пытаюсь понять три вещи:
1 - Шейдерную программу мне писать в Эвентах или где-то ещё?
2 - Откуда взять файлы вершинного и фрагментного шейдеров? Есть где-нибудь примеры таких файлов?
3 - Как прицепить эти файлы?

И ещё, по поводу ссылки, данной Хирургом: этой.
Всё там написано, как я понимаю, на Котлине? Но это не суть... Вопрос, где мне писать всё это? В тех самых файлах шейдеров?

Знающие люди отзовитесь, плиз. Мне нужен волшебный пинок.
 
А чё не работает то? Работает :p 
5Cjjzut.png
 
Хз
EventHandlerr:
Код:
public class EventHandlerr
{
    private FloatBuffer buffer = BufferUtils.createFloatBuffer(16);
    
    @SubscribeEvent
    public void onRenderFogEvent(RenderFogEvent event)
    {
        GL11.glFog(GL11.GL_FOG_COLOR, createBuffer(0.0F, 20.0F, 0.0F, 1.0F)); // Цвет
        GL11.glFogf(GL11.GL_FOG_START, 0.0F); // начало тумана от игрока
        GL11.glFogf(GL11.GL_FOG_END, 10.0F); // конец, в данном случае - 10 блоков
    }

    private FloatBuffer createBuffer(float var1, float var2, float var3, float var4)
    {
        buffer.clear();
        buffer.put(var1).put(var2).put(var3).put(var4);
        buffer.flip();
        return buffer;
    }
}

Главный класс:
Код:
    @EventHandler
    public void preInit(FMLPreInitializationEvent event)
    {
        MinecraftForge.EVENT_BUS.register(new EventHandlerr());
        FMLCommonHandler.instance().bus().register(new EventHandlerr());
    }
 
Мать ё!
Я, кажется, понял!
Всё это нужно писать через .json'ы как описано тут?
Там как раз есть файлы для фрагментного и вертексного шейдеров.
Осталось изучить язык и всё будет пучком )))

Только остаётся вопрос, а как врубать этот шейдер в майне? Через эвент?
Как бы, понятно, что так же как врубаются "Суперсекретные настройки", только вот в каком классе всё это искать?
 
glUseProgram(id) ещё надо загрузить шейдер. Единожды
load data
render
glUseProgram(0)
 
Это как шейдер "наложить"
Джсон лишь связка от можангов
 
Я непонятную муйню с туманом сотворил:silly:, приду с института и скину код с картинками:lol:. загрузка цп 100%:angel:
 
Эх... Нужен ещё один пинок.
Запихнул я файлы шейдеров в свою папочку, но вот как их подрубать и что нужно писать .json-ах (wilah извини, с твоей подсказкой пока не разобрался), ума не приложу.
Пока что имею такое:
В эвенте попытался создать подобие ванильной кнопки "Суперсекретные настройки". Выглядит так:
Код:
private Minecraft mc = Minecraft.getMinecraft();
private IResourceManager resourceManager = Minecraft.getMinecraft().getResourceManager();

@SubscribeEvent
@SideOnly(Side.CLIENT)
public void onRenderFogEvent(RenderFogEvent e) {
    try {
        ShaderGroup theShaderGroup = new ShaderGroup(this.mc.getTextureManager(), this.resourceManager, this.mc.getFramebuffer(), new ResourceLocation("mist:shaders/post/fog.json"));
        theShaderGroup.createBindFramebuffers(this.mc.displayWidth, this.mc.displayHeight);
    } catch (JsonException e1) {
        System.out.println(1);
    }        
}

В папке post:

fog.json
Код:
{
    "targets": [
        "swap"
    ],
    "passes": [
        {
            "name": "fog",
            "intarget": "mist:main",
            "outtarget": "swap"
        },
        {
            "name": "fog",
            "intarget": "swap",
            "outtarget": "mist:main"
        }
    ]
}

И всё, что в папке program:

fog.json
Код:
{
    "blend": {
        "func": "add",
        "srcrgb": "one",
        "dstrgb": "zero"
    },
    "vertex": "fog",
    "fragment": "fog",
    "attributes": [ "Position" ],
    "samplers": [
        { "name": "DiffuseSampler" }
    ],
    "uniforms": [
        { "name": "ProjMat",    "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] },
        { "name": "OutSize",    "type": "float",     "count": 2,  "values": [ 1.0, 1.0 ] }
    ]
}

Код шейдеров скопирован с примера. Пока что, хочу заставить работать хотя бы их.

fog.fsh:
Код:
// FRAGMENT SHADER FOR FOG

uniform sampler2D color_texture;
uniform vec4 fog_color;
uniform float max_fog_height;
uniform float fog_start;
uniform float fog_end;

varying float height;
void main()
{
 // compute factor based on height of fragment in world
 float ratio_height = height / max_fog_height;
 ratio_height = clamp(ratio_height, 0, 1);
 
 // compute factor based on depth of fragment in camera
 float depth_world = gl_FragCoord.z / gl_FragCoord.w;
 float ratio_depth = (fog_end - depth_world) / (fog_end – fog_start);
 ratio_depth = clamp(ratio_depth, 0, 1);

 // combine color of fog and color from texture
 float fog_factor = ratio_height * ratio_depth;
 mix(texture2D(color_texture, gl_TexCoord[0].st), fog_color, fogFactor);
}

fog.vsh:
Код:
// VERTEX SHADER FOR FOG

uniform mat4 view_matrix;

varying float height;

void main()
{
 // get height of vertex in world space
 vec4 V_world = gl_ModelViewMatrix * gl_Vertex;
 height = v_world.z;
 
 gl_TexCoord[0] = gl_MultiTexCoord0;
 gl_Position = gl_ProjectionMatrix * view_matrix * V_world;
}

Наставьте, так сказать...
 
Назад
Сверху