2015-11-20 3 views
1

Я, очевидно, OpenGL poseur.OpenGL ES 2.0 Android отображает вершины модели одного цвета?

Моя цель - создать пользовательский элемент управления Android GLSurfaceView с помощью GLES20, который может загрузить файл ресурсов STL (https://en.wikipedia.org/wiki/STL_(file_format)) и отобразить его в одном определенном цвете с фиксированным освещением. Сама модель будет вращаться; освещение и цвет будут исправлены.

Звучит просто, но я не могу найти способ применить то, что я узнал из множества простых примеров треугольника/куба с отдельным цветом на каждом лице, до модели с 35 тыс. Лиц (не так, чтобы число лиц было действительно вопросы).

Я заимствованное это довольно приличный код [который загружает файлы ASCII STL] ...
https://bitbucket.org/saschawillems/opengl-es/src/ed3b324dda4b/stlviewer/?at=master
... и изменил его для запуска в Android Studio и загружать бинарные файлы STL:
https://bitbucket.org/swooby/opengl-es/src/8bf43e1583c2/stlviewer/?at=binary

шейдер код Отображатель просто вычисляет цвет с помощью нормалей граней, что приводит милый эффект радуги с иллюзией освещаться:
https://bitbucket.org/swooby/opengl-es/src/8bf43e1583c238f4397bc469b13cd60dcb34674b/stlviewer/app/src/main/java/de/saschawillems/stlviewer/GLES20Renderer.java?at=binary&fileviewer=file-view-default#GLES20Renderer.java-166
я беру это в виду, однако, что нет реального фактического освещения не происходит здесь ,

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

Я искал по всему Гуглу примеры того, что я хочу делать; Я бы подумал, что это будет и легко найти, но я не смог его найти. Я просто ищу простой классический пример «Чайник», где можно определить цвет. Любой, кто хочет показать мне, как я могу просто прописать это, или где я могу найти простой пример того, что я пытаюсь сделать?

Спасибо!

Pv

ответ

0

В настоящее время вы установите цвет, чтобы быть не преобразованный вектор нормали твои. Таким образом, вы визуализируете нормальные компоненты, которые имеют каждый фрагмент.

Чтобы включить некоторое базовое освещение, сначала вам нужно выбрать, где вы хотите, чтобы ваш свет был основан. Я бы предложил положительную ось Z.

Затем определите цвет через форму или константу в шейдере.

vec3 color = vec3(1.0,0.0,0.5); 

Теперь, так как вы выбрали Z-оси, вы можете изменить цветовые компоненты, умножая их с нормальным г компонента:

vColor = vec4(color * aNormal[2], 1.0); 

Большая часть объекта будет черным, так как нормальные компоненты идут от От -1,0 до 1,0 и цвета только от 0,0 до 1.0, чтобы преодолеть это, вы можете обмануть немного:

vColor = vec4(color * ((1.0 + aNormal[2])/2.0), 1.0); 

Теперь вы обратите внимание на свет, кажется, приклеены к оси г модели, а не к миру. Это связано с тем, что вы вращаете модель, но не в нормальном режиме. Самый простой способ исправить это - применить свою матрицу вращения к нормальному (вам необходимо передать ее как равномерную), прежде чем использовать ее на цветовой составляющей.

uniform mat4 uRotMatrix; 
... 
vec4 rotatedNormal=uRotMatrix * vec4(aNormal,1.0); 
vColor = vec4(color * ((1.0 + rotatedNormal[2])/2.0), 1.0); 

Это дает вам направленный свет, поступающий с положительной оси Z.

Если вы хотите иметь настраиваемое положение для освещения, добавить дополнительные источники света или добавить зеркальное освещение, я предлагаю вам прочитать, например, это tutorial. Количество математики немного увеличивается, но оно довольно простое.

Удачи!

+0

Спасибо @mikkokoo! Я попробую. В то же время мне повезло с использованием библиотеки Rajawali3d, и я планировал перепроектировать простейший исходный код OpenGLES2, который я могу сделать, чтобы отобразить освещенный объект и ответить на мой вопрос здесь. Мне показалось странным, что я не могу легко найти простой пример вроде этого уже существующего. – swooby

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