Исправить мою функцию рендеринга opengl - PullRequest
0 голосов
/ 09 октября 2011

Я использую это как часть функции рендеринга для моей игры в lwjgl. Он ничего не отображает на экране, но я не могу понять, что испортилось. Программа уже рисует продвинутый мир текстурированных кубов, он будет выбирать тот, на который смотрит игрок. Это, наверное, какая-то тупая обстановка, по которой я скучаю. Я пытался запустить его во все времена цикла рендеринга, а также поиграть с несколькими настройками. Пространственные координаты определенно правильные.

В данный момент я просто пытаюсь заставить его визуализировать белый квадрат поверх выбранных кубов.

        GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glPushMatrix();
    GL11.glLoadIdentity();
    System.out.println("coords: "+left+" "+bottom+" "+back);
    GL11.glColor3f(255f, 255f, 255f);
    //left
    GL11.glBegin(GL11.GL_QUADS);
    GL11.glVertex3f(left, bottom, back);
    GL11.glVertex3f(left, bottom, front);
    GL11.glVertex3f(left, top, front);
    GL11.glVertex3f(left, top, back);
    //right
    GL11.glVertex3f(right, bottom, front);
    GL11.glVertex3f(right, bottom, back);
    GL11.glVertex3f(right, top, back);
    GL11.glVertex3f(right, top, front);
    //top
    GL11.glVertex3f(left, top, front);
    GL11.glVertex3f(right, top, front);
    GL11.glVertex3f(right, top, back);
    GL11.glVertex3f(left, top, back);
    //front
    GL11.glVertex3f(left, bottom, front);
    GL11.glVertex3f(right, bottom, front);
    GL11.glVertex3f(right, top, front);
    GL11.glVertex3f(left, top, front);
    //back
    GL11.glVertex3f(right, bottom, back);
    GL11.glVertex3f(left, bottom, back);
    GL11.glVertex3f(left, top, back);
    GL11.glVertex3f(right, top, back);
    //bottom
    GL11.glVertex3f(right, bottom, front);
    GL11.glVertex3f(left, bottom, front);
    GL11.glVertex3f(left, bottom, back);
    GL11.glVertex3f(right, bottom, back);
    GL11.glEnd();
    GL11.glPopMatrix();

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

    GL11.glTexEnvf(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE,GL11.GL_MODULATE);
    GL11.glClearColor(0.47f,0.55f,1.0f, 0.0f); 
    GL11.glClearDepth(1.0f); 
    GL11.glEnable(GL11.GL_DEPTH_TEST);
    GL11.glDepthFunc(GL11.GL_LEQUAL);
        GL11.glEnableClientState(GL11.GL_COLOR_ARRAY);
        GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
        GL11.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
        GL11.glEnable(GL11.GL_TEXTURE_2D);
        GL11.glEnable(GL11.GL_ALPHA_TEST);
        GL11.glEnable( GL13.GL_MULTISAMPLE );
        GL11.glEnable( GL13.GL_SAMPLE_ALPHA_TO_COVERAGE );
        GL11.glAlphaFunc(GL11.GL_GREATER, (float) 0.01);
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
        GL11.glTexParameterf( GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
        GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
        GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);

Ответы [ 3 ]

2 голосов
/ 09 октября 2011
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glPushMatrix();
GL11.glLoadIdentity();

Вы сбрасываете матрицу вида модели на идентичность, поэтому любые преобразования вида (выравнивание / позиционирование "камеры") отменяются. Технически вы рисуете в режиме «по умолчанию» и должны использовать перспективную проекцию, возможно, за пределами объема просмотра.

1 голос
/ 10 октября 2011

Я решил это сам, неправильно вычислял координаты, но потребовалось некоторое время, чтобы понять это, поскольку в основном это выглядело хорошо.

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

0 голосов
/ 09 октября 2011

Вы включаете текстурирование, но не даете вершинам никаких текстурных координат. Вы также не даете им нормалей, поэтому я надеюсь, что вы не включите освещение.

Исходя из ваших утверждений об инициализаторах («некоторые из которых я отключил перед запуском выше, а некоторые из которых я пропустил»), вы действительно должны опубликовать состояние, в котором находится GL при рендеринге этого куба, или перед отправкой проверки это сам. Возможно, вы даже сами обнаружите ошибку, когда выясните все изменения состояния, которые делает ваш двигатель.

В общем, вам лучше отказаться от явного кода инициализации и всегда устанавливать все необходимые состояния непосредственно перед рендерингом, поскольку это предотвращает такие странные вещи, когда вы не знаете, в каком состоянии находится GL на самом деле. Всегда помните, OpenGL - это конечный автомат.

...