Модель освещения Ламберта в шейдерах для 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, но есть некоторые вещи, которые я просто пока не понимаю. Было бы очень признательно, если бы кто-то научил меня таким вещам.

0 ответов

Другие вопросы по тегам