Войти
ПрограммированиеФорумГрафика

OpenGL Вопросы (28 стр)

Страницы: 125 26 27 28 29 30 Следующая »
#405
(Правка: 23:15) 23:12, 24 окт. 2019

Продолжаю эксперименты.
Этот тест работает, значит проблема в моём коде, а не в драйверах или железе: https://gamedev.ru/code/forum/?id=188869

Замена uvec2 на sampler2D в объявлении SSBO привела к отсутствию вылетов, но самой текстуры нет(выводится vec4(0,0,0,0)).
Хотя в примере g-truc gl-500-texture-bindless-arb сделано именно так:

/* ... */

layout(binding = MATERIAL) uniform material{
  uvec2 Diffuse;
} Material;

/* ... */

void main(){
  Color = texture(sampler2D(Material.Diffuse), In.Texcoord.st);
}

UPD: заработало!
Методом тыка, но заработало.

#406
(Правка: 4:01) 4:00, 25 окт. 2019

Джек Аллигатор
1)
> layout (std430, binding = 2) buffer ColorSSBO {
> sampler2D bindless_tex[1];
> };
убери вот это вот ColorSSBO_A
2) 

Джек Аллигатор
> frag_color = texture(sampler2D(bindless_tex[0]), tex_coord);
Если сейчас не заработает, то у тебя не правильная заливка.

#407
4:14, 25 окт. 2019

vindast, в конечном итоге оказалось, что дело всё таки в драйвере линукса. На винде заработало как часы — и приведение uvec2 к sampler2D, и массив хендлеров и тд. Возможно, повлияло добавление спецификатора readonly.
На линуксе удалось только одиночные хендлеры передать. Если же объявить их как массив, то выводится vec4(0,0,0,0). Притом, если через ssbo передавать всё что угодно кроме bindless хендлеров — работает четко.
Возможно, дело в слишком старом железе — HD7770.

Печально всё это. Годами читал форум и мечатал осилить в полной мере опенгл, заюзать наконец ssbo+bindless textures, и такой облом.
Быть может innuendo прав и нахрен не сдалось отрисовывать всё в один вызов.
#408
4:42, 25 окт. 2019

vindast
> Если сейчас не заработает, то у тебя не правильная заливка.
Давай проведем эксперимент.
Вот единственный вариант, который у меня работает на линуксе: https://yadi.sk/d/1JfBE9g_YRzUyw
Фрагментный шейдер находится в /data/shaders/ui-quad/
Отредактируй его чтобы через ssbo можно было передавать массив текстур:

uvec2 bindless_tex[];
или
sampler2D bindless_tex[];
Если не заработает у тебя — значит неправильная заливка.
Если не заработает у меня — значит дело в дровах.

#409
4:47, 25 окт. 2019

Джек Аллигатор
> vindast, в конечном итоге оказалось, что дело всё таки в драйвере линукса. На
> винде заработало как часы — и приведение uvec2 к sampler2D, и массив хендлеров
> и тд.
покажи, как ты их передаёшь. ты уверен, что учитываешь padding?

#410
(Правка: 7:14) 7:07, 25 окт. 2019

Suslik
> покажи, как ты их передаёшь. ты уверен, что учитываешь padding?
Этот вариант надо рассматривать. Смотри, хендлер на текстуру это uint64, sampler2D тоже, uvec2 не должен приводится к sempler2D (по логике).

Джек Аллигатор, нет линукса, но тот вариант что я тебе выше показывал заведомо рабочий, по крайней мере работает под винду 8 и 10, на 850м и рх480. Я именно так юзаю биндлесы.

Скопипасти этот код (заведомо рабочий) и скажи что вышло, по тому что если не работает то это кривая заливка. Кидай код ssbo от и до.

#version 450 core

#extension GL_ARB_bindless_texture : require 

layout(location = 0) out vec4 frag_color;
layout(location = 0) in vec2 tex_coord;




layout (std430, binding = 0) buffer ColorSSBO 
{ 
  sampler2D mTex[2];
};


void main(){
    
  
  frag_color = texture(mTex[0], tex_coord);
  
  // frag_color = texture(mTex[1], tex_coord);


}
#411
(Правка: 8:09) 8:08, 25 окт. 2019

vindast
> Смотри, хендлер на текстуру это uint64, sampler2D тоже, uvec2
массив uvec2 выровняется padding'ом до 128 байт (uvec4) на элемент. это не точно, но с этим std430 постоянно подобные заморочки, нужно обязательно проверять.

#412
(Правка: 8:29) 8:28, 25 окт. 2019


Suslik
> до 128 бит
Так ведет себя std140, 430 выровняет до 128 бит если есть элемент vec3 или vec4. Выравнивание произойдет по самому "большому" элементу. Сам помню об это обжогся.

#413
(Правка: 9:30) 9:27, 25 окт. 2019

Джек Аллигатор
> vindast, в конечном итоге оказалось, что дело всё таки в драйвере линукса. На
> винде заработало как часы — и приведение uvec2 к sampler2D, и массив хендлеров
> и тд. Возможно, повлияло добавление спецификатора readonly.
это не видеодрайвер линукса(что это такое вообще)
по твоим словам-это только твой конкретный видеодрайвер Радеона, их три штуки разных есть

если хочешь нормальную графику без багов, на линуксе - кроме Нвидии, ничего другого не существует.

ох вейт, ты че OpenGL4+ пытался завести на Радеоне?
ну хоть живой остался, и компьютер в сверхновую не превратился, можешь считать что повезло!

#414
(Правка: 12:25) 12:24, 25 окт. 2019

vindast
> uvec2 не должен приводится к sempler2D (по логике).

+ раз
+ два
+ три

> нет линукса, но тот вариант что я тебе выше показывал заведомо рабочий, по
> крайней мере работает под винду 8 и 10, на 850м и рх480. Я именно так юзаю
> биндлесы.
Вылетает при компиляции шейдера.

> по тому что если не работает то это кривая заливка. Кидай код ssbo от и до.
Просто собираю массив uint64 хендлов и кидаю в буфер через glBufferStorage.

Danilw
> если хочешь нормальную графику без багов, на линуксе - кроме Нвидии, ничего
> другого не существует.
Давно подумываю о переходе, но не хотелось бы потратить 20к на видюху чтобы вновь обнаружить забагованые дрова.
А кроме любительского программирования оно мне и не нужно — играю только на PS4.

#415
13:20, 25 окт. 2019

Джек Аллигатор
Ты код скопипастил?

#416
13:51, 25 окт. 2019

Джек Аллигатор
> Да. Вылетает:
Там твой старый код. Просто скопипасть шейдер что я тебе скинул.

#417
14:30, 25 окт. 2019

Джек Аллигатор, вылетать там не чему, не правильно биндишь.

#418
(Правка: 21:26) 21:24, 30 окт. 2019

vindast
> вылетать там не чему, не правильно биндишь.
Всё правильно делал, потому что на винде работает, а на линуксе — нет.

И всё таки я добился чего хотел, но не через UBO или SSBO, а через glVertexAttribDivisor.
Судя по всему, баг связан именно с компиляцией шейдера в котором есть массивы из uint64, а через divisor получается что текстуры в шейдера подаются по одной, без массивов.
А без массивов всё работает замечательно, да и больше одной текстуры на объект мне не нужно.

#419
20:34, 31 окт. 2019
Всё правильно делал, потому что на винде работает, а на линуксе — нет.

у меня противоположное наблюдение: именно линукс позволяет выявить ошибки, а винда упорно многое прощает. если я правильно помню - тут тема была про драйвера, в ней ссылка на рассказ программиста драйверов nvidia, он это явление объясняет тем, что многие ошибки программистов графики им известны и они в драйвере эту ситуацию тихо разруливают.
Страницы: 125 26 27 28 29 30 Следующая »
ПрограммированиеФорумГрафика