您如何使用 LIBGDX 在着色器中加入每像素光照?
How do you incorporate per pixel lighting in shaders with LIBGDX?
所以我目前设法使用 Xoppa 教程编写着色器并使用 AssetManager,并且我设法将纹理绑定到模型,它看起来不错。
[[1
现在,我想下一步是创建漫反射(不确定是不是这个词?phong 着色?)照明(?)来为兔子提供某种形式的阴影。虽然我对 LWJGL 中的 GLSL 着色器有一点经验,但我不确定如何处理相同的信息,因此我可以在 libGDX 和 glsl 着色器中使用它。
我知道这一切都可以使用环境 class 等来完成。但是我想通过单独的着色器或通过传统方式来完成这个挑战。
在 LWJGL 中,着色器会有制服:
in vec3 position;
in vec2 textureCoordinates;
in vec3 normal;
out vec2 pass_textureCoordinates;
out vec3 surfaceNormal;
out vec3 toLightVector;
uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform vec3 lightPosition;
这对我来说在 LWJGL 中计算起来相当容易
顶点文件:
attribute vec3 a_position;
attribute vec3 a_normal;
attribute vec2 a_texCoord0;
uniform mat4 u_worldTrans;
uniform mat4 u_projViewTrans;
varying vec2 v_texCoords;
void main() {
v_texCoords = a_texCoord0;
gl_Position = u_projViewTrans * u_worldTrans * vec4(a_position, 1.0);
}
我想象我可以实现类似于 LWGL glsl 示例的制服,但我不知道如何将这些制服应用到 libgdx 中并使其工作。我不确定 u_projViewTrans 是什么,我假设它是投影、变换和视图矩阵的组合,并使用 camera.combined?
设置制服
如果有人可以帮助我理解该过程或指出如何(每像素照明?)可以仅使用 u_projViewTrans 和 u_worldTrans 实现的示例,我将不胜感激您花费的时间和精力帮助我更好地理解这些概念。
这是我的 github 上传的我正在进行的工作。here
你可以在世界space中进行光照计算。一个简单的lambertian diffuse光可以这样计算:
vec3 toLightVector = normalize( lightPosition - vertexPosition );
float ligtIntensity = max( 0.0, dot( normal, toLightVector ));
在 Whosebug 问题 How does this faking the light work on aerotwist? 的答案中可以找到详细的解释。
而Gouraud shading calculates the light in the the vertex shader, Phong shading在片段着色器中计算光照。
(进一步查看 GLSL fixed function fragment program replacement)
Gouraud shader 可能如下所示:
顶点着色器:
attribute vec3 a_position;
attribute vec3 a_normal;
attribute vec2 a_texCoord0;
uniform mat4 u_worldTrans;
uniform mat4 u_projViewTrans;
uniform vec3 lightPosition;
varying vec2 v_texCoords;
varying float v_lightIntensity;
void main()
{
vec4 vertPos = u_worldTrans * vec4(a_position, 1.0);
vec3 normal = normalize(mat3(u_worldTrans) * a_normal);
vec3 toLightVector = normalize(lightPosition - vertPos.xyz);
v_lightIntensity = max( 0.0, dot(normal, toLightVector));
v_texCoords = a_texCoord0;
gl_Position = u_projViewTrans * vertPos;
}
片段着色器:
varying vec2 v_texCoords;
varying float v_lightIntensity;
uniform sampler2D u_texture;
void main()
{
vec4 texCol = texture( u_texture, v_texCoords.st );
gl_FragColor = vec4( texCol.rgb * v_lightIntensity, 1.0 );
}
Phong shading 可能如下所示:
顶点着色器:
attribute vec3 a_position;
attribute vec3 a_normal;
attribute vec2 a_texCoord0;
uniform mat4 u_worldTrans;
uniform mat4 u_projViewTrans;
varying vec2 v_texCoords;
varying vec3 v_vertPosWorld;
varying vec3 v_vertNVWorld;
void main()
{
vec4 vertPos = u_worldTrans * vec4(a_position, 1.0);
v_vertPosWorld = vertPos.xyz;
v_vertNVWorld = normalize(mat3(u_worldTrans) * a_normal);
v_texCoords = a_texCoord0;
gl_Position = u_projViewTrans * vertPos;
}
片段着色器:
varying vec2 v_texCoords;
varying vec3 v_vertPosWorld;
varying vec3 v_vertNVWorld;
uniform sampler2D u_texture;
struct PointLight
{
vec3 color;
vec3 position;
float intensity;
};
uniform PointLight u_pointLights[1];
void main()
{
vec3 toLightVector = normalize(u_pointLights[0].position - v_vertPosWorld.xyz);
float lightIntensity = max( 0.0, dot(v_vertNVWorld, toLightVector));
vec4 texCol = texture( u_texture, v_texCoords.st );
vec3 finalCol = texCol.rgb * lightIntensity * u_pointLights[0].color;
gl_FragColor = vec4( finalCol.rgb * lightIntensity, 1.0 );
}
所以我目前设法使用 Xoppa 教程编写着色器并使用 AssetManager,并且我设法将纹理绑定到模型,它看起来不错。
[
现在,我想下一步是创建漫反射(不确定是不是这个词?phong 着色?)照明(?)来为兔子提供某种形式的阴影。虽然我对 LWJGL 中的 GLSL 着色器有一点经验,但我不确定如何处理相同的信息,因此我可以在 libGDX 和 glsl 着色器中使用它。
我知道这一切都可以使用环境 class 等来完成。但是我想通过单独的着色器或通过传统方式来完成这个挑战。
在 LWJGL 中,着色器会有制服:
in vec3 position;
in vec2 textureCoordinates;
in vec3 normal;
out vec2 pass_textureCoordinates;
out vec3 surfaceNormal;
out vec3 toLightVector;
uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform vec3 lightPosition;
这对我来说在 LWJGL 中计算起来相当容易
顶点文件:
attribute vec3 a_position;
attribute vec3 a_normal;
attribute vec2 a_texCoord0;
uniform mat4 u_worldTrans;
uniform mat4 u_projViewTrans;
varying vec2 v_texCoords;
void main() {
v_texCoords = a_texCoord0;
gl_Position = u_projViewTrans * u_worldTrans * vec4(a_position, 1.0);
}
我想象我可以实现类似于 LWGL glsl 示例的制服,但我不知道如何将这些制服应用到 libgdx 中并使其工作。我不确定 u_projViewTrans 是什么,我假设它是投影、变换和视图矩阵的组合,并使用 camera.combined?
设置制服如果有人可以帮助我理解该过程或指出如何(每像素照明?)可以仅使用 u_projViewTrans 和 u_worldTrans 实现的示例,我将不胜感激您花费的时间和精力帮助我更好地理解这些概念。
这是我的 github 上传的我正在进行的工作。here
你可以在世界space中进行光照计算。一个简单的lambertian diffuse光可以这样计算:
vec3 toLightVector = normalize( lightPosition - vertexPosition );
float ligtIntensity = max( 0.0, dot( normal, toLightVector ));
在 Whosebug 问题 How does this faking the light work on aerotwist? 的答案中可以找到详细的解释。
而Gouraud shading calculates the light in the the vertex shader, Phong shading在片段着色器中计算光照。
(进一步查看 GLSL fixed function fragment program replacement)
Gouraud shader 可能如下所示:
顶点着色器:
attribute vec3 a_position;
attribute vec3 a_normal;
attribute vec2 a_texCoord0;
uniform mat4 u_worldTrans;
uniform mat4 u_projViewTrans;
uniform vec3 lightPosition;
varying vec2 v_texCoords;
varying float v_lightIntensity;
void main()
{
vec4 vertPos = u_worldTrans * vec4(a_position, 1.0);
vec3 normal = normalize(mat3(u_worldTrans) * a_normal);
vec3 toLightVector = normalize(lightPosition - vertPos.xyz);
v_lightIntensity = max( 0.0, dot(normal, toLightVector));
v_texCoords = a_texCoord0;
gl_Position = u_projViewTrans * vertPos;
}
片段着色器:
varying vec2 v_texCoords;
varying float v_lightIntensity;
uniform sampler2D u_texture;
void main()
{
vec4 texCol = texture( u_texture, v_texCoords.st );
gl_FragColor = vec4( texCol.rgb * v_lightIntensity, 1.0 );
}
Phong shading 可能如下所示:
顶点着色器:
attribute vec3 a_position;
attribute vec3 a_normal;
attribute vec2 a_texCoord0;
uniform mat4 u_worldTrans;
uniform mat4 u_projViewTrans;
varying vec2 v_texCoords;
varying vec3 v_vertPosWorld;
varying vec3 v_vertNVWorld;
void main()
{
vec4 vertPos = u_worldTrans * vec4(a_position, 1.0);
v_vertPosWorld = vertPos.xyz;
v_vertNVWorld = normalize(mat3(u_worldTrans) * a_normal);
v_texCoords = a_texCoord0;
gl_Position = u_projViewTrans * vertPos;
}
片段着色器:
varying vec2 v_texCoords;
varying vec3 v_vertPosWorld;
varying vec3 v_vertNVWorld;
uniform sampler2D u_texture;
struct PointLight
{
vec3 color;
vec3 position;
float intensity;
};
uniform PointLight u_pointLights[1];
void main()
{
vec3 toLightVector = normalize(u_pointLights[0].position - v_vertPosWorld.xyz);
float lightIntensity = max( 0.0, dot(v_vertNVWorld, toLightVector));
vec4 texCol = texture( u_texture, v_texCoords.st );
vec3 finalCol = texCol.rgb * lightIntensity * u_pointLights[0].color;
gl_FragColor = vec4( finalCol.rgb * lightIntensity, 1.0 );
}