2014-12-20 2 views
1

Так что я работаю над движком игры вокселя в течение последних нескольких дней и столкнулся с некоторыми проблемами с моей моделью куба.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: Обновлен до последней версии.

+0

Я думаю, что вы сделали ошибку с одной или нескольких сторон на извилистое того, из-за чего он лечащим некоторые из них, как спереди, а некоторые, как обратно. Потратьте некоторое время и убедитесь, что все стороны определены правильно. – Iggy

+0

Я просмотрел их примерно полчаса, и порядок намотки кажется правильным –

+0

Не могли бы вы обновить код здесь? Еще одна вещь, которую я заметил, это то, что у вас есть один вызов 'glNormal3f' для лицевой панели. Для каждой стороны вам понадобится другая норма. – Iggy

ответ

1

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

Что касается оптимизации, вы должны изучить использование современного OpenGL с объектами буфера вершин. Это позволяет скомпоновать все ваши vertices, colors, texture coordinates в один массив, а затем вывести его на GPU с помощью одного вызова. Снова вы можете прочитать далее here. (Отличные учебники по современной OpenGL)

enter image description here

Смежные вопросы