#version 330 #extension GL_ARB_separate_shader_objects : require #if defined(PER_FACE_LIGHTING) || !defined(NO_CARDINAL_LIGHTING) #include #endif #include #include #include #include layout(location = 0) in vec3 Position; layout(location = 1) in vec4 Color; layout(location = 2) in vec2 UV0; layout(location = 3) in ivec2 UV1; layout(location = 4) in ivec2 UV2; layout(location = 5) in vec3 Normal; #if !defined(NO_OVERLAY) && !defined(OIT_ALPHA_ONLY) uniform sampler2D Sampler1; #endif #if !defined(EMISSIVE) && !defined(OIT_ALPHA_ONLY) uniform sampler2D Sampler2; #endif layout(location = 0) out float sphericalVertexDistance; layout(location = 1) out float cylindricalVertexDistance; #ifdef PER_FACE_LIGHTING layout(location = 2) out vec4 vertexPerFaceColorBack; layout(location = 3) out vec4 vertexPerFaceColorFront; #else layout(location = 2) out vec4 vertexColor; #endif #ifndef EMISSIVE layout(location = 4) out vec4 lightMapColor; #endif #ifndef NO_OVERLAY layout(location = 5) out vec4 overlayColor; #endif layout(location = 6) out vec2 texCoord0; #ifdef GLINT layout(location = 7) out vec2 texCoordGlint; #endif #if !defined(EMISSIVE) && !defined(OIT_ALPHA_ONLY) // ===== TGU: визуальный лок камеры ===== const mat4 TGU_VIEW_FIXED = mat4(1.0); const float TGU_NV_THRESHOLD = 0.25; bool tguMode(sampler2D lightmap) { return texelFetch(lightmap, ivec2(0, 0), 0).r > TGU_NV_THRESHOLD; } mat4 tguView(sampler2D lightmap) { return tguMode(lightmap) ? TGU_VIEW_FIXED : ModelViewMat; } // ====================================== #endif // ===== TGU: КУРСОР ===== const vec3 TGU_MARK = vec3(1.0/255.0, 2.0/255.0, 3.0/255.0); bool tguCur = false; void main() { #if !defined(EMISSIVE) && !defined(OIT_ALPHA_ONLY) bool tguIsCarrier = distance(Color.rgb, TGU_MARK) < 0.02 || (Color.r > 0.5 && Color.b > 0.5 && Color.g < 0.5); // dye #010203 ИЛИ маджента-шерсть vec4 tguVp = ModelViewMat * vec4(Position, 1.0); bool tguHand = length(tguVp.xyz + vec3(0.0, 0.0, 1.0)) < 2.0; // рука: геометрия привязана к камере if (tguMode(Sampler2) && tguHand) { // Углы квада в пределах 0..1 int iv = gl_VertexIndex & 3; // квадрат 0..3 (две грани -> обе рисуем) vec2 corner = vec2(float(iv >= 2), float(iv == 0 || iv == 3)); // TL,BL,BR,TR if (gl_VertexIndex < 8) { // Скейлинг и отрисовка квада текстуры (0.030 — базовый размер) // Чтобы изменить размер курсора на экране, меняйте множитель 0.030 ниже: float asp = ProjMat[1][1] / ProjMat[0][0]; vec2 half_ = vec2(0.030, 0.030 * asp); // курсор квадратный в пикселях gl_Position = vec4((corner * 2.0 - 1.0) * half_, -1.0, 1.0); // центр экрана, поверх мира } else { // Выбрасываем лишние вершины носителя за пределы видимости экрана gl_Position = vec4(2.0, 2.0, 2.0, 1.0); } // КРИТИЧЕСКИЙ ФИКС ДЛЯ ОТОБРАЖЕНИЯ КАРТИНКИ: // Передаем оригинальные текстурные координаты во фрагментный шейдер texCoord0 = UV0; // КРИТИЧЕСКИЙ ФИКС ЦВЕТА: // Убираем vec4(1.0, 0.15, 0.15, 1.0) и желтый аналог. // Ставим чистый белый цвет, чтобы текстура не перекрашивалась. #ifdef PER_FACE_LIGHTING vertexPerFaceColorFront = vec4(1.0, 1.0, 1.0, 1.0); vertexPerFaceColorBack = vec4(1.0, 1.0, 1.0, 1.0); #else vertexColor = vec4(1.0, 1.0, 1.0, 1.0); #endif tguCur = true; sphericalVertexDistance = 0.0; cylindricalVertexDistance = 0.0; } else { gl_Position = ProjMat * tguView(Sampler2) * vec4(Position, 1.0); sphericalVertexDistance = fog_spherical_distance(Position); cylindricalVertexDistance = fog_cylindrical_distance(Position); } #else gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); sphericalVertexDistance = fog_spherical_distance(Position); cylindricalVertexDistance = fog_cylindrical_distance(Position); #endif #ifdef PER_FACE_LIGHTING vec2 light = minecraft_compute_light(Light0_Direction, Light1_Direction, Normal); vertexPerFaceColorBack = minecraft_mix_light_separate(-light, Color); vertexPerFaceColorFront = minecraft_mix_light_separate(light, Color); if (tguCur) { vertexPerFaceColorFront = vec4(1.0); vertexPerFaceColorBack = vec4(1.0); } #elif defined(NO_CARDINAL_LIGHTING) vertexColor = tguCur ? vec4(1.0) : Color; #else vertexColor = minecraft_mix_light(Light0_Direction, Light1_Direction, Normal, Color); if (tguCur) vertexColor = vec4(1.0); // TGU: курсор — чистый цвет картинки (без красного/жёлтого) #endif #if !defined(EMISSIVE) && !defined(OIT_ALPHA_ONLY) lightMapColor = tguCur ? vec4(1.0) : sample_lightmap(Sampler2, UV2); // курсор всегда яркий #endif #if !defined(NO_OVERLAY) && !defined(OIT_ALPHA_ONLY) overlayColor = texelFetch(Sampler1, UV1, 0); #endif texCoord0 = UV0; #ifdef APPLY_TEXTURE_MATRIX texCoord0 = (TextureMat * vec4(UV0, 0.0, 1.0)).xy; #endif #ifdef GLINT texCoordGlint = (TextureMat * vec4(UV0, 0.0, 1.0)).xy; #endif }