问题描述
我花了一整天的时间试图弄清楚如何在 opengl 中运行漫反射照明。出于某种原因,当我使用漫反射着色器时,我的模型也就是一个简单的立方体只是保持完全黑色。这是 VertexShader(在 gl_Position 之前忽略这些线,那些是我自己的投影算法,这里唯一重要的是 v_Position 和 v_normal,它们基本上只是所有变换后的位置和法线,例如旋转) :
#version 300 es
in vec3 aPos;
in vec3 normal;
uniform vec4 vm;
uniform vec4 aColor;
out vec3 v_Position;
out vec4 v_Color;
out vec3 v_normal;
void main()
{
vec3 lightPos = vec3(2.0f,2.0f,3.0f);
float x2 = (aPos.x * cos(vm.y) - (aPos.z) * sin(vm.y));
float z2 = ((aPos.x * sin(vm.y) + (aPos.z) * cos(vm.y))) + 7.0f;
float y2 = (aPos.y * cos(vm.z) - (z2 - 7.0f) * sin(vm.z));
float z3 = ((aPos.y * sin(vm.z) + (z2 - 7.0f) * cos(vm.z))) + 7.0f;
float nx2 = (normal.x * cos(vm.y) - (normal.z) * sin(vm.y));
float nz2 = ((normal.x * sin(vm.y) + (normal.z) * cos(vm.y))) + 7.0f;
float ny2 = (normal.y * cos(vm.z) - (nz2 - 7.0f) * sin(vm.z));
float nz3 = ((normal.y * sin(vm.z) + (nz2 - 7.0f) * cos(vm.z))) + 7.0f;
float dst = sqrt((x2 * x2) + (y2 * y2) + (z3 * z3));
gl_Position = vec4(x2 / z3 * vm.x,y2 / z3 * vm.x * vm.w,dst * 0.0001,1.0f);
v_Position = vec3(x2,y2,z3);
v_Color = aColor;
v_normal = vec3(nx2,ny2,nz3);
}
这是 FragmentShader :
#version 300 es
precision mediump float;
uniform vec3 u_LightPos;
in vec3 v_Position;
in vec4 v_Color;
in vec3 v_normal;
out vec4 FragColor;
void main()
{
float distance = length(vec3(u_LightPos) - v_Position);
vec3 lightVector = normalize(vec3(u_LightPos) - v_Position);
float diffuse = max(dot(v_normal,lightVector),0.1);
diffuse = diffuse * (1.0 / (1.0 + (0.25 * distance * distance)));
FragColor = vec4(vec3(v_Color) * (diffuse),1.0f);
}
对于 u_LightPos 我传入了 0.0f,0.0f,0.0f aColor : 1.0f,1.0f
如果有帮助,这是我的 vertexBuffer(步幅为 6,前三个浮点数用于位置,接下来三个用于法线):
-0.5f,-0.5f,-1.0f,0.5f,1.0f,0.0f
解决方法
我不知道为什么,但我已经排除了与 u_LightPos 有关的所有内容,现在它可以工作了