Гамма это про освещение, то что ты хочешь сделать это скорее пост-процессинг
1 из вариантов реализации: Использовать фреймбуффер майнкрафта и рендерить его картинку с наложенным шейдером, и шейдером ты можешь изменять цветность картинки
Возможно подойдет для такого какой-нибудь RenderOverlayEvent который происходит после рендера мира, но перед рендером интерфейса, т.е. Pre
Дальше достаешь фреймбуффер, достать его можно сразу в классе майнкрафта, вроде
Minecraft.getMinecraft().getFramebuffer(), биндишь его текстуру, есть метод вроде даже отдельный там
Далее накладываешь шейдер через
glUseProgram(programID) и рендеришь квадрат на весь экран с текстурой фреймбуффера
далее отключаешь шейдер используя вместо programID 0 и в целом всё
Есть еще совет, фреймбуфферы всегда возвращают картинку в перевернутом формате, поэтому нужно от 1 отнять текстурную координату Y
Примерный код фрагментного шейдера который может получится:
uniform float u_stepping; //шаг от обычного цвета к черно-белому 0.0-1.0
uniform sampler2D u_texture; //текстура, нужно установить на int 0
varying vec2 v_texCoords;
void main() {
vec4 color = texture2D(u_texture, v_texCoords);
float gray = 0.21 * color.r + 0.71 * color.g + 0.07 * color.b;
gl_FragColor = mix(color, vec4(gray, gray, gray, 1.0), u_stepping);
}
Вершинный:
varying vec2 v_texCoords;
void main() {
gl_Position = ftransform();
v_texCoords = vec2(gl_MultiTexCoord0.x, 1.0 - gl_MultiTexCoord0.y); //инверсия текстурных координат
gl_TexCoord[0] = gl_MultiTexCoord0; //эта строка может и не понадобится(старые исходники)
}
При компиляции шейдеров скорее всего понадобятся методы из GL20 класса, это вроде нигде не указано, но если что ищи в GL11, GL12, GL20 и т.п.
Первый попавшийся grayscale шейдер,
урок по компиляции шейдеров,
статья объясняющая как работают шейдеры(наверное)