Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Выделить треугольники из obj модели

Выделить треугольники из obj модели

gibkinНовичокwww15 апр. 20180:48#0
Здравствуйте, на сцене находится модель из OBJ файла. Необходимо с помощью мыши выделять(так же как выделение папок и файлов) треугольники из модели(закрашивать в любой цвет), попавшие во внутрь фрустума. Я нашел компоненты a b c d всех 6 плоскостей фрустума.  Далее я беру точку и меряю расстоянию до каждой из 6 плоскостей фрустума. Если расстояние отрицательное, значит точка не находится внутри фрустума. Ниже шейдеры в них скорее всего и ошибка: 

В вершинный шейдер передаю

 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;
}
-=MASTER=-Забаненwww15 апр. 20187:40#1
gibkin
> Я нашел компоненты a b c d всех 6 плоскостей фрустума.
wat? Ж-)
Просто берёшь и чекаешь пересечение луча из под мышки (ну там правильно сделай unproject) со всеми треугольниками в геом шейдере, делов то...
http://www.ray-tracing.ru/articles213.html
просто в яндексе забей "пересечение луча с треугольником" и будет много всего интересного
Если тебе нужна всего дна проверка - просто её делаешь в геом шейдере, если нужно много проверок - строишь BVH дерево как все :-)

Правка: 15 апр. 2018 7:44

bykabakПостоялецwww15 апр. 20188:42#2
Эта техника позволяет это делать ( CPU реализация ) Можно переделать эту технику на GPU.

Я у себя делал - работает. Выделяется именно примитив целиком, а дальше делайте с ним что хотите.

Правка: 15 апр. 2018 8:45

lookidПостоялецwww15 апр. 201813:50#3

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр