Хобрук: Ваш путь к мастерству в программировании

Ошибка текстуры OpenGL с лицами

Я использую LWJGL для создания простой воксельной штуковины в качестве некоторой практики, в качестве умеренно простого проекта для ознакомления с Kotlin.

Итак, у меня есть рендеринг вокселя, за исключением рендеринга вокселя с разными текстурами для каждого лица.

Все выглядит нормально, пока я не начну двигаться... затем: what

Если кому-то нужен весь репозиторий, он здесь

Что касается соответствующих классов, я не слишком уверен, что имеет значение, но вот то, что генерирует glVertex3f и glTexture2f:

public class Shape
{
    class object
    {
        public fun CreateCube(x: Float, y: Float, z: Float, colour: ColourRGBA, tex: MutableList<TextureCoords>, size: Float)
        {
            val sheet: Spritesheet = Main.Instance!!.blocksprites

            var textures: MutableList<TextureCoords> = arrayListOf()
            if (tex.size == 1)
            {

                for (i in 0 .. 5)
                    textures.add(tex[0])
            }
            else
                textures.addAll(tex)







            // bottom face
            // bottom face (0, 1)
            GL11.glColor4f(colour.red.toFloat(), colour.green.toFloat(), colour.blue.toFloat(), colour.alpha.toFloat());
            GL11.glTexCoord2f(textures[0].x, textures[0].y + sheet.GetUniformSize());
            GL11.glVertex3f(x, y, z + size);
            GL11.glTexCoord2f(textures[0].x + sheet.GetUniformSize(), textures[0].y + sheet.GetUniformSize());
            GL11.glVertex3f(x + size, y, z + size);
            GL11.glTexCoord2f(textures[0].x + sheet.GetUniformSize(), textures[0].y);
            GL11.glVertex3f(x + size, y, z);
            GL11.glTexCoord2f(textures[0].x, textures[0].y);
            GL11.glVertex3f(x, y, z);

            // top face (2, 3)
            GL11.glColor4f(colour.red.toFloat(), colour.green.toFloat(), colour.blue.toFloat(), colour.alpha.toFloat());
            GL11.glTexCoord2f(textures[1].x, textures[1].y + sheet.GetUniformSize());
            GL11.glVertex3f(x, y + size, z);
            GL11.glTexCoord2f(textures[1].x + sheet.GetUniformSize(), textures[1].y + sheet.GetUniformSize());
            GL11.glVertex3f(x + size, y + size, z);
            GL11.glTexCoord2f(textures[1].x + sheet.GetUniformSize(), textures[1].y);
            GL11.glVertex3f(x + size, y + size, z + size);
            GL11.glTexCoord2f(textures[1].x, textures[1].y);
            GL11.glVertex3f(x, y + size, z + size);

            // front face (4, 5)
            GL11.glColor4f(colour.red.toFloat(), colour.green.toFloat(), colour.blue.toFloat(), colour.alpha.toFloat());
            GL11.glTexCoord2f(textures[2].x, textures[2].y + sheet.GetUniformSize());
            GL11.glVertex3f(x, y, z);
            GL11.glTexCoord2f(textures[2].x + sheet.GetUniformSize(), textures[2].y + sheet.GetUniformSize());
            GL11.glVertex3f(x + size, y, z);
            GL11.glTexCoord2f(textures[2].x + sheet.GetUniformSize(), textures[2].y);
            GL11.glVertex3f(x + size, y + size, z);
            GL11.glTexCoord2f(textures[2].x, textures[2].y);
            GL11.glVertex3f(x, y + size, z);

            // back face (6, 7)
            GL11.glColor4f(colour.red.toFloat(), colour.green.toFloat(), colour.blue.toFloat(), colour.alpha.toFloat());
            GL11.glTexCoord2f(textures[3].x, textures[3].y);
            GL11.glVertex3f(x, y + size, z + size);
            GL11.glTexCoord2f(textures[3].x + sheet.GetUniformSize(), textures[3].y);
            GL11.glVertex3f(x + size, y + size, z + size);
            GL11.glTexCoord2f(textures[3].x + sheet.GetUniformSize(), textures[3].y + sheet.GetUniformSize());
            GL11.glVertex3f(x + size, y, z + size);
            GL11.glTexCoord2f(textures[3].x, textures[3].y + sheet.GetUniformSize());
            GL11.glVertex3f(x, y, z + size);

            // left face (8, 9)
            GL11.glColor4f(colour.red.toFloat(), colour.green.toFloat(), colour.blue.toFloat(), colour.alpha.toFloat());
            GL11.glTexCoord2f(textures[4].x, textures[4].y + sheet.GetUniformSize());
            GL11.glVertex3f(x + size, y, z);
            GL11.glTexCoord2f(textures[4].x + sheet.GetUniformSize(), textures[4].y + sheet.GetUniformSize());
            GL11.glVertex3f(x + size, y, z + size);
            GL11.glTexCoord2f(textures[4].x + sheet.GetUniformSize(), textures[4].y);
            GL11.glVertex3f(x + size, y + size, z + size);
            GL11.glTexCoord2f(textures[4].x, textures[4].y);
            GL11.glVertex3f(x + size, y + size, z);

            // right face (10, 11)
            GL11.glColor4f(colour.red.toFloat(), colour.green.toFloat(), colour.blue.toFloat(), colour.alpha.toFloat());
            GL11.glTexCoord2f(textures[5].x, textures[5].y + sheet.GetUniformSize());
            GL11.glVertex3f(x, y, z + size);
            GL11.glTexCoord2f(textures[5].x + sheet.GetUniformSize(), textures[5].y + sheet.GetUniformSize());
            GL11.glVertex3f(x, y, z);
            GL11.glTexCoord2f(textures[5].x + sheet.GetUniformSize(), textures[5].y);
            GL11.glVertex3f(x, y + size, z);
            GL11.glTexCoord2f(textures[5].x, textures[5].y);
            GL11.glVertex3f(x, y + size, z + size);
        }
    }
}

РЕДАКТИРОВАТЬ: после небольшого дополнительного тестирования я понимаю, что у меня появляется странный сбой, только когда камера находится над рассматриваемым вокселем. Подобные блоки я разместил в другом месте с открытыми только боковыми гранями, и если смотреть снизу, они в порядке:

Камера чуть выше блока (проблема обостряется по мере удаления камеры): введите здесь описание изображенияКамера под блоком: < img src="https://i.stack.imgur.com/3oXS6.png" alt="введите здесь описание изображения">

РЕДАКТИРОВАТЬ 2: после некоторого дополнительного тестирования выясняется, что проблема скорее связана с взаимодействием любых двух разных типов блоков с разными текстурами... Так что, вероятно, это не проблема для каждого лица, а скорее лицо Вещь взаимодействия с лицом? Не знаю.

РЕДАКТИРОВАТЬ 3: я решил попытаться определить проблему, поэтому я удалил вызовы glTexCoords2f() из своего кода. К сожалению, проблема не устранена:введите здесь описание изображения


Ответы:


1

So.

GLU.gluPerspective(67.0f, (width / height).toFloat(), 0.0001f, 1000.0f)

Как насчет GLU.gluPerspective(67.0f, (width / height).toFloat(), 0.5f, 1000.0f)

По сути, уменьшите минимальное расстояние обзора, чтобы решить проблему.

05.05.2014
  • Если быть точнее о причине этого. Этот артефакт называется Z-борьбой и возникает из-за того, что полигоны расположены слишком близко друг к другу или из-за z-буфера со слишком низким разрешением. Z-буфер в OpenGL является логарифмическим, поэтому установка плоскости отсечения очень близко к камере приводит к z-борьбе намного быстрее. 05.05.2014
  • хорошо, спасибо за более подробное объяснение. На самом деле я нашел решение на SO, но я думаю, что сначала не знал условий поиска. 06.05.2014
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..