Я пытаюсь понять, как работает кодирование в openGL. Я нашел этот код в Интернете, и я хочу четко его понять.Объяснение принципа работы openGL
Для моих вершинных шейдеров у меня есть:
Vertex
uniform vec3 fvLightPosition;
varying vec2 Texcoord;
varying vec2 Texcoordcut;
varying vec3 ViewDirection;
varying vec3 LightDirection;
uniform mat4 extra;
attribute vec3 rm_Binormal;
attribute vec3 rm_Tangent;
uniform float fSinTime0_X;
uniform float fCosTime0_X;
void main(void)
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex * extra;
Texcoord = gl_MultiTexCoord0.xy;
Texcoordcut = gl_MultiTexCoord0.xy;
vec4 fvObjectPosition = gl_ModelViewMatrix * gl_Vertex;
vec3 rotationLight = vec3(fCosTime0_X,0, fSinTime0_X);
ViewDirection = - fvObjectPosition.xyz;
LightDirection = (-rotationLight) * (gl_NormalMatrix);
}
И для моего пиксельного шейдера, я создал белый цвет на картинке, чтобы создать в нем дырку. :
uniform vec4 fvAmbient;
uniform vec4 fvSpecular;
uniform vec4 fvDiffuse;
uniform float fSpecularPower;
uniform sampler2D baseMap;
uniform sampler2D bumpMap;
varying vec2 Texcoord;
varying vec2 Texcoordcut;
varying vec3 ViewDirection;
varying vec3 LightDirection;
void main(void)
{
vec3 fvLightDirection = normalize(LightDirection);
vec3 fvNormal = normalize((texture2D(bumpMap, Texcoord).xyz * 2.0) - 1.0);
float fNDotL = dot(fvNormal, fvLightDirection);
vec3 fvReflection = normalize(((2.0 * fvNormal) * fNDotL) - fvLightDirection);
vec3 fvViewDirection = normalize(ViewDirection);
float fRDotV = max(0.0, dot(fvReflection, fvViewDirection));
vec4 fvBaseColor = texture2D(baseMap, Texcoord);
vec4 fvTotalAmbient = fvAmbient * fvBaseColor;
vec4 fvTotalDiffuse = fvDiffuse * fNDotL * fvBaseColor;
vec4 fvTotalSpecular = fvSpecular * (pow(fRDotV, fSpecularPower));
if(fvBaseColor == vec4(1,1,1,1)){
discard;
}else{
gl_FragColor = (fvTotalDiffuse + fvTotalSpecular);
}
}
Кто-нибудь, кто может мне объяснить, что все делает? Я понимаю основную идею этого. Но не часто зачем вам это нужно, и что происходит, когда вы используете другие переменные? Что происходит, так это то, что свет вокруг чайника начинается и удаляется во времени. Как это правильно связано с переменными cosinus и sinus? Что, если я хочу, чтобы свет исходил сверху и уходил на дно чайника?
Кроме того,
Что эти строки означают?
vec4 fvObjectPosition = gl_ModelViewMatrix * gl_Vertex;
И почему здесь минус перед переменной?
ViewDirection = - fvObjectPosition.xyz;
Почему мы используем отрицательное вращение?
LightDirection = (-rotationLight) * (gl_NormalMatrix);
Почему они используют * 2.0) - 1.0 для расчета нормального вектора? Разве это невозможно с Normal = normalize (gl_NormalMatrix * gl_Normal);?
vec3 fvNormal = normalize ((texture2D (bumpMap, Texcoord) .xyz * 2.0) - 1.0);
Может быть, это только у меня, но я думаю, что ваш вопрос является слишком широким. Вы говорите нам, что понимаете основную идею, но тогда ваши дальнейшие вопросы не очень специфичны. Код - это реализация модели освещения, я угадываю Phong, вы можете увидеть, как работает модель: https://en.wikipedia.org/wiki/Phong_reflection_model Вам понадобится базовое понимание матричной и векторной математики для следовать. Как только вы поймете модель, обратите внимание, что код изменяет только входящий угол света. Возможно, вы могли бы перефразировать свои вопросы или начать с основ. –
Я обновил немного подробнее, какие вещи я не понял. –
@TimDirks добавил ответ, отредактировал ваши теги (добавил [glsl], чтобы включить подсветку синтаксиса) – Spektre