Как атрибуты передаются в вершинный шейдер в GLSL?

0

Я хочу передать одиночную переменную типа float или unsigned int в вершинный шейдер, но вы можете передавать vec или struct только как переменную атрибута. Итак, я использовал переменную атрибута типа vec2 и позже использовал ее для доступа к контенту.

glBindAttribLocation(program, 0, "Bid");    
glEnableVertexAttribArray(0);    
glVertexAttribIPointer(0, 1, GL_UNSIGNED_INT, sizeof(strideStructure), (const GLvoid*)0);    

Вершинный шейдер содержит этот код:

attribute ivec2 Bid;    
void main()    
{    
int x = Bid.x;    
int y = Bid.y;    
}    

Итак, когда я передаю значение каждый раз, не получает ли значение значение в x- компоненте vec2 Bid? Во втором запуске цикла будут переданы переданные данные в компоненте x- с различным атрибутом вектора? Кроме того, если я, например, изменяю параметр размера на 2, каков будет порядок, в котором данные хранятся в векторном атрибуте?

  • 0
    Почему бы вам не попробовать и посмотреть?
  • 0
    все еще использую старый opengl = (
Теги:
glsl
vertex-shader

1 ответ

2
Лучший ответ

Вы можете использовать скалярные типы для атрибутов. Из спецификации GLSL 1,50 (что соответствует OpenGL 3.2):

Входы вершинного шейдера могут быть только float, векторы с плавающей запятой, матрицы, целые числа без знака и целые векторы. Входы вершинного шейдера также могут формировать массивы этих типов, но не структуры.

Независимо от того, используете ли вы векторные или скалярные значения, типы должны совпадать. В вашем примере вы указываете GL_UNSIGNED_INT как тип атрибута, но тип шейдера - это ivec2, который является знаковым значением. Это должно быть uvec2 для соответствия указанному типу атрибута.

Да, если вы объявляете тип в шейдере как uvec2 Bid, но передаете только одно значение, это значение будет в Bid.x Bid.y будет 0. Если вы передадите два значения на вершину, первая будет в Bid.x, а вторая в Bid.y

Вы немного неясны о том, как вызываются вершинные шейдеры, особенно когда вы говорите о "запуске цикла". Здесь нет циклы. Вершинный шейдер вызывается один раз для каждой вершины, а соответствующие значения атрибута для этой конкретной вершины будут переданы в переменных атрибута. Они будут в тех же переменных атрибута и в том же месте внутри этих переменных для каждой вершины.

Я предполагаю, что вы можете представить "цикл" в смысле вершинного шейдера, который вызывается для каждой вершины. В действительности, много обработки на GPU будет происходить параллельно. Это означает, что вершинный шейдер для кучи вершин будет вызываться одновременно. Каждый из них имеет свои собственные экземпляры переменных, поэтому они не будут попадать друг в друга, а атрибуты для каждого будут переданы точно так же.

Дополнительная заметка о коде. Вы должны быть осторожны с этим вызовом:

glBindAttribLocation(program, 0, "Bid");

Перед связыванием шейдерной программы необходимо glBindAttribLocation(). В противном случае это не будет иметь никакого эффекта.

  • 0
    Большое спасибо, и я действительно это имею в виду. Кроме того, что касается glBindAttribLocation, я делал все неправильно. Спасибо, что тоже это заметил.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню