шейдер даже не компилирует и не связывает. Вершинный шейдер имеет выход 1 varying
(color
), поэтому для шейдерного фреймгера требуется ввод varying vec4 color;
.
varying vec4 color;
Когда вы устанавливаете позицию пространства клипа, координата вершины должна быть преобразована с помощью вида модели и матрицы проекции:
gl_Position = projectionMatrix * modelview * position;
Спецификации типов v
и N
отсутствуют, а типы ambient
, diffuse
и spec
являются vec4
, а не vec3
.
Вершинный шейдер:
attribute vec4 position;
attribute vec3 normal;
varying vec4 color;
uniform mat4 modelview;
uniform mat4 projectionMatrix;
uniform mat3 normalMatrix;
uniform vec4 lightPosition;
uniform vec3 lightAmbient;
uniform vec3 lightDiffuse;
uniform vec3 lightSpecular;
uniform float SpecularPower;
void main()
{
vec3 v = vec3(modelview * position);
vec3 N = normalize(normalMatrix * normal);
gl_Position = projectionMatrix * modelview * position;
vec3 L = normalize(lightPosition.xyz - v);
vec3 E = normalize(-v);
vec3 R = normalize(reflect(-L,N));
vec4 ambient = vec4(lightAmbient,100.0);
vec4 diffuse = vec4(clamp( lightDiffuse * max(dot(N,L), 0.0) , 0.0, 1.0 ) ,100.0);
vec4 spec = vec4(clamp (lightSpecular * pow(max(dot(R,E),0.0),0.3*SpecularPower) , 0.0, 1.0 ),100.0);
color = ambient + diffuse + spec;
}
Фрагментный шейдер:
varying vec4 color;
void main()
{
gl_FragColor = color;
}
Конечно, вы должны установить хотя бы источник внешнего освещения ambientLight()
. Вы также можете использовать directionalLight()
, pointLight()
или spotLight()
.
Но обратите внимание, ваш шейдер может работать только с 1 источником света , Более того, 1 источник света получит
Ошибка OpenGL 1282 в верхней части endDraw (): недопустимая операция
Если вы хотите использовать более 1 источника света, то у вас будет использовать однородные массивы в вершинном шейдере для lightPosition
, lightAmbient
, lightDiffuse
и lightSpecular
. См. Типы шейдеров в обработке (https://processing.org/tutorials/pshader/)