Я использую LWJGL для создания простой воксельной штуковины в качестве некоторой практики, в качестве умеренно простого проекта для ознакомления с Kotlin.
Итак, у меня есть рендеринг вокселя, за исключением рендеринга вокселя с разными текстурами для каждого лица.
Все выглядит нормально, пока я не начну двигаться... затем:
Если кому-то нужен весь репозиторий, он здесь
Что касается соответствующих классов, я не слишком уверен, что имеет значение, но вот то, что генерирует 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() из своего кода. К сожалению, проблема не устранена: