Для обнаружения горизонтальных поверхностей на трехмерном объекте можно использовать язык затенения OpenGL или GLSL . Класс материала Qt3D * Класс 1004 * вместе с Класс Qt3D * Класс 1006 * может использоваться для реализации любого пользовательского кода GLSL. A Q & A показывает, как использовать эти классы.
Чтобы обнаружить горизонтальные поверхности на трехмерном объекте и показать их красным цветом, фрагментный шейдер для OpenGL 2.0 может быть разработан следующим образом для Qt3D пользовательского материала / эффекта:
#define FP highp
varying FP vec3 worldNormal;
void main()
{
vec3 n = normalize(worldNormal);
vec3 z = vec3(0.0, 0.0, -1.0); // Normalized already
float zDotN = dot(z, n);
if ( zDotN > 0.7 ) { // 0.7 is my threshold/criterion
vec3 oc = vec3(1.0, 0.0, 0.0); // Use red color!
gl_FragColor = vec4(oc, 1.0);
} else {
vec3 oc = vec3(0.0, 0.0, 1.0); // Use blue color!
gl_FragColor = vec4(oc, 1.0 );
}
}
В приведенном выше коде точечное произведение вектора поверхности normal
с (0.0, 0.0, -1.0)
используется для определения горизонтальности поверхности.
Для OpenGL 3.0 код GLSL будет изменен следующим образом:
#version 150 core
in vec3 worldNormal;
out vec4 fragColor;
void main()
{
vec3 n = normalize(worldNormal);
vec3 z = vec3(0.0, 0.0, -1.0); // Normalized already
float zDotN = dot(z, n);
if ( zDotN > 0.7 ) { // 0.7 is my threshold/criterion
vec3 oc = vec3(1.0, 0.0, 0.0); // Use red color!
fragColor = vec4( oc, 1.0);
} else {
vec3 oc = vec3(0.0, 0.0, 1.0); // Use blue color!
fragColor = vec4( oc, 1.0 );
}
}