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

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

Страницы: 180 81 82 8385 Следующая »
#1200
14:56, 15 окт 2023

Детский сад...

#1201
19:06, 17 окт 2023

Есть текстурный объект с двумя каналами.
Можно ли как то используя технологии ядра 4.5 сделать так, чтобы было два текстурных объекта, шарящих между собой одну и ту же память, но при чтении из которых в шейдере по каналу R, я получал значения из R и G каналов соответсвенно?
Насколько я понял сэмплеры не подойдут, так как для них нельзя задавать swizzle.

#1202
19:41, 17 окт 2023

AMM1AK
Попробуй через  glTextureView сделать алиас текстуры и уже ему задать другой свизл.

#1203
21:07, 17 окт 2023

AMM1AK
для этого не нужен опенгл 4.5.
Просто передаешь юниформ целое число в шейдер и выбираешь канал:

glUniform1i(X, x);
uniform int X;

void main ()
{
  if (X == 0) color = texture(T, uv).r;
  if (X == 1) color = texture(T, uv).g;
}
#1204
0:47, 18 окт 2023

iw4nna.rock
> uniform int X;
>
> void main ()
> {
> if (X == 0) color = texture(T, uv).r;
> if (X == 1) color = texture(T, uv).g;
> }
Плохой пример. texture - градиентная выборка. Поэтому её нельзя положить под if, и компилятор вынесет её наружу. И будет 2 выборки всегда, вне зависимости от X. Очень сомневаюсь, что компилятор сможет схлопнуть это в одну выборку, и даже если какой-то и сможет, то 100% будет такой, который не сможет (т.к. копилятор glsl - это часть драйверов). Если уж делать, то как-то так:

uniform int X;

void main ()
{
  float rg = texture(T, uv).rg;
  if (X == 0) color = rg.r;
  if (X == 1) color = rg.g;
}
#1205
(Правка: 1:06) 0:58, 18 окт 2023

MrShoor
Ну а если версия GLSL позволяет, то по идее можно и так:

uniform int X;

void main()
{
  vec2 rg = texture(T, uv).rg;
  float color = rg[X];
}

0 = r = x
1 = g = y

#1206
(Правка: 3:12) 3:07, 18 окт 2023

MrShoor
> Если уж делать, то как-то так
да, так будет быстрее, особенно когда выборка большая. Только там ошибка: нужно вместо float использовать vec2.

#1207
4:04, 18 окт 2023

iw4nna.rock
Спасибо, но это костыль..  не универсально..
Через texture view должно сработать в принципе..

#1208
4:37, 18 окт 2023

AMM1AK
> Спасибо, но это костыль.. не универсально..
Всмысле не универсально? И почему через texture view - универсально?

#1209
8:27, 18 окт 2023

MrShoor
Придётся лезть в готовые шейдеры и править их. Плюс не известно, как добавление if’ов скажется на производительности.
Уже есть готовый аппаратный механизм для этого - texture swizzling. Хотелось бы заиспользовать его, дабы «освободить себя от ответсвенности»
Кстати, в другом пейпере прочитал, что на сэмплеры все таки можно навернуть swizzle. Но в текущем пайплане у меня их нет, как собственно нет и texture view. Но теоретически должны сработать оба варианта.

#1210
8:31, 18 окт 2023

MrShoor
Не так выразился немного, с просини писал. «Костыльно» в рамках готового пайплайна в проекте имелось в виду.
Так то, вариант рабочий (с юниформом в шейдере) бесспорно.

#1211
18:02, 18 окт 2023
uniform vec4 mask; // (1,0,0,0), (0,1,0,0), etc

void main ()
{
  color = dot(texture(T, uv), mask);
}
#1212
18:49, 18 окт 2023

0xc0de
> dot(texture(T, uv), mask);
dot не работает для vec4.
Нужно использовать *

#1213
19:15, 18 окт 2023

iw4nna.rock
> dot не работает для vec4.
> Нужно использовать *

Срочно в школу учить скалярное произведение векторов.

#1214
19:49, 18 окт 2023

0xc0de
> Срочно в школу учить
error C7011: implicit cast from "float" to "vec4"

Страницы: 180 81 82 8385 Следующая »
ПрограммированиеФорумГрафика