Chcę zaimplementować przeglądarkę Timeseries, która pozwala użytkownikowi na powiększanie i płynne przesuwanie.Użyj indeksu jako współrzędnej w OpenGL
Zrobiłem wcześniej tryb natychmiastowy opengl, ale teraz jest on przestarzały na rzecz VBO. Wszystkie przykłady VBO mogę znaleźć przechowywać współrzędne XYZ każdego punktu.
Podejrzewam, że muszę przechowywać wszystkie moje dane w pamięci VRAM, aby uzyskać szybkość klatek na sekundę podczas patelni, którą można nazwać "gładką", ale mam tylko dane Y (zmienną zależną). X jest niezależną zmienną, którą można obliczyć z indeksu, a Z jest stała. Jeśli mam przechowywać X i Z, to moje wymagania dotyczące pamięci (zarówno wielkość bufora, jak i transfer bloku CPU-> GPU) są potrojone. I mam dziesiątek milionów punktów danych, przez które użytkownik może przesuwać, więc użycie pamięci nie będzie banalne.
Czy jest jakaś technika do rysowania macierzy wierzchołków 1-D, gdzie indeks jest używany jako druga współrzędna, lub przechowywania tablicy 1-D (prawdopodobnie w strukturze?) I korzystania z programu cieniującego w celu wygenerowania XYZ? Mam wrażenie, że i tak potrzebuję prostego shadera w ramach nowego modelu rurociągu bez stałej cechy, aby zaimplementować skalowanie i tłumaczenie, więc gdybym mógł połączyć generację współrzędnych X i Z oraz skalowanie/tłumaczenie Y, które byłyby ideał.
Czy to możliwe? Czy znasz jakiś przykładowy kod, który to robi? Czy możesz przynajmniej podać mi pseudokod, mówiąc, do czego służy funkcja GL w jakiej kolejności?
Dzięki!
EDIT: Aby upewnić się, że jest to oczywiste, tutaj jest równoważny kod w trybie natychmiastowym, a kod vertex array:
// immediate
glBegin(GL_LINE_STRIP);
for(int i = 0; i < N; ++i)
glVertex2(i, y[i]);
glEnd();
// vertex array
struct { float x, y; } v[N];
for(int i = 0; i < N; ++i) {
v[i].x = i;
v[i].y = y[i];
}
glVertexPointer(2, GL_FLOAT, 0, v);
glDrawArrays(GL_LINE_STRIP, 0, N);
nuta że v[]
jest dwukrotnie większy od y[]
.
Dzięki. Chyba nie jestem pewien, jak OpenGL wie, że chcę, aby 'coord_X' oznaczał indeks wierzchołka. –
@Ben Voigt: Tęskniłem za tym początkowo, przepraszam :) Odpowiedź jest już naprawiona (przy użyciu gl_VertexID). – kvark
Dzięki, teraz masz dużo więcej sensu. I mógłbym użyć 'glDrawArrays' do renderowania tego en-masse? Pytam, ponieważ [strona podręcznika dla 'glDrawArrays'] (http://www.opengl.org/sdk/docs/man/xhtml/glDrawArrays.xml) mówi:" Jeśli funkcja GL_VERTEX_ARRAY nie jest włączona, nie są generowane żadne prymitywy geometryczne. " Czy to nie ma zastosowania w świecie OpenGL 3, w którym wierzchołki są generowane przez moduł cieniujący? –