Проблема в шейдере при отрисовки

204
16 апреля 2018, 01:16

Продолжение к моей прошлой работе. Я продвинулся дальше. Я разобрался как определить находится ли точка внутри фрустума или нет. Сделал это так: просто вычислял расстояние до каждой из 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;
}

READ ALSO
Как преобразовать объект к обобщению?

Как преобразовать объект к обобщению?

Не знаю правильно ли поставлен вопрос, но по коду будет видно в чём его сутьЕсть класс, использующий обобщение

169
Java 10, IntellIJ не могу установить 10 programming language level

Java 10, IntellIJ не могу установить 10 programming language level

Привет! Появилась у меня проблема с jdk 10 (183)

196
Обновление поля timestamp в классе SoftReference

Обновление поля timestamp в классе SoftReference

В исходном коде класса SoftReference есть такое поле:

158