шейдер рассеянного освещения в OpenGL ES на Android не работает

#android #opengl-es #lighting

#Android #opengl-es #Освещение

Вопрос:

я просто провожу весь свой день, пытаясь понять, как заставить работать рассеянное освещение в 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);
}
 

это фрагментный шейдер :

 #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, 0.0f
для aColor: 1.0f, 0.0f, 0.0f, 1.0f

на случай, если это поможет, это мой VertexBuffer (шаг равен 6, а первые три поплавка предназначены для позиционирования следующих трех для нормалей) :

             -0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
             0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
             0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
             0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
            -0.5f,  0.5f, -0.5f,  0.0f,  0.0f, -1.0f,
            -0.5f, -0.5f, -0.5f,  0.0f,  0.0f, -1.0f,

            -0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
             0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
             0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
             0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
            -0.5f,  0.5f,  0.5f,  0.0f,  0.0f,  1.0f,
            -0.5f, -0.5f,  0.5f,  0.0f,  0.0f,  1.0f,

            -0.5f,  0.5f,  0.5f, -1.0f,  0.0f,  0.0f,
            -0.5f,  0.5f, -0.5f, -1.0f,  0.0f,  0.0f,
            -0.5f, -0.5f, -0.5f, -1.0f,  0.0f,  0.0f,
            -0.5f, -0.5f, -0.5f, -1.0f,  0.0f,  0.0f,
            -0.5f, -0.5f,  0.5f, -1.0f,  0.0f,  0.0f,
            -0.5f,  0.5f,  0.5f, -1.0f,  0.0f,  0.0f,

             0.5f,  0.5f,  0.5f,  1.0f,  0.0f,  0.0f,
             0.5f,  0.5f, -0.5f,  1.0f,  0.0f,  0.0f,
             0.5f, -0.5f, -0.5f,  1.0f,  0.0f,  0.0f,
             0.5f, -0.5f, -0.5f,  1.0f,  0.0f,  0.0f,
             0.5f, -0.5f,  0.5f,  1.0f,  0.0f,  0.0f,
             0.5f,  0.5f,  0.5f,  1.0f,  0.0f,  0.0f,

            -0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,
             0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,
             0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,
             0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,
            -0.5f, -0.5f,  0.5f,  0.0f, -1.0f,  0.0f,
            -0.5f, -0.5f, -0.5f,  0.0f, -1.0f,  0.0f,

            -0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,
             0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f,
             0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,
             0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,
            -0.5f,  0.5f,  0.5f,  0.0f,  1.0f,  0.0f,
            -0.5f,  0.5f, -0.5f,  0.0f,  1.0f,  0.0f
 

Ответ №1:

Я понятия не имею, почему, но я вычеркнул все, что имело какое-то отношение к u_LightPos, и теперь это работает