Продолжение к моей прошлой работе. Я продвинулся дальше. Я разобрался как определить находится ли точка внутри фрустума или нет. Сделал это так: просто вычислял расстояние до каждой из 6 плоскостей, если оно окажется отрицательным, то точка лежит не внутри фрустума. Реализовал это все во фрагментном шейдере.
Ниже реализация этого шейдера. В него передаю 6 квадратных матрицы размера 3 A B C D E F - каждая из них содержит 3 вершины плоскости. В шейдере был написан метод, который находит расстояние между точкой и плоскостью distancePointPlane
. При запуске программы он независимо выделен ли полигон или нет отрисовывает цветом. С передачей координат вершин проблем не должно быть. Проблема на уровне вычисления в шейдере. Помогите.
Ниже шейдеры в них скорее всего и ошибка: В вершинный шейдер передаю
vec4[6] planes - a b c d для 6 плоскостей.
out float[6] dis; - это расстояния, которые я передаю во фрагментный шейдер.
#version 330
layout(location = 0) in vec3 vertexPos;
layout(location = 1) in vec3 normal;
layout (location = 2) in vec2 texCoord;
out float[6] dis;
out vec3 normal_modelspace;
out vec3 vertex_modelspace;
out vec2 TexCoord;
out vec4 vertexColor;
uniform mat4 P;
uniform mat4 V;
uniform mat4 M;
uniform vec4[6] planes;
void main() {
TexCoord = texCoord;
vertex_modelspace = (M * vec4(vertexPos.xyz, 1.0)).xyz;
vertexColor = vec4(0.5f, 0.0f, 0.0f, 1.0f);
gl_Position = P * V * vec4(vertex_modelspace.xyz, 1.0);
normal_modelspace = (M * vec4(normal.xyz, 1.0)).xyz;
vec3 EyeDirection_cameraspace = vec3(0,0,0) - (V * M * vec4(vertexPos,1)).xyz;
for(int i = 0;i<6;i++){
float denom = sqrt(planes[0].x * planes[0].x + planes[0].y * planes[0].y + planes[0].z * planes[0].z);
dis[i] = float((planes[0].x * vertex_modelspace.x + planes[0].y * vertex_modelspace.y + planes[0].z * vertex_modelspace.z + planes[0].w) / denom);
}
}
Фрагментный шейдер здесь я в цикле проверяю расстояния для точки, если найдено отрицательное значение, то должно закрашиваться цветом.
#version 330 core
in vec3 normal_modelspace;
in vec3 vertex_modelspace;
in vec2 TexCoord;
in vec4 vertexColor;
in float[6] dis;
out vec4 color;
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;
int i=0;
while(i<6 && dis[i]<=0){
i++;
}
if(i==6){
color = texture(ourTexture, TexCoord);
}
else
color = vertexColor;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Не знаю правильно ли поставлен вопрос, но по коду будет видно в чём его сутьЕсть класс, использующий обобщение
Привет! Появилась у меня проблема с jdk 10 (183)
В исходном коде класса SoftReference есть такое поле: