2016-04-27 3 views
1

Я делаю некоторые вещи OpenGL в Java (lwjgl) для проекта, часть которого включает в себя импорт 3d моделей в формате OBJ. Все выглядит ok, пока я не попытаюсь вытеснить вершины, тогда модели разбиваются, вы можете видеть их сквозь них. Вот Сюзанна из блендера, УФ нанесена на карту с полностью черной текстурой (для видимости). В осколочной шейдера я добавляю немного белого цвета с фрагментом в зависимости от угла фрагментов между его нормальным и вектором вверх в мире:Ячейка смещения вершины смещения

enter image description here

До сих пор так хорошо. Но когда я применяю небольшое смещение Y-компонента к тем же вершинам, я ожидаю увидеть растяжение лиц. Вместо этого происходит:

enter image description here

Vertex шейдеров:

#version 150 

in vec3 position; 
in vec2 texCoords; 
in vec3 normal; 

void main() 
{ 
    vertPosModel = position;       

    cosTheta = dot(vec3(0.0, 1.0, 0.0), normal);  

    if(cosTheta > 0.0 && cosTheta < 1.0)  
     vertPosModel += vec3(0.0, 0.15, 0.0); 

    gl_Position = transform * vec4(vertPosModel, 1.0); 
} 

Фрагмент шейдеры:

#version 150 

uniform sampler2D objTexture; 
in vec2 texcoordOut; 
in float cosTheta; 
out vec4 fragColor; 

void main() 
{ 
    fragColor = vec4(texture(objTexture, texcoordOut.st).rgb, 1.0) + vec4(cosTheta); 

} 
+1

Пожалуйста, прежде чем просто пропустить вниз, расскажите, как я могу улучшить свой вопрос. Не будь трусом. – peanutops

ответ

2

Таким образом, ваш алгоритм смещает положение некоторой вершины, основанный на свойстве полученных из вершины-х нормальный. Это приведет к появлению подключенной сетки, если ваша сетка полностью гладкая. То есть, когда встречаются два треугольника, нормали общих вершин должны быть одинаковыми с обеих сторон треугольника.

Если модель имеет прерывистые нормали по поверхности, тогда разрывы могут появляться в любом месте, где нормальная остановка перестает быть непрерывной. То есть края, где есть нормальный разрыв, могут быть отключены.

Я уверен, что Blender3D может генерировать плавную версию Suzanne. Итак ... вы создали гладкую сетку? Или это грань?

+0

Да, если вы имеете в виду левую панель инструментов в Blender, где вы можете выбрать «Гладкое или плоское» затенение. Я пробовал и то, и другое, но если он меняет только нормали, я не вижу, как это может исправить проблему, потому что в настоящее время я не использую нормали для любых вычислений освещения (это в моем списке задач). – peanutops

+0

@peanutops: Как я уже сказал, вы используете нормали для расчетов * позиции *. Если нормали плохо связаны, то * вычисленные по ним * позиции * также не будут связаны. –

+0

Я предполагаю, что мне нужно переписать мой импортер .obj, чтобы общие вершины имели нормали их лиц, объединенные в общие нормали вершин. Вчера я сделал что-то похожее - вместо этого экспортировался из блендера вместо .x3d (список нормалей экспортируется «на вершину» не на лицо), хотя после прочтения этого в vbo половина моих лиц отсутствовала, вздохнув. – peanutops

Смежные вопросы