Я пытаюсь нарисовать простую сферу с нормальным отображением в фрагментном шейдере с помощью GL_POINTS. В настоящее время я просто рисую одну точку на экране и применяю фрагментный шейдер для его «сферификации».
Однако у меня возникают проблемы с правильным окрашиванием сферы (или, по крайней мере, я так думаю). Кажется, я правильно вычисляю z, но когда я применяю «нормальные» цвета к gl_FragColor
, это выглядит не совсем правильно (или это то, что можно ожидать от карты нормалей?). Я предполагаю, что есть некоторое несоответствие между gl_PointCoord и координатой фрагмента, но я не могу понять это.
Вершинный шейдер
precision mediump float;
attribute vec3 position;
void main() {
gl_PointSize = 500.0;
gl_Position = vec4(position.xyz, 1.0);
}
фрагментный шейдер
precision mediump float;
void main() {
float x = gl_PointCoord.x * 2.0 - 1.0;
float y = gl_PointCoord.y * 2.0 - 1.0;
float z = sqrt(1.0 - (pow(x, 2.0) + pow(y, 2.0)));
vec3 position = vec3(x, y, z);
float mag = dot(position.xy, position.xy);
if(mag > 1.0) discard;
vec3 normal = normalize(position);
gl_FragColor = vec4(normal, 1.0);
}
Фактическая выработка:
Ожидаемый результат: