OpenGL ES 2.0 wiele programów czy wiele shaderów czy co? Jak to działa?

Problem (TL;DR)

Mój problem, zasadniczo, jest to, że Nie wiem, jak OpenGL ES 2.0 oczekuje mnie pisać i używać wielu shaderów; lub jeśli jest to w ogóle wskazane/oczekiwane, że osoba to zrobi.

Podstawowe pytanie brzmi: Jeśli mam jabłko, świecącą skałę i rozmytą siatkę, wszystkie w tym samym świecie 3D, wszystkie najlepiej narysowane różnymi programami shaderów, ale używającymi tego samego mvpMatrix, to jak mógłbym używać wszystkich z nich w tym samym renderowaniu OpenGL, tak aby wszyscy używają swoich najbardziej odpowiednich shaderów, które napisałem?

What Have I done

Więc napisałem podstawowy program OpenGL ES 2.0 Dla mojej gry na Androida, który działa doskonale w tym, że może rysować obrys obiektów na ekranie. Ale to nie robi nic innego; raczej dlatego, że shadery wyglądają tak:

Vertex Shader

uniform mat4 uMVPMatrix;
attribute vec4 aPosition;

void main() {
    gl_Position = uMVPMatrix * aPosition;
}

Fragment Shader

void main() {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
Teraz są dość proste. Powodem, dla którego nie posunąłem się dalej, jest to, że nie mogę zrozumieć out, jeśli mam napisać jeden shader, aby zastosować go do wszystkich moich różnych obiektów lub jeśli mam używać wielu shaderów. A jeśli mam używać wielu shaderów do rysowania wielu różnych obiektów, to jak mam to zrobić w efektywny sposób?

Mam wrażenie, że to musi być podstawowa wiedza dla każdego, kto robi OpenGL ES 2.0 dzień w dzień, więc mam nadzieję, że ktoś może odpowiedzieć na moje pytanie lub wskazać mi właściwy kierunek.

I mieć:

  • przejrzałem wiele samouczków, z których żaden nie używa niczego poza najbardziej podstawowymi shaderami.
  • Przeczytaj całą specyfikację OpenGL ES 2.0 GLSL (żadna z nich nie wspominała o tym, jak ma być używana; chodziło tylko o to, co wszystko robi, a nie jak pasuje do siebie).
  • próbowałem zmodyfikować trochę shadery.

Więc mam nadzieję, że jestem blisko zrozumienia przepływu pracy OpenGL, ale wydaje się, że jeszcze tam nie jestem.

Edit: znalazłem to dobrze później:

Jeśli Twoja aplikacja jest napisana dla OpenGL ES 2.0, nie twórz pojedynczego shadera z dużą ilością przełączników i warunków, który wykona każde zadanie, którego aplikacja potrzebuje do renderowania sceny. Zamiast tego skompiluj wiele programów shaderów, z których każdy wykonuje określone, skoncentrowane zadanie.

To jest z iOS OpenGL ES 2.0 wytycznych.
Author: Robert Massaioli, 2012-02-09

1 answers

Możesz używać wielu shaderów, ale przełączanie się między nimi może być dość kosztowne, więc zalecaną praktyką jest narysowanie każdego obiektu shadera, a następnie przejście do następnego shadera i narysowanie wszystkich obiektów za pomocą tego i tak dalej.
Aby przełączać się między shaderami, dzwonisz glUseProgram().

 19
Author: Jave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-09 12:21:42