GLSL геометричен шейдър: итерация върху цялата мрежа

Целта ми беше да оцветя върховете според реда им

РЕДАКТИРАНЕ: дългосрочна цел: достъп до предходни и следващи върхове за симулиране на поведението на гравитацията

използвах следния код

#version 120
#extension GL_EXT_geometry_shader4 : enable
void main( void ) {
    for( int i = 0 ; i < gl_VerticesIn ; i++ ) {
        gl_FrontColor = vec4(float(i)/float(gl_VerticesIn),0.0,0.0,1.0);
        gl_Position = gl_PositionIn[i];
        EmitVertex();
    }
}

но всички върхове са начертани черни, изглежда, че i винаги се оценява като 0, пропускам ли нещо или го правя погрешно?

РЕДАКТИРАНЕ: разбрах мета-проблема: как да захраня цялата си геометрия на модела в едно извикване на геометричен шейдър, така че основният цикъл да повтори всички върхове, а не за всеки триъгълник.


person Valerij    schedule 04.09.2011    source източник
comment
Сигурни ли сте, че сте конфигурирали геометричния шейдър да приема триъгълници (или каквото очаквате, освен точки). Единственият случай, когато gl_VerticesIn трябва да бъде 1, е когато сте конфигурирали геометричния шейдър да приема точки като вход.   -  person Christian Rau    schedule 05.09.2011
comment

Те еквивалентни ли са под OSX на xargs -r под Linux? Опитвам се да намеря начин да прекъсна канал, ако няма данни.

Представете си например, че правите следното:

touch test
cat test | xargs -r echo "content: "

Това не дава никакъв резултат, защото xargs прекъсва канала.

Има ли някаква опция за скрити xargs или нещо друго за постигане на същия резултат под OSX?

  -  person Valerij    schedule 05.09.2011


Отговори (1)


Не позволявате на едно извикване на геометричен шейдър да обхожда всички ваши върхове, то се извиква за всеки оригинален примитив (точка, линия, триъгълник, ...).

Решението е много по-лесно: В върховия шейдър (който всъщност се извиква за всеки връх) можете да прочетете специалната променлива gl_VertexID, който съдържа индекса на върха. Този индекс е или само брояч, увеличен за всеки връх (ако се използва glDrawArrays) и се нулира от всяко извикване на теглене, или индексът от индексния масив (ако се използва glDrawElements).

РЕДАКТИРАНЕ: Относно дългосрочната цел. Не директно, но можете да използвате буфер за текстури за това. Това основно ви позволява да получите директен достъп до линеен масив до буферен обект (във вашия случай буферът на върха), който след това можете просто да индексирате с този индекс на върха. Но може да има и други начини да се постигне това, което може да е достатъчно за друг въпрос.

person Christian Rau    schedule 05.09.2011
comment
и е възможно (и кога как) достъп до друг връх чрез този индекс? (виж дългосрочна цел) - person Valerij; 05.09.2011
comment
всъщност мислех за 1d текстура за това. всъщност е смешно да прехвърлиш един връх и текстура към тръбопровод и да получиш рендиране на цяла слънчева система :) - person Valerij; 05.09.2011