Модель освещения Ламберта в шейдерах для LWJGL2? - код переноса
В настоящее время я работаю над опробованием физических методов рендеринга с LWJGL2, и с помощью учебного пособия, которое я нашел здесь, я решил поработать над штриховкой Ламберта или над разделом Освещение. Хотя я изучал другие учебные пособия по GLSL и делал подобные вещи, я изо всех сил пытаюсь заставить работать простой код шейдера Lambert. Я не уверен, сколько лет этому учебнику, как он не говорит.
Начиная с GLSL 130+, вместо атрибута используются переменные. GLSL 330+ включает в себя другие функции, такие как классификатор макетов и изменяет texture2D на текстуру.
Учебник выше использует атрибуты и часто меняется, но использует #version 330?. В любом случае, предполагается, что это простой вершинный и фрагментный шейдер, использующий версию #330 для создания Ламберта. Я хочу перенести код из учебника для использования в LWJGL2, но я не уверен, как заставить его работать. Я надеюсь, что кто-то будет достаточно щедрым, чтобы помочь пройти этот грубый патч.
Мой простой вершинный шейдер, основанный на руководствах thinmatrix, был изменен для работы с версией 330:
#version 330
uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
layout(location = 0) in vec3 position;
layout(location = 1) in vec2 textureCoordinates;
out vec3 colour;
out vec2 pass_textureCoordinates;
void main() {
gl_Position = projectionMatrix * viewMatrix * transformationMatrix * vec4(position,1.0);
pass_textureCoordinates = textureCoordinates;
}
Мой фрагмент шейдера:
#version 330
uniform sampler2D modelTexture;
in vec3 colour;
in vec2 pass_textureCoordinates;
//use your own output instead of gl_FragColor
out vec4 out_Color;
void main() {
out_Color = texture(modelTexture,pass_textureCoordinates);
}
Вершинный шейдер из учебника:
#version 330 compatibility
attribute vec3 aVertexTangent;
varying vec3 vvLocalSurfaceNormal ;
varying vec3 vvLocalSurfaceToLightDirection;
void main()
{
vec3 vLightModelPosition = (gl_ModelViewMatrixInverse * gl_LightSource[0].position).xyz;
vvLocalSurfaceToLightDirection = normalize(vLightModelPosition – gl_Vertex.xyz);
vvLocalSurfaceNormal = normalize(gl_Normal);
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
Фрагмент шейдера из учебника:
#version 330 compatibility
varying vec3 vvLocalSurfaceNormal;
varying vec3 vvLocalSurfaceToLightDirection;
void main()
{
vec3 vNormalisedLocalSurfaceNormal = normalize(vvLocalSurfaceNormal);
vec3 vNormalisedLocalSurfaceToLightDirection = normalize(vvLocalSurfaceToLightDirection);
float fLightIntensity = max(dot(vNormalisedLocalSurfaceToLightDirection, vNormalisedLocalSurfaceNormal), 0.0);
vec3 rgbFragment = vec3(1.0);
rgbFragment *= fLightIntensity;
gl_FragColor.rgb = rgbFragment;
gl_FragColor.a = 1.0 ; // TODO : Worry about materials which allow transparency!
}
Многие из этих функций не работают в сочетании с LWJGL2.
gl_ModelViewMatrixInverse
Я заметил, что эта функция устарела.
Я стесняюсь двух лет пытаться следовать учебным пособиям по GLSL, но есть некоторые вещи, которые я просто пока не понимаю. Было бы очень признательно, если бы кто-то научил меня таким вещам.