Текстура исчезает на osx - GL_TEXTURE_2D JOGL Eclipse java

У меня проблемы с отрисовкой текстур в Eclipse.

Когда я запускаю приложение Java и когда появляется всплывающее окно, я вижу только текстуру (красные квадраты из png.) Несколько миллисекунд, затем все становится черным.

Я получил этот код, и он отлично работает на всех моих одноклассниках, но не на моем Macbook Pro 2012. Запустите JRE 1.8.

Я изменил библиотеку jogl на те, что для Mac OSX, и при отладке я не получаю никаких ошибок. Что я вижу, так это то, что в функции drawQuad что-то не так, и если я удалю строку gl.glEnable(GL.GL_TEXTURE_2D) , все отрисуется, но без текстур, как вы понимаете, просто белым.

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

Вот класс, я думаю, где проблема:

private Texture texture;

void loadResources() throws GLException, IOException {
    if (texture == null)
        texture = TextureIO.newTexture(new File("3.png"), false);
}

void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
    GL2 gl = drawable.getGL().getGL2();
    GLU glu = new GLU();

    gl.glMatrixMode(GL_PROJECTION);
    gl.glLoadIdentity(); // reset
    glu.gluOrtho2D (0.0, w, h, 0);  // define drawing area

    gl.glMatrixMode(GL_MODELVIEW);
    gl.glLoadIdentity(); // reset

}

void drawQuad(GLAutoDrawable drawable, float x, float y, float w, float h) {
    GL2 gl = drawable.getGL().getGL2();

    gl.glEnable(GL.GL_TEXTURE_2D);
    gl.glBindTexture(GL.GL_TEXTURE0, texture.getTarget());
    gl.glBegin(GL2.GL_QUADS);
    gl.glColor3f(1, 1, 1);
    gl.glTexCoord2f(1, 1);
    gl.glVertex2f(x,      y);
    gl.glTexCoord2f(1, 1);
    gl.glVertex2f(x + w, y);
    gl.glTexCoord2f(1, 0);
    gl.glVertex2f(x + w, y + h);
    gl.glTexCoord2f(0, 0);
    gl.glVertex2f(x,      y + h);

    gl.glEnd();

}

public void clearScreen(GLAutoDrawable drawable) {
    GL2 gl = drawable.getGL().getGL2();
    gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
}

Просто оставьте сообщение, если вам нужно больше кода.


person alengqvist    schedule 05.11.2014    source источник
comment
Не пишите GLU glu = new GLU(), а используйте GLU.createGLU(GL). new GLU() следует использовать только в конкретном случае, когда вы уверены, что вам не нужна функция, реализованная только в подклассе, например GLUgl2.   -  person gouessej    schedule 07.11.2014
comment
Лучше использовать массивы вершин или объекты буфера вершин. Дайте мне знать, нужны ли вам примеры.   -  person gouessej    schedule 07.11.2014
comment
Если вы хотите написать несколько примеров, это будет действительно хорошо. Я хочу правильно изучить openGL, так что, пожалуйста :)   -  person alengqvist    schedule 09.11.2014
comment
В этом примере используется статический VBO с чередованием: svn.code. sf.net/p/tuer/code/alpha/drawer/ Вы также должны посмотреть на jogl-demos. Пример Xerxes очень хорош и полон: jogamp.org/git/?p=jogl-demos.git;a=blob;f=src/demos/es2/   -  person gouessej    schedule 09.11.2014
comment
Вы также можете посмотреть нашу вики: jogamp.org/wiki/index.php/Main_Page   -  person gouessej    schedule 09.11.2014
comment
Спасибо за ссылки! Я думаю, что его довольно трудно понять, хотя. Знаете ли вы какое-нибудь хорошее руководство или что-то еще, чтобы лучше понять openGL? Я сделал несколько поисков, но трудно найти руководство по правильному способу действий, если вы меня поймете. руководство, безусловно, отличное, но это также означает, что у вас уже должен быть достаточный опыт работы с ним.   -  person alengqvist    schedule 10.11.2014
comment
Неважно. Пропустил вики :D   -  person alengqvist    schedule 10.11.2014


Ответы (1)


Согласно здесь glBindTexture не допускается между glBegin и glEnd. Вы проверяли ошибки OpenGL? Это должно сгенерировать GL_INVALID_OPERATION.

Редактировать: Согласно тому же здесь, первый параметр glBindTexture (цель) не может быть GL.GL_TEXTURE0. Это должно было вызвать ошибку GL_INVALID_ENUM.

person BDL    schedule 05.11.2014
comment
Я забыл сказать, что пробовал разные положения строк выше. Поэтому, даже если я помещу glBindTexture за пределы начала и конца, у меня будет та же проблема. - person alengqvist; 06.11.2014
comment
Кстати: вы используете gl.glTexCoord2f(1, 1); для двух вершин. Это может исказить вашу текстуру, но, скорее всего, это не проблема, с которой вы столкнулись. - person BDL; 06.11.2014
comment
Хм, я не получаю никаких ошибок во время работы, которые я действительно должен получить, когда прочитаю ссылку, которую вы мне дали. Почему так? Или в консоли не отображаются ошибки OpenGL? - person alengqvist; 06.11.2014
comment
Они не отображаются автоматически. Вы должны проверить их с помощью glGetError. - person BDL; 06.11.2014
comment
Я получаю 1282, когда распечатываю его в консоли. Я поставил glGetError после glEnd, кстати. - person alengqvist; 06.11.2014
comment
Это числовое значение GL_INVALID_OPERATION. Ознакомьтесь с этим и что - person BDL; 06.11.2014
comment
Это правильное использование: int err; while ((err = gl.glGetError()) != GL.GL_NO_ERROR) System.out.println(err); в этом случае я все еще получаю только 1282: S - person alengqvist; 06.11.2014
comment
Вы читали эту ссылку? Особенно третий пример кода? Вы должны сами перевести коды ошибок в читаемый текст. Но я думаю, что мы все больше и больше уходим от первоначальной темы. - person BDL; 06.11.2014
comment
Спасибо за ссылки. Но очень странно, что код отлично работает на компьютерах всех моих одноклассников, но не на моем. Поэтому, если есть какие-то ошибки openGL. Почему проблема возникает только на моем Mac, а не на их ПК? Точно такой же код. Тот же форк с github. - person alengqvist; 06.11.2014