Хотелось бы знать, если кто-то испытал это и знает причину. Я получаю эти странные артефакты после использования «текстурных массивов»
http://i.imgur.com/ZfLYmQB.png
(Мой графический процессор — AMD R9 270)
Frag:
#version 330 core
layout (location = 0) out vec4 color;
uniform vec4 colour;
uniform vec2 light;
in DATA{
vec4 position;
vec2 uv;
float tid;
vec4 color;
}fs_in;
uniform sampler2D textures[32];
void main()
{
float intensity = 1.0 / length(fs_in.position.xy - light);
vec4 texColor = fs_in.color;
if(fs_in.tid > 0.0){
int tid = int(fs_in.tid - 0.5);
texColor = texture(textures[tid], fs_in.uv);
}
color = texColor; // * intensity;
}
Редактирование: репозитории github (извините, если в нем отсутствуют некоторые библиотеки, возникли проблемы с привязкой их к github) https://github.com/PedDavid/NubDevEngineCpp
Редактировать: Кредиты для derhass для указания я делал что-то с неопределенными результатами (доступ к массиву без константы ([tid])). У меня это сейчас работает с
switch(tid){
case 0: textureColor = texture(textures[0], fs_in.uv); break;
...
case 31: textureColor = texture(textures[31], fs_in.uv); break;
}
Не самая красивая, но пока хорошая!
Я получаю эти странные артефакты после использования «текстурных массивов»
Вы не используете «текстурные массивы». Ты используешь массивы текстурных сэмплеров. Из вашего фрагмента шейдера:
#version 330 core // ... in DATA{ // ... float tid; }fs_in; //... if(fs_in.tid > 0.0){ int tid = int(fs_in.tid - 0.5); texColor = texture(textures[tid], fs_in.uv); }
То, что вы пытаетесь сделать здесь, не разрешено согласно Спецификация GLSL 3.30 в котором говорится
Сэмплеры агрегируются в массивы внутри шейдера (используя квадратные скобки
[]) можно индексировать только с помощью целочисленных константных выражений (см.
раздел 4.3.3 «Постоянные выражения»).
Ваш tid
не является константой, так что это не будет работать.
В GL 4 это ограничение было несколько смягчено (цитата из GLSL 4.50 spec):
При агрегировании в массивы внутри шейдера сэмплеры могут быть только
индексируется с помощью динамически равномерного интегрального выражения, в противном случае
результаты не определены.
Ваш сейчас ваш вклад также не динамически однородный либо, так что вы получите неопределенные результаты тоже.
Я не знаю, чего вы пытаетесь достичь, но, возможно, вы можете добиться этого, используя массив текстур, который будет представлять полный набор изображений как один объект текстуры GL и не будет налагать такие ограничения на доступ к ним.
Похоже, шейдер рендерит любые случайные данные, которые он найдет в памяти.
Вы пытались проверить, что glBindTexture (…) вызывается в нужное время (перед рендерингом) и что используемое значение (возвращаемое glGenTextures (…)) является действительным?