Так что я работаю над движком игры вокселя в течение последних нескольких дней и столкнулся с некоторыми проблемами с моей моделью куба.lwjgl текстура отбраковка неправильная
Вот скриншот того, что происходит: (удалено, так что я мог бы опубликовать фото ссылку далее вниз)
Всего моего забоя кажется инвертировать. Я прошел через переполнение стека, ища ответы, но все, что я мог найти, было связано с порядком рендеринга объектов.
Я попытался изменить порядок визуализации своих лиц, но, похоже, это не повлияло на отбраковку.
Вот мой код:
package com.musicalcreeper01.renderer.objects;
import static org.lwjgl.opengl.GL11.*;
public class ModelCube extends Object{
float BLOCK_SIZE = 1;
boolean RenderTop = true;
boolean RenderBottom = true;
boolean RenderBack = true;
boolean RenderFront = true;
boolean RenderLeft = false;
boolean RenderRight = true;
@Override
public void render(){
glPushMatrix();
// set the color of the quad (R,G,B,A)
glColor3f(0.5f,0.5f,1.0f);
glTranslatef(x, y, z);
// draw quad
glBegin(GL_QUADS);
if(texture != null){
texture.bind();
}
if(RenderBack){
//Back
glTexCoord3f(BLOCK_SIZE, 0, 0);
glVertex3f(BLOCK_SIZE, 0, 0);
glTexCoord3f(0, 0, 0);
glVertex3f(0, 0, 0);
glTexCoord3f(0, BLOCK_SIZE, 0);
glVertex3f(0, BLOCK_SIZE, 0);
glTexCoord3f(BLOCK_SIZE, BLOCK_SIZE, 0);
glVertex3f(BLOCK_SIZE, BLOCK_SIZE, 0);
}
if(RenderFront){
//Front
glTexCoord3f(0, 0, BLOCK_SIZE);
glVertex3f(0, 0, BLOCK_SIZE);
glTexCoord3f(0, BLOCK_SIZE, BLOCK_SIZE);
glVertex3f(0, BLOCK_SIZE, BLOCK_SIZE);
glTexCoord3f(BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
glVertex3f(BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE);
glTexCoord3f(BLOCK_SIZE, 0, BLOCK_SIZE);
glVertex3f(BLOCK_SIZE, 0, BLOCK_SIZE);
}
if(RenderRight){
//Right
glTexCoord2f(0,BLOCK_SIZE);
glVertex3f(BLOCK_SIZE,0,BLOCK_SIZE);
glTexCoord2f(BLOCK_SIZE,BLOCK_SIZE);
glVertex3f(BLOCK_SIZE,BLOCK_SIZE,BLOCK_SIZE);
glTexCoord2f(0,BLOCK_SIZE);
glVertex3f(BLOCK_SIZE,BLOCK_SIZE,0);
glTexCoord2f(0,0);
glVertex3f(BLOCK_SIZE,0,0);
}
if(RenderBottom){
//Bottom
glTexCoord2f(0,BLOCK_SIZE);
glVertex3f(BLOCK_SIZE,BLOCK_SIZE,0);
glTexCoord2f(0,0);
glVertex3f(0,BLOCK_SIZE,0);
glTexCoord2f(0,BLOCK_SIZE);
glVertex3f(0,BLOCK_SIZE,BLOCK_SIZE);
glTexCoord2f(BLOCK_SIZE,BLOCK_SIZE);
glVertex3f(BLOCK_SIZE,BLOCK_SIZE,BLOCK_SIZE);
}
if(RenderLeft){
//Left
glTexCoord2f(0,BLOCK_SIZE);
glVertex3f(0,0,BLOCK_SIZE);
glTexCoord2f(0,0);
glVertex3f(0,0,0);
glTexCoord2f(0,BLOCK_SIZE);
glVertex3f(0,BLOCK_SIZE,0);
glTexCoord2f(BLOCK_SIZE,BLOCK_SIZE);
glVertex3f(0,BLOCK_SIZE,BLOCK_SIZE);
}
if(RenderTop){
//Top
glTexCoord2f(0,BLOCK_SIZE);
glVertex3f(BLOCK_SIZE,0,0);
glTexCoord2f(0,0);
glVertex3f(0,0,0);
glTexCoord2f(0,BLOCK_SIZE);
glVertex3f(0,0,BLOCK_SIZE);
glTexCoord2f(BLOCK_SIZE,BLOCK_SIZE);
glVertex3f(BLOCK_SIZE,0,BLOCK_SIZE);
}
glEnd();
glPopMatrix();
}
}
Единственное, что я мог думать, это может быть, это, что я использую квадрациклов вместо треугольников. Я, хотя, поскольку квадроцикл имеет четыре угла, было бы проще и эффективнее, чем рисовать 2 треугольника для каждой стороны.
Кроме того, если кто-то заботится, чтобы дать мне несколько советов по оптимизации моей модели, я бы очень признателен :)
Я довольно новыми для OpenGL, я сделал какую-то работу с ним через год или два назад, и в то время я использовал треугольники, и он работал отлично. Поэтому я догадываюсь, что квадроциклы - это то, почему они не работают, но для меня это не показалось логичным.
EDIT: Я предполагаю, что это связано с нормалями, но мне трудно найти ответы на вопрос о том, как использовать обычные функции.
EDIT 2: Я только что изменил использование списков gl для рендеринга моих объектов, как было предложено Iggy (спасибо;)), и, похоже, они исправили некоторые проблемы с обработкой, которые я получал. Теперь мой ряд кубов выглядит так снаружи: http://i.stack.imgur.com/MYLiO.png и это изнутри: http://i.stack.imgur.com/Ckb9i.png
EDIT 3: Обновлен до последней версии.
Я думаю, что вы сделали ошибку с одной или нескольких сторон на извилистое того, из-за чего он лечащим некоторые из них, как спереди, а некоторые, как обратно. Потратьте некоторое время и убедитесь, что все стороны определены правильно. – Iggy
Я просмотрел их примерно полчаса, и порядок намотки кажется правильным –
Не могли бы вы обновить код здесь? Еще одна вещь, которую я заметил, это то, что у вас есть один вызов 'glNormal3f' для лицевой панели. Для каждой стороны вам понадобится другая норма. – Iggy