OpenGL ES Faces кажутся прозрачными, когда альфа равен 1,0? - PullRequest
0 голосов
/ 27 сентября 2011

Я работаю над загрузчиком объектов (OBJ File) для моего приложения на iOS, в настоящее время я успешно прочитал вершины и грани объекта, и сейчас я просто добавляю цвета в импортированные модели.

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

http://youtu.be/0L2AIFkd2Qk

Синие лица отображаются только тогда, когда две синие секции перекрываются, я не могу понять, почему - я привык к OpenGL для ПК, мне чего-то не хватает, что вызывает эту странную окраску?

Раскраска достигается путем отправки большого массива с плавающей точкой формата RGBA RGBA RGBA и т. Д. Для каждой вершины;

// colours is the name of the array of floats
glColorPointer(colorStride, GL_FLOAT, 0, colors);   
glEnableClientState(GL_COLOR_ARRAY);
glDrawArrays(renderStyle, 0, vertexCount);  

Любая помощь, которую вы можете предложить, была бы великолепна,

Большое спасибо

[РЕДАКТИРОВАТЬ]

Проблема теперь решена, я просто рисовал все треугольники из модели, вызывая

glColor4f(0.5f, 0.5f, 0.0f, 1.0f);
glDrawArrays(GL_TRIANGLES, 4, 4);

только один раз для всего массива, когда я разделил это для каждого лица в модели, это позволило мне использовать GL_DEPTH_TEST, не заставляя экран становиться пустым!

1 Ответ

1 голос
/ 27 сентября 2011

Проблема в том, что GL_DEPTH_TEST отключен. Opengl не проводит никаких глубинных тестов, поэтому все ваши объекты выглядят странно. Чтобы включить тестирование глубины, вы должны создать новый буфер рендеринга. Вот небольшой фрагмент о том, как создать этот буфер:

// Create the depth buffer. 
glGenRenderbuffersOES(1, &m_depthRenderbuffer);
glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_depthRenderbuffer); 
glRenderbufferStorageOES(GL_RENDERBUFFER_OES,
GL_DEPTH_COMPONENT16_OES, width, height);

Этот буфер создан для OpenGL ES 1.1, для 2.0 просто удалите все расширения "OES". Когда вы создали буфер глубины, вы можете включить проверку глубины следующим образом:

    glEnable(GL_DEPTH_TEST);

У меня была эта проблема несколько раз.

...