DirectX11/OpenGL рендерит только половину текстуры

введите здесь описание изображения

Вот как это должно выглядеть. Он использует те же координаты vertices/uv, которые используются для DX11 и OpenGL. Эта сцена была визуализирована в DirectX10.

введите здесь описание изображения

Вот как это выглядит в DirectX11 и OpenGL.

Я не знаю, как это может произойти. Я использую и для DX10, и для DX11 один и тот же код сверху, а также они оба работают очень похоже. У вас есть идея, в чем может быть проблема и как ее исправить? Могу выслать код, если нужно.

введите здесь описание изображениятакже с использованием другой текстуры.

введите здесь описание изображенияизменил прозрачную часть текстуры на красную.

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

    #version 330 core

in vec2 UV;
in vec3 Color;
uniform sampler2D Diffuse;


void main()
{

    //color = texture2D( Diffuse, UV ).rgb;
    gl_FragColor = texture2D( Diffuse, UV );
    //gl_FragColor = vec4(Color,1);
}

Вершинный шейдер GLSL

    #version 330 core

 layout(location = 0) in vec3 vertexPosition;
 layout(location = 1) in vec2 vertexUV;
 layout(location = 2) in vec3 vertexColor;
 layout(location = 3) in vec3 vertexNormal;

uniform mat4 Projection;
uniform mat4 View;
uniform mat4 World;

out vec2 UV;
out vec3 Color;

void main()
{

    mat4 MVP = Projection * View * World;
    gl_Position = MVP * vec4(vertexPosition,1);

    UV = vertexUV;

    Color = vertexColor;

}

person PuRe    schedule 21.12.2014    source источник
comment
На будущее: при написании базового шейдера GLSL 3.30 не используйте gl_FragColor или texture2D (...); они устарели. Многие компиляторы GLSL позволят вам продолжать их использовать, но это не обязательно. Вы должны использовать определяемый пользователем вывод фрагмента (например, out vec4 frag_color) и texture (...) (это перегруженная функция, которая принимает все типы семплеров, начиная с GLSL 1.30).   -  person Andon M. Coleman    schedule 21.12.2014


Ответы (4)


Короче говоря, похоже, что вы используете отсечение задней грани (что хорошо), а другая сторона вашей модели неправильно намотана. Вы можете убедиться, что проблема именно в этом, отключив отбраковку граней сзади (OpenGL: glDisable(GL_CULL_FACE​)).

Настоящая коррекция (если проблема была именно в этом) заключается в том, чтобы иметь правильную намотку граней, обычно против часовой стрелки. Это зависит от того, где вы получите эту модель. Если вы генерируете его самостоятельно, исправьте намотку в процедуре генерации модели. Обычно файлы моделей, созданные программным обеспечением для 3D-моделирования, имеют правильную намотку лица.

person MaKo    schedule 21.12.2014
comment
хм, не поворачивая назад, отбрасывая лицо или меняя порядок намотки, ничего не меняется. gl_cull_face отключен (только что протестировал его, включив, и в результате получился похожий, но другой результат) - person PuRe; 21.12.2014
comment
Это тоже было моим предположением, но если бы это была проблема отбраковки задней части лица, вы бы увидели другую половину птицы, когда она вращалась. Похоже, что нарисована только половина птицы, но нарисована правильно. - person user1118321; 21.12.2014

Это всего лишь предположение, но указываете ли вы системе правильное количество полигонов для рисования? Такие вызовы, как glBufferData(), принимают размер данных в байтах, а не количество вершин или полигонов. (Может быть, надо было назвать параметр numBytes вместо size?) Кроме того, размер должен содержать размер всех данных. Если у вас есть цвет, нормали, координаты текстуры и вершины, все они перемежаются, он должен включать размер всего этого.

Это еще более запутанно тем фактом, что glDrawElements() и другие вещи принимают количество вершин в качестве аргумента размера. Аргумент называется count, но не очевидно, что это количество вершин, а не количество полигонов.

person user1118321    schedule 21.12.2014
comment
хорошо они отображаются. Я добавил еще одну картинку, используя другую текстуру. Эта черная сторона не отображается должным образом. Я также изменил прозрачную часть текстуры на красную, вы можете увидеть результат выше. - person PuRe; 21.12.2014

Я нашел ошибку.

Причина в том, что я забыл установить для Texture SamplerState значение Wrap/Repeat. Он был установлен на зажим, поэтому координаты uv были максимальными до 1.

person PuRe    schedule 09.01.2015

Несколько вещей, которые вы могли бы попробовать:

  1. Включен ли тест глубины? Кажется, что ваши внутренние грани полигонов с «другой» стороны визуализируются поверх полигонов, которые находятся ближе к точке обзора. Это может произойти, если проверка глубины отключена. Включите его на всякий случай.

  2. Подсветка включена? Если это так, выключите его. На вращающемся изображении появляются белые вспышки. Возможно, из-за неправильных нормалей...

ХТН

person shekhar    schedule 21.12.2014
comment
тест глубины включен, а освещение нет. Этих белых вспышек нет в сцене, это из-за гифки. - person PuRe; 21.12.2014
comment
в порядке. похоже (из более новых изображений, которые вы разместили), что нормали отключены. Не могли бы вы вставить код? - person shekhar; 21.12.2014
comment
У меня есть нормали, но я пока их нигде не использую, потому что я не собираюсь использовать молнию. - person PuRe; 21.12.2014