Проблема с пониманием освещения в OpenGL

#opengl #glsl

#opengl #glsl

Вопрос:

У меня возникли некоторые проблемы с пониманием того, как работает освещение в OpenGL (особенно с пониманием предопределенных переменных. есть ли где-нибудь их список?). Я копался в своем файле вершинных шейдеров, чтобы затенить свой профиль. Итак, мне удалось затенить его, но я не знаю, что я сделал. Вот код:

Вершинный шейдер:

 #version 330
precision highp float;

in vec3 in_Position; //declare position
in vec3 in_Color; //color passed from the cpp file

//mycode
in vec3 in_Normal;

// mvpmatrix is the result of multiplying the model, view, and projection matrices */
uniform mat4 MVP_matrix;

vec3 ambient;

out vec3 ex_Color;

void main(void) {

// Multiply the MVP_ matrix by the vertex to obtain our final vertex position (mvp was created in *.cpp)

gl_Position = MVP_matrix * vec4(in_Position, 1.0);

//mycode
ambient = vec3(0.0f,0.1f,1.0f); // just a test vector

ambient = ambient * in_Position ; // HERE IS WHAT I DONT GET!

ex_Color = ambient;

}
  

Я умножаю каждую точку на сфере на матрицу MVP, а затем на переменную окружения.

Фрагмент шейдера:

 #version 330
precision highp float;

in vec3 ex_Color;
out vec4 gl_FragColor;

void main(void) {

gl_FragColor = vec4(ex_Color,1.0);

}
  

Что означает «точность с плавающей точкой»? Я знаю, что файл vertex передает цвет шейдеру фрагмента, а затем этот фрагмент «интерполируется». Хорошо, как работает интерполяция? Как Opengl узнает, где остановить интерполяцию?

Комментарии:

1. «есть ли где-нибудь их список» Да. Спецификация OpenGL. Действительно, вам нужно перестать задавать эти вопросы по частям и просто посмотреть хороший учебник уже . Такого рода вопросы никому не приносят пользы. По сути, вы спрашиваете: «Как работает вся эта часть OpenGL?»

2. @NicolBolas Я в курсе руководств, у меня просто нет времени, и большинство из них используют пользовательские библиотеки. ТАК вот почему я спросил об этом.

3. @TrtTrt: Вы не хотите тратить время на правильное обучение, поэтому вместо этого просите нас написать для вас учебные пособия. Я не уверен, что понимаю вашу логику. И что плохого в использовании «пользовательских библиотек»? Или вы верите, что получаете что-то, изобретая велосипед? Изучение чего-то столь сложного, как графическое программирование, требует умения переходить прямо к актуальной проблеме. И это означает использование библиотек для работы с вещами, которые не имеют значения .

4. @NicolBolas: Этот аргумент «У меня нет времени» и множество вопросов, задаваемых Trt Trt, ужасно напоминают мне полет Skybuck в группе новостей comp.graphics.api.opengl goo.gl/UTDik

Ответ №1:

 ambient = ambient * in_Position ; // HERE IS WHAT I DONT GET!
  

Это делает нас двоих. Я понятия не имею, чего вы намерены достичь с помощью этого. Это, безусловно, приведет к появлению цвета. Но это не будет иметь никакого реального смысла. Это, конечно, не квалифицируется как «освещение».

Что означает «точность с плавающей точкой»?

Ничего. Не в настольном OpenGL. Я действительно понятия не имею, зачем кто-то это туда вставил; precision highp материал предназначен для совместимости с GL ES, но шейдеры версии 3.30 принципиально несовместимы с GL ES 2.0, поскольку ES 2.0 не использует in/out квалификаторы, а desktop GLSL 3.30 использует.

Хорошо, как работает интерполяция?

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

Как Opengl узнает, где остановить интерполяцию?

Край вашего треугольника.