Я продвинулся дальше. Я разобрался как определить находится ли точка внутри фрустума или нет. Сделал это так: просто вычислял расстояние до каждой из 6 плоскостей, если оно окажется отрицательным, то точка лежит не внутри фрустума. Реализовал это все во фрагментном шейдере.
Ниже реализация этого шейдера. В него передаю 6 квадратных матрицы размера 3 A B C D E F - каждая из них содержит 3 вершины плоскости. В шейдере был написан метод, который находит расстояние между точкой и плоскостью distancePointPlane. При запуске программы он независимо выделен ли полигон или нет отрисовывает цветом. С передачей координат вершин проблем не должно быть. Проблема на уровне вычисления в шейдере. Помогите.
version 330 core
in vec3 normal_modelspace;
in vec3 vertex_modelspace;
in vec2 TexCoord;
in vec4 vertexColor;
in vec3 coord;
out vec4 color;
float distancePointPlane(float pointX, float pointY, float pointZ, float a, float b, float c, float d) {
float denom = sqrt(a * a + b * b + c * c);
return float((a * pointX + b * pointY + c * pointZ + d) / denom);
}
float distancePointPlane(vec3 point,mat3 matr) {
float v1Y0Y = matr[1][1] - matr[0][1];
float v2Z0Z = matr[2][2] - matr[0][2];
float v2Y0Y = matr[2][1] - matr[0][1];
float v1Z0Z = matr[1][2] - matr[0][2];
float v2X0X = matr[2][0] - matr[0][0];
float v1X0X = matr[1][0] - matr[0][0];
float a = v1Y0Y * v2Z0Z - v2Y0Y * v1Z0Z;
float b = v1Z0Z * v2X0X - v2Z0Z * v1X0X;
float c = v1X0X * v2Y0Y - v2X0X * v1Y0Y;
float d = -(a * matr[0][0] + b * matr[0][1] + c * matr[0][2]);
float s=0.0;
return distancePointPlane(a, point[1], point[2], a, b, c, d);
}
uniform mat3 A;
uniform mat3 B;
uniform mat3 C;
uniform mat3 D;
uniform mat3 E;
uniform mat3 F;
uniform vec3 light_worldspace;
uniform sampler2D ourTexture;
void main() {
vec3 n = normalize(normal_modelspace);
vec3 l = normalize(light_worldspace - vertex_modelspace);
float cosTheta = clamp( dot( n, l), 0,1 );
float ambient = 0.05;
float aF= distancePointPlane(vertex_modelspace,A);//нахожу расстояние от вершины модели до плоскости а
float bF= distancePointPlane(vertex_modelspace,B);
float cF= distancePointPlane(vertex_modelspace,C);
float dF= distancePointPlane(vertex_modelspace,D);
float eF= distancePointPlane(vertex_modelspace,E);
float fF= distancePointPlane(vertex_modelspace,F);
if(aF>=0.0 && bF>=0.0 && cF>=0.0 && dF>=0.0 && eF>=0.0 && fF>=0.0){
color = vertexColor;
}else{
color = texture(ourTexture, TexCoord)*(cosTheta + ambient);
}
}