c ++ / OpenGL / GLSL, текстуры со «случайным образом»; артефакты

Хотелось бы знать, если кто-то испытал это и знает причину. Я получаю эти странные артефакты после использования «текстурных массивов»

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;
}

Не самая красивая, но пока хорошая!

-1

Решение

Я получаю эти странные артефакты после использования «текстурных массивов»

Вы не используете «текстурные массивы». Ты используешь массивы текстурных сэмплеров. Из вашего фрагмента шейдера:

#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 и не будет налагать такие ограничения на доступ к ним.

2

Другие решения

Похоже, шейдер рендерит любые случайные данные, которые он найдет в памяти.
Вы пытались проверить, что glBindTexture (…) вызывается в нужное время (перед рендерингом) и что используемое значение (возвращаемое glGenTextures (…)) является действительным?

0

По вопросам рекламы [email protected]