我目前正在尝试使用 LWJGL2 尝试基于物理的渲染技术,并通过我在这里找到的教程的帮助,我决定研究朗伯着色或教程的照明部分。虽然我已经使用 GLSL 完成了其他教程并完成了类似的工作,但我正在努力让一个简单的 Lambert 着色器代码工作。我不确定这个教程有多老,因为它没有说。
从 GLSL 130+ 开始,使用 in 和 out 代替属性和变量。GLSL 330+ 包括其他功能,例如布局限定符并将 texture2D 更改为纹理。
上面的教程使用属性和经常变化,但使用#version 330?。无论如何,这应该是一个简单的顶点和片段着色器,使用版本#330 来创建 Lambert。我想将教程中的代码移植到 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 的教程,但有些事情我还不明白。如果有人能就这些事情对我进行教育,将不胜感激。