Mam teksturę załadowaną w pliku Three.js, a następnie przekazaną do shaderów. W module cieniującym wierzchołki obliczam wartość normalną i zapisuję w zmiennej wektor UV.
<script id="vertexShader" type="x-shader/x-vertex">
varying vec3 N,P;
varying vec2 UV;
void main() {
gl_Position= projectionMatrix * modelViewMatrix * vec4(position,1.0);
P= position;
N= normalMatrix * vec3(normal);
UV= uv;
}
</script>
<script id="fragmentShader" type="x-shader/x-fragment">
varying vec3 N,P;
varying vec2 UV;
uniform sampler2D texture;
void main() {
gl_FragColor= texture2D(texture,UV);
}
</script>
Jak obliczyć wektory T i B?
textures
glsl
uv-mapping
three.js
Ramy Al Zuhouri
źródło
źródło
Odpowiedzi:
Przede wszystkim na każdy wierzchołek 3D przypadają nieskończone wektory styczne i dwu-styczne. Poniższy obraz wyjaśnia, dlaczego istnieje nieskończona liczba przestrzeni stycznych dla każdego wierzchołka, styczna i bitangent mogą mieć dowolny kierunek w pokazanej płaszczyźnie.
Aby właściwie obliczyć najbardziej użyteczną 1 przestrzeń styczną, chcemy, aby nasza przestrzeń styczna była wyrównana w taki sposób, aby oś x (styczna) odpowiadała kierunkowi u na mapie nierówności, a oś y (bitangent) odpowiadała kierunkowi v na mapie wypukłości powinniśmy już mieć normalną wierzchołek, który już odpowiada kierunkowi Z w przestrzeni stycznej.
(1) najbardziej przydatne, ponieważ w końcu chcemy, aby normalne wektory były próbkowane z tekstury
Najlepiej to wyjaśnić obrazami, chcemy, aby nasza przestrzeń styczna była wyrównana, jak
(u, v)
pokazano poniżej.Źródło obrazu, choć nie jest ściśle związane z grafiką komputerową
W grafice komputerowej programiści zwykle używają
(u,v)
również zwanych współrzędnymi tekstury. Zakładamy, że T jest styczną, a B jest bitangentem iP0
jest naszym docelowym wierzchołkiem, który jest częścią trójkąta(P0,P1,P2)
.Najpierw pamiętajmy, co chcieliśmy zrobić, to obliczyć styczną i bitanget, które:
Chodzi o to, że już założyliśmy, że T i B leżą w tej samej płaszczyźnie i odpowiadają teraz U i V, jeśli znamy ich wartości, możemy przekroczyć iloczyn i trzeci wektor, aby skonstruować macierz transformacji ze świata do przestrzeni stycznej.
Biorąc pod uwagę, że wiemy, że dowolny wektor 2D można zapisać jako liniową kombinację dwóch niezależnych wektorów 2 i ponieważ mamy już punkty trójkąta (krawędzie), pokazane na powyższym obrazie. Możemy pisać:
(2) tak właśnie wyprowadza się macierz podstawową
Powyższe równanie można zapisać w postaci macierzy,
Rozwiązując równanie macierzowe, możemy wyznaczyć wartości T i B, możemy zbudować macierz transformacji.
Pełny kod źródłowy w C ++
Pełny kod źródłowy i wyprowadzenie można znaleźć tutaj .
źródło