forked from ZoltyKaplan/grafika-machen
Initial QAML question data
This commit is contained in:
17
.github/pull_request_template.md
vendored
Normal file
17
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
## Co zmieniasz?
|
||||||
|
|
||||||
|
- [ ] poprawiam treść pytania
|
||||||
|
- [ ] poprawiam odpowiedź
|
||||||
|
- [ ] dodaję nowe pytanie
|
||||||
|
- [ ] dodaję/zmieniam obrazek w `img/`
|
||||||
|
- [ ] usuwam duplikat albo błąd
|
||||||
|
|
||||||
|
## Źródło / uzasadnienie
|
||||||
|
|
||||||
|
Opisz krótko skąd pochodzi poprawka albo dlaczego obecna wersja jest błędna.
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
- [ ] każde pytanie i każda odpowiedź mieści się w jednej linii
|
||||||
|
- [ ] każda odpowiedź zaczyna się od `-` albo `-|`
|
||||||
|
- [ ] obrazki użyte jako `img/...` istnieją w repozytorium
|
||||||
14
.github/workflows/validate.yml
vendored
Normal file
14
.github/workflows/validate.yml
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
name: Validate QAML
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
validate:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Validate pytania.txt
|
||||||
|
run: php tools/validate_qaml.php pytania.txt
|
||||||
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
ip.txt
|
||||||
|
ip.txt.old
|
||||||
|
*.log
|
||||||
|
*.bak
|
||||||
|
*.old
|
||||||
|
.DS_Store
|
||||||
13
CONTRIBUTING.md
Normal file
13
CONTRIBUTING.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Jak zgłaszać poprawki
|
||||||
|
|
||||||
|
Poprawki zgłaszamy przez Pull Request.
|
||||||
|
|
||||||
|
Najczęstsze dobre zmiany:
|
||||||
|
|
||||||
|
- poprawienie literówki,
|
||||||
|
- oznaczenie prawidłowej odpowiedzi jako `-|`,
|
||||||
|
- usunięcie błędnej odpowiedzi,
|
||||||
|
- dopisanie źródła w komentarzu `//`,
|
||||||
|
- dodanie brakującego obrazka do `img/`.
|
||||||
|
|
||||||
|
Nie zmieniaj formatu pliku na pełny Markdown, JSON, CSV ani HTML. To repozytorium używa prostego formatu QAML opisanego w `README.md`.
|
||||||
203
README.md
Normal file
203
README.md
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
# Baza pytań quizu
|
||||||
|
|
||||||
|
To repozytorium zawiera dane quizu: `pytania.txt` oraz opcjonalny katalog `img/` z obrazkami używanymi w pytaniach.
|
||||||
|
|
||||||
|
Kod aplikacji nie jest częścią tego repozytorium. Zmiany w pytaniach należy zgłaszać przez Pull Request.
|
||||||
|
|
||||||
|
## QAML — Question Answer Markdown Lines
|
||||||
|
|
||||||
|
QAML to prosty liniowy format zapisu pytań testowych wielokrotnego wyboru.
|
||||||
|
|
||||||
|
Format wygląda jak Markdown, ale jego składnia strukturalna jest znacznie prostsza. Parser nie analizuje pełnego Markdowna. Interpretuje wyłącznie początki linii:
|
||||||
|
|
||||||
|
- linia pytania,
|
||||||
|
- linia odpowiedzi błędnej,
|
||||||
|
- linia odpowiedzi poprawnej,
|
||||||
|
- komentarz,
|
||||||
|
- pusta linia.
|
||||||
|
|
||||||
|
Treść pytania i odpowiedzi może zawierać Markdown, HTML oraz inline LaTeX, ale parser traktuje je jako zwykły tekst.
|
||||||
|
|
||||||
|
## Minimalny przykład
|
||||||
|
|
||||||
|
```text
|
||||||
|
// Przykładowa sekcja
|
||||||
|
|
||||||
|
Zaznacz zdania prawdziwe
|
||||||
|
- To jest odpowiedź błędna.
|
||||||
|
-| To jest odpowiedź poprawna.
|
||||||
|
- To jest kolejna odpowiedź błędna.
|
||||||
|
|
||||||
|
Ile wynosi $2 + 2$?
|
||||||
|
- 3
|
||||||
|
-| 4
|
||||||
|
- 5
|
||||||
|
```
|
||||||
|
|
||||||
|
## Reguły składni
|
||||||
|
|
||||||
|
### 1. Pytanie
|
||||||
|
|
||||||
|
Pytaniem jest każda niepusta linia, która:
|
||||||
|
|
||||||
|
- nie zaczyna się od znaku `-`,
|
||||||
|
- nie zaczyna się od `//`.
|
||||||
|
|
||||||
|
Pytanie musi mieścić się w jednej linii.
|
||||||
|
|
||||||
|
Poprawnie:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Zaznacz zdania prawdziwe dotyczące indukcji matematycznej.
|
||||||
|
```
|
||||||
|
|
||||||
|
Niepoprawnie:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Zaznacz zdania prawdziwe
|
||||||
|
dotyczące indukcji matematycznej.
|
||||||
|
```
|
||||||
|
|
||||||
|
Drugi zapis zostanie zinterpretowany jako dwa osobne pytania.
|
||||||
|
|
||||||
|
### 2. Odpowiedź błędna
|
||||||
|
|
||||||
|
Odpowiedź błędna zaczyna się od pojedynczego myślnika `-`.
|
||||||
|
|
||||||
|
Poprawne są oba style:
|
||||||
|
|
||||||
|
```text
|
||||||
|
- Odpowiedź błędna
|
||||||
|
-Odpowiedź błędna
|
||||||
|
```
|
||||||
|
|
||||||
|
Parser usuwa znak `-`, a następnie przycina białe znaki z początku i końca odpowiedzi.
|
||||||
|
|
||||||
|
### 3. Odpowiedź poprawna
|
||||||
|
|
||||||
|
Odpowiedź poprawna zaczyna się od `-|`.
|
||||||
|
|
||||||
|
Poprawne są oba style:
|
||||||
|
|
||||||
|
```text
|
||||||
|
-| Odpowiedź poprawna
|
||||||
|
-|Odpowiedź poprawna
|
||||||
|
```
|
||||||
|
|
||||||
|
Parser usuwa prefiks `-|`, a następnie przycina białe znaki z początku i końca odpowiedzi.
|
||||||
|
|
||||||
|
### 4. Pytania jednokrotnego i wielokrotnego wyboru
|
||||||
|
|
||||||
|
Format dopuszcza dowolną liczbę poprawnych odpowiedzi, w tym zero poprawnych odpowiedzi albo wszystkie odpowiedzi poprawne.
|
||||||
|
|
||||||
|
Pytanie jednokrotnego wyboru:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Ile wynosi $2 + 2$?
|
||||||
|
- 3
|
||||||
|
-| 4
|
||||||
|
- 5
|
||||||
|
```
|
||||||
|
|
||||||
|
Pytanie wielokrotnego wyboru:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Wskaż liczby pierwsze
|
||||||
|
-| 2
|
||||||
|
-| 3
|
||||||
|
- 4
|
||||||
|
-| 5
|
||||||
|
```
|
||||||
|
|
||||||
|
Parser nie narzuca liczby poprawnych odpowiedzi. Zero poprawnych odpowiedzi może oznaczać zadanie, w którym żadna odpowiedź nie jest prawdziwa, a oznaczenie wszystkich odpowiedzi jako `-|` może oznaczać zadanie, w którym wszystkie odpowiedzi są prawdziwe.
|
||||||
|
|
||||||
|
### 5. Komentarze
|
||||||
|
|
||||||
|
Komentarzem jest linia zaczynająca się od `//`.
|
||||||
|
|
||||||
|
Przykłady:
|
||||||
|
|
||||||
|
```text
|
||||||
|
// Sterna 2024/2025 B
|
||||||
|
// Formanowicz 2021-2022
|
||||||
|
```
|
||||||
|
|
||||||
|
Komentarze są ignorowane przez parser demonstracyjny. Można ich używać jako nagłówków sekcji, źródeł, dat albo notatek.
|
||||||
|
|
||||||
|
### 6. Puste linie
|
||||||
|
|
||||||
|
Puste linie są ignorowane. Można ich używać do oddzielania pytań, odpowiedzi lub sekcji.
|
||||||
|
|
||||||
|
## LaTeX
|
||||||
|
|
||||||
|
Dozwolony jest inline LaTeX między pojedynczymi znakami dolara:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Ile wynosi $\binom{n}{k}$?
|
||||||
|
```
|
||||||
|
|
||||||
|
Dozwolony przykład:
|
||||||
|
|
||||||
|
```text
|
||||||
|
-| Liczba kombinacji wynosi $\binom{n}{k}$.
|
||||||
|
```
|
||||||
|
|
||||||
|
Nie jest częścią formalnej składni:
|
||||||
|
|
||||||
|
```text
|
||||||
|
$$
|
||||||
|
a^2 + b^2 = c^2
|
||||||
|
$$
|
||||||
|
```
|
||||||
|
|
||||||
|
oraz:
|
||||||
|
|
||||||
|
```text
|
||||||
|
\[ a^2 + b^2 = c^2 \]
|
||||||
|
```
|
||||||
|
|
||||||
|
Parser demonstracyjny nie waliduje poprawności LaTeX-a. Traktuje zapis `$...$` jako zwykły fragment tekstu.
|
||||||
|
|
||||||
|
## HTML i obrazki
|
||||||
|
|
||||||
|
HTML jest dopuszczony jako część treści pytania lub odpowiedzi.
|
||||||
|
|
||||||
|
Przykład:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Zaznacz funkcję odpowiadającą obrazkowi <img src="img/example.png" height="100" />
|
||||||
|
-| $f(x) = x^2$
|
||||||
|
- $f(x) = x$
|
||||||
|
```
|
||||||
|
|
||||||
|
Jeżeli `pytania.txt` odwołuje się do obrazka przez `img/...`, plik musi istnieć w katalogu `img/` w tym repozytorium.
|
||||||
|
|
||||||
|
## Jedna linia = jeden element
|
||||||
|
|
||||||
|
To najważniejsza zasada formatu.
|
||||||
|
|
||||||
|
Każde pytanie i każda odpowiedź muszą mieścić się w jednej fizycznej linii.
|
||||||
|
|
||||||
|
Poprawnie:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Zaznacz zdania prawdziwe dotyczące funkcji $f(x) = x^2$.
|
||||||
|
-| Funkcja jest parzysta.
|
||||||
|
- Funkcja jest nieparzysta.
|
||||||
|
```
|
||||||
|
|
||||||
|
Niepoprawnie:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Zaznacz zdania prawdziwe dotyczące funkcji
|
||||||
|
$f(x) = x^2$.
|
||||||
|
-| Funkcja jest parzysta.
|
||||||
|
```
|
||||||
|
|
||||||
|
Parser potraktuje drugą linię jako nowe pytanie.
|
||||||
|
|
||||||
|
## Walidacja lokalna
|
||||||
|
|
||||||
|
```bash
|
||||||
|
php tools/validate_qaml.php pytania.txt
|
||||||
|
```
|
||||||
BIN
img/liczba_zwojow_p.png
Normal file
BIN
img/liczba_zwojow_p.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 176 KiB |
BIN
img/trojkat_phong.png
Normal file
BIN
img/trojkat_phong.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 21 KiB |
BIN
img/trojkat_phong_vertex_shader.png
Normal file
BIN
img/trojkat_phong_vertex_shader.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 42 KiB |
BIN
img/trojkat_swiatlo_stozkowe_vertex.png
Normal file
BIN
img/trojkat_swiatlo_stozkowe_vertex.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
358
pytania.txt
Normal file
358
pytania.txt
Normal file
@@ -0,0 +1,358 @@
|
|||||||
|
// BAZA PYTAŃ - GRAFIKA I WIZUALIZACJA
|
||||||
|
|
||||||
|
// Plik: Grafika 2021 dysk INF PP'19
|
||||||
|
|
||||||
|
Dwuwymiarowe współrzędne homogeniczne składają się z:
|
||||||
|
- 2 liczb
|
||||||
|
-| 3 liczb
|
||||||
|
- 4 liczb
|
||||||
|
|
||||||
|
Współrzędne trójwymiarowe otrzymuje się z homogenicznych przez:
|
||||||
|
- rozwiązanie problemu Rungego-Kutty w przestrzeni homogenicznej
|
||||||
|
-| podzielenie $x$, $y$ i $z$ przez $w$
|
||||||
|
- podzielenie $x/w$, $y/w$ i $z/x$
|
||||||
|
|
||||||
|
Czy współrzędne homogeniczne mogą mieć współrzędną $w = 0$?
|
||||||
|
-| tak, tylko to nie są wtedy współrzędne punktu, tylko wektora
|
||||||
|
- nie, bo nie wolno dzielić przez zero
|
||||||
|
- nie, bo zgodnie z definicją $w$ musi być różne od 0
|
||||||
|
|
||||||
|
Niech $n$ będzie wektorem normalnym w przestrzeni modelu, $a$ współrzędną wierzchołka modelu, a $p$ współrzędną źródła światła w przestrzeni oka. Dane są również macierze $P$, $V$ i $M$. Które wzory są poprawne?
|
||||||
|
-| $I = p - VMa$, $v = [0,0,0,1]^T - VMa$
|
||||||
|
- $I = V^{-1}p - Ma$, $v = V^{-1}[0,0,0,1]^T - Ma$
|
||||||
|
- $I = PVp - PVMa$, $v = P[0,0,0,1]^T - PVMa$
|
||||||
|
|
||||||
|
Przestrzeń oka to przestrzeń:
|
||||||
|
-| wspólna przestrzeń dla wszystkich modeli, w której kamera znajduje się w początku układu współrzędnych
|
||||||
|
- w której model znajduje się na początku układu współrzędnych, a jego położenie, rozmiar i orientacja są opisane lokalnie
|
||||||
|
- wspólna przestrzeń dla wszystkich modeli, w której kamera nie musi znajdować się w początku układu współrzędnych
|
||||||
|
|
||||||
|
Kolejność przetwarzania przestrzeni to:
|
||||||
|
- modelu, oka, świata, przycięcia
|
||||||
|
- oka, świata, przycięcia, modelu
|
||||||
|
-| modelu, świata, oka, przycięcia
|
||||||
|
|
||||||
|
Za pomocą procedury glm::lookAt można wyliczyć macierz:
|
||||||
|
- rotacji
|
||||||
|
- rzutowania
|
||||||
|
-| widoku
|
||||||
|
|
||||||
|
Które z poniższych zdań jest prawdziwe?
|
||||||
|
- Dowolnych dwóch operacji obrotu nie można zamieniać kolejnością, bo wynik zawsze będzie inny
|
||||||
|
-| Dwóch operacji obrotu nie można zamieniać w większości wypadków kolejnością, bo wynik będzie inny
|
||||||
|
- Dwie operacje obrotu można wykonać w dowolnej kolejności i wynik będzie taki sam
|
||||||
|
|
||||||
|
Z-Fighting to — zaznacz błędną odpowiedź:
|
||||||
|
- Błąd występujący przy ukrywaniu niewidocznych powierzchni wynikający ze zbyt małej precyzji bufora głębokości.
|
||||||
|
- Błąd występujący przy ukrywaniu niewidocznych powierzchni wynikający z nieliniowego odwzorowania współrzędnej $Z$ przy przejściu z przestrzeni oka do znormalizowanej przestrzeni urządzenia.
|
||||||
|
-| Błąd występujący przy ukrywaniu niewidocznych powierzchni wynikający ze źle zdefiniowanych wektorów normalnych powierzchni.
|
||||||
|
|
||||||
|
Wektor styczny:
|
||||||
|
- jest wektorem łączącym dwa wybrane wierzchołki na modelu
|
||||||
|
-| jest prostopadły do wektora normalnego
|
||||||
|
- jest styczny do wektora normalnego
|
||||||
|
|
||||||
|
Wektor prostopadły do powierzchni pomnożony razy macierz $M$ jest prostopadły do powierzchni poddanej tej samej transformacji:
|
||||||
|
- zawsze
|
||||||
|
- tylko jeśli macierz nie zawiera skalowania
|
||||||
|
-| tylko jeśli macierz nie zawiera skalowania nieproporcjonalnego
|
||||||
|
|
||||||
|
Kość w animacji szkieletowej to:
|
||||||
|
-| abstrakcyjny obiekt reprezentowany przez rotację oraz przesunięcie względem kości wyżej w hierarchii; wierzchołki modelu są powiązane z kością i podlegają tym samym transformacjom co kość
|
||||||
|
- model w postaci walca lub stożka, do którego przyczepione są wybrane wierzchołki animowanego modelu
|
||||||
|
- kształt reprezentujący fragment modelu podczas symulacji fizyki
|
||||||
|
|
||||||
|
Inverse kinematics to:
|
||||||
|
- odtwarzanie animacji szkieletowej od tyłu
|
||||||
|
-| obliczanie układu kości szkieletu na podstawie oczekiwanego efektu końcowego
|
||||||
|
- obliczanie współrzędnych wierzchołków na podstawie układu kości
|
||||||
|
|
||||||
|
Światło punktowe to:
|
||||||
|
-| idealne źródło światła zajmujące dokładnie jeden punkt w przestrzeni, które świeci z jednakową intensywnością w każdym kierunku
|
||||||
|
- mocno skupione światło, na przykład laser
|
||||||
|
- światło o ograniczonym zakresie kierunków świecenia, oświetlające tylko kilka punktów
|
||||||
|
|
||||||
|
Światło stożkowe to:
|
||||||
|
- światło promieniowe lub powierzchniowe o kształcie stożka
|
||||||
|
-| światło punktowe, które świeci tylko w obrębie stożka, a nie w każdym kierunku
|
||||||
|
- światło odbite od powierzchni i rozproszone w ramach stożka dookoła wybranego wektora
|
||||||
|
|
||||||
|
Miękkie cienie są:
|
||||||
|
- efektem symulacji fizycznej obiektów plastycznych
|
||||||
|
- błędem wynikającym z tego, że modele oświetlenia są tylko przybliżeniem faktycznego zachowania światła
|
||||||
|
-| efektem wynikającym z zastosowania powierzchniowych źródeł światła
|
||||||
|
|
||||||
|
Zgodnie z modelem Phonga światło odbite w kierunku obserwatora jest proporcjonalne do:
|
||||||
|
- kąta między wektorem odbitym i wektorem do obserwatora
|
||||||
|
- odwrotności kąta między wektorem odbitym i wektorem do obserwatora
|
||||||
|
-| kosinusa kąta pomiędzy wektorem odbitym i wektorem do obserwatora
|
||||||
|
|
||||||
|
Model Phonga-Blinna różni się od modelu Phonga, gdyż:
|
||||||
|
- zastąpiono w nim iloczyn skalarny wektorów normalnego i w pół drogi iloczynem skalarnym wektorów obserwatora i odbitego
|
||||||
|
-| zastąpiono w nim iloczyn skalarny wektorów do obserwatora i odbitego iloczynem skalarnym wektorów normalnego i w pół drogi
|
||||||
|
- zastąpiono w nim iloczyn skalarny wektorów do obserwatora i odbitego iloczynem skalarnym wektorów normalnego i do światła
|
||||||
|
|
||||||
|
Powierzchnia izotropowa to powierzchnia:
|
||||||
|
- radioaktywna; uwzględnienie interferencji promieniowania gamma z widzialnymi częstotliwościami świetlnymi pozwala na uzyskanie bardziej realistycznych wyników
|
||||||
|
-| rozpraszająca światło jednakowo w każdym kierunku
|
||||||
|
- rozpraszająca światło różnie w różnych kierunkach
|
||||||
|
|
||||||
|
Ray tracing:
|
||||||
|
-| to algorytm generowania obrazów scen trójwymiarowych poprzez śledzenie promieni świetlnych odbijających się i załamujących się w scenie
|
||||||
|
- to algorytm rysowania voxeli
|
||||||
|
- to algorytm rysowania promieni słonecznych
|
||||||
|
|
||||||
|
Promień załamany to promień:
|
||||||
|
- zaczynający się w punkcie cieniowanym o kierunku wyznaczonym przez dowolny wektor spełniający prawo Snella
|
||||||
|
-| zaczynający się w punkcie cieniowanym o kierunku wyznaczonym przez wektor leżący w tej samej płaszczyźnie co promień padający i normalna oraz spełniający prawo Snella
|
||||||
|
- zaczynający się w punkcie cieniowanym o kierunku wyznaczonym przez wektor leżący w tej samej płaszczyźnie co wektor do światła i spełniający prawo Snella względem wektora odbitego
|
||||||
|
|
||||||
|
Promień główny to:
|
||||||
|
- dowolny promień przechodzący przez środek piksela
|
||||||
|
- pierwszy promień z wielu wystrzelony z piksela przy antyaliasingu statystycznym
|
||||||
|
-| promień reprezentujący ścieżkę, którą podróżował promień świetlny trafiający w oko obserwatora
|
||||||
|
|
||||||
|
Liczba zwojów w punkcie $P$ wynosi: <img src="img/liczba_zwojow_p.png" height="160" />
|
||||||
|
- 2
|
||||||
|
-| 0
|
||||||
|
- -2
|
||||||
|
|
||||||
|
Fragment shader to:
|
||||||
|
- program wyliczający wszystkie kolory pikseli wchodzących w rysunek modelu
|
||||||
|
-| program wyliczający kolor jednego piksela, uruchamiany w wielu instancjach, po jednej dla każdego wygenerowanego fragmentu
|
||||||
|
- program wyliczający kolory wszystkich widocznych pikseli modelu
|
||||||
|
|
||||||
|
Potrójne buforowanie pozwala na:
|
||||||
|
-| ukrycie procesu rysowania sceny
|
||||||
|
- lepsze wykorzystanie pamięci cache karty graficznej
|
||||||
|
- synchronizację odświeżania ekranu z procesem rysowania sceny
|
||||||
|
|
||||||
|
Trójkąt na rysunku oświetlony jest punktowym źródłem światła w sposób przedstawiony na rysunku i cieniowany zgodnie z modelem Phonga zaimplementowanym w vertex shaderze. Czy na trójkącie, po narysowaniu go na ekranie, pojawi się plamka odbicia światła? <img src="img/trojkat_phong_vertex_shader.png" height="160" />
|
||||||
|
- Nie, ale to tylko kwestia mocy obliczeniowej; kiedy pojawią się mocniejsze karty graficzne, to wtedy na pewno plamka się pojawi
|
||||||
|
- Tak, gdyż stosowana jest nieliniowa interpolacja oświetlenia pomiędzy wierzchołkami
|
||||||
|
-| Nie, gdyż stosowana jest liniowa interpolacja oświetlenia pomiędzy wierzchołkami
|
||||||
|
|
||||||
|
Otoczkowanie w kontekście ray tracingu to:
|
||||||
|
- rysowanie krawędzi obiektów w cieniowaniu kreskówkowym
|
||||||
|
- tworzenie wypukłej otoczki bryły
|
||||||
|
-| metoda optymalizacji testowania przecięcia promienia z obiektem
|
||||||
|
|
||||||
|
Z-bufor służy do:
|
||||||
|
-| rozwiązania problemu niewidocznych powierzchni
|
||||||
|
- buforowania sekwencji operacji wykonywanych przez OpenGL w celu optymalizacji czasu renderowania obrazu
|
||||||
|
- buforowania danych odczytywanych z tekstur w celu przyspieszenia czasu renderowania obrazu
|
||||||
|
|
||||||
|
Trójkąt na rysunku <img src="img/trojkat_phong.png" height="100" /> oświetlony jest punktowym źródłem światła w sposób przedstawiony na rysunku i ocieniowany zgodnie z modelem Phonga zaimplementowanym w vertex shaderze. Czy na trójkącie, po narysowaniu go na ekranie, pojawi się plamka odbicia światła czy nie?
|
||||||
|
- Nie, ale to tylko kwestia mocy obliczeniowej. Kiedy pojawi się GeForce 12000GRTX, to wtedy na pewno okrąg się pojawi
|
||||||
|
- Tak, gdyż stosowana jest nieliniowa interpolacja oświetlenia pomiędzy wierzchołkami
|
||||||
|
-| Nie, gdyż stosowana jest liniowa interpolacja oświetlenia pomiędzy wierzchołkami
|
||||||
|
|
||||||
|
Z-Buffer służy do:
|
||||||
|
-| rozwiązania problemu niewidocznych powierzchni
|
||||||
|
- buforowania sekwencji operacji wykonywanych przez OpenGL w celu optymalizacji czasu renderowania obrazu
|
||||||
|
- buforowania danych odczytywanych z tekstur w celu przyspieszenia czasu renderowania obrazu
|
||||||
|
|
||||||
|
Współrzędne w przestrzeni trójwymiarowej wyrażone za pomocą współrzędnych homogenicznych, jednorodnych, składają się z:
|
||||||
|
-| 4 liczb
|
||||||
|
- 3 liczb
|
||||||
|
- 2 liczb
|
||||||
|
|
||||||
|
Jaką macierz $X$ przenosi współrzędne z przestrzeni oka do przestrzeni modelu? Ze względu na kolejność operacji mnożenia, przyjmij że współrzędne są wyrażone za pomocą wektorów pionowych.
|
||||||
|
-| $X = M^{-1}V^{-1}$
|
||||||
|
- $X = V^{-1}P^{-1}$
|
||||||
|
- $X = P^{-1}M$
|
||||||
|
|
||||||
|
Vertex shader to:
|
||||||
|
-| program przetwarzający jeden wierzchołek modelu, uruchamiany w wielu instancjach, po jednej na każdy wierzchołek modelu
|
||||||
|
- program przetwarzający wszystkie widoczne wierzchołki modelu
|
||||||
|
- program przetwarzający wszystkie wierzchołki modelu w pętli
|
||||||
|
|
||||||
|
Efektu screen-tearing można uniknąć poprzez:
|
||||||
|
- zastosowanie Z-Bufora, w celu rysowania tylko obiektów widocznych
|
||||||
|
- zastosowanie specjalnego monitora
|
||||||
|
-| synchronizację odświeżania ekranu z procesem rysowania sceny
|
||||||
|
|
||||||
|
Wektor normalny to:
|
||||||
|
- wektor o długości jednostkowej
|
||||||
|
-| wektor prostopadły do powierzchni
|
||||||
|
- wektor określający normalne współrzędne w przestrzeni trójwymiarowej przeliczony ze współrzędnych homogenicznych
|
||||||
|
|
||||||
|
Raytracing to:
|
||||||
|
- algorytm śledzący promienie świetlne wychodzące od źródła światła
|
||||||
|
- algorytm generowania efektów świetlnych w grafice czasu rzeczywistego
|
||||||
|
-| algorytm generowania obrazów
|
||||||
|
|
||||||
|
Tekstura to:
|
||||||
|
- fragment tekstu
|
||||||
|
- fragment opakowania kartonowego
|
||||||
|
-| obrazek nakładany na wielokąt
|
||||||
|
|
||||||
|
Model Phonga Blinna różni się od modelu Phonga, bo:
|
||||||
|
- wykorzystuje iloczyn skalarny wektorów normalnego $\vec{n}$ i "w pół drogi" $\vec{h}$ zamiast iloczynu skalarnego wektorów do obserwatora $\vec{v}$ i normalnego $\vec{n}$
|
||||||
|
-| wykorzystuje iloczyn skalarny wektorów normalnego $\vec{n}$ i "w pół drogi" $\vec{h}$ zamiast iloczynu skalarnego wektorów do obserwatora $\vec{v}$ i odbitego $\vec{r}$
|
||||||
|
- wykorzystuje iloczyn skalarny wektorów do obserwatora $\vec{v}$ i odbitego $\vec{r}$ zamiast iloczynu skalarnego wektorów normalnego $\vec{n}$ i "w pół drogi" $\vec{h}$
|
||||||
|
|
||||||
|
Przestrzeń konfiguracji w Inverse Kinematics to:
|
||||||
|
- przestrzeń zawierająca wiele różnych wersji tego samego szkieletu (w różnych konfiguracjach)
|
||||||
|
- dopuszczalna przestrzeń, w której może poruszać się model
|
||||||
|
-| przestrzeń, w której każdy punkt reprezentuje jakiś układ szkieletu
|
||||||
|
|
||||||
|
Dana jest macierz $M_A$ reprezentująca układ współrzędnych (położenie obiektu A na scenie). Obiekt B orbituje wokół obiektu A. W danym momencie czasowym kąt obrotu zapisany jest w zmiennej $\alpha$, a promień w zmiennej $r$. Jak wyliczyć $M_B$ — macierz modelu dla obiektu B? Ze względu na kolejność mnożenia macierzy załóż, że wektory określające współrzędne homogeniczne są pionowe. Poprzez $R(\alpha)$ oznaczono macierz obrotu o kąt $\alpha$, a poprzez $T(r)$ oznaczono macierz przesunięcia o odległość $r$ prostopadle do osi obrotu.
|
||||||
|
- $M_B = T(r) \cdot R(\alpha) \cdot M_A$
|
||||||
|
-| $M_B = M_A \cdot R(\alpha) \cdot T(r)$
|
||||||
|
- $M_B = M_A \cdot T(r) \cdot R(\alpha)$
|
||||||
|
|
||||||
|
Z-Fighting to:
|
||||||
|
- błąd występujący przy ukrywaniu niewidocznych powierzchni wynikający z nieczyszczenia Z bufora pomiędzy klatkami
|
||||||
|
- błąd występujący przy ukrywaniu niewidocznych powierzchni wynikający ze źle zbudowanego drzewa BSP
|
||||||
|
-| błąd występujący przy ukrywaniu niewidocznych powierzchni wynikający ze zbyt małej dokładności Z Bufora
|
||||||
|
|
||||||
|
Które z poniższych zdań jest prawdziwe?
|
||||||
|
- Sprzętowe wsparcie istnieje tylko dla modelu oświetlenia Phonga (standardowo używanego w OpenGL)
|
||||||
|
- Każdy istniejący model oświetlenia został zaimplementowany sprzętowo. To dzięki temu OpenGL jest tak wydajny
|
||||||
|
-| Każdy istniejący model oświetlenia może być wspierany sprzętowo, ale trzeba go najpierw zaimplementować w specjalnym języku
|
||||||
|
|
||||||
|
Jaka macierz $X$ przenosi współrzędne z przestrzeni oka do przestrzeni modelu? Ze względu na kolejność operacji mnożenia, przyjmij że współrzędne są wyrażone za pomocą wektorów pionowych.
|
||||||
|
-| $X = M^{-1} \cdot V^{-1}$
|
||||||
|
- $X = P^{-1} \cdot M$
|
||||||
|
- $X = V^{-1} \cdot P^{-1}$
|
||||||
|
|
||||||
|
Radiancja to:
|
||||||
|
-| moc promieniowania emitowanego przez jednostkę powierzchni w kierunku reprezentowanym przez różnicowy kąt bryłowy
|
||||||
|
- moc promieniowania emitowanego w kierunku reprezentowanym przez różnicowy kąt bryłowy
|
||||||
|
- moc promieniowania przechodzącego przez jednostkę powierzchni
|
||||||
|
|
||||||
|
Trójkąt na rysunku <img src="img/trojkat_phong.png" height="100" /> oświetlony jest punktowym źródłem światła w sposób przedstawiony na rysunku i ocieniowany zgodnie z modelem Phonga zaimplementowanym w vertex shaderze. Czy na trójkącie (po narysowaniu go na ekranie) pojawi się plamka odbicia światła czy nie?
|
||||||
|
- Nie, ale to tylko kwestia mocy obliczeniowej. Kiedy pojawi się Geforce 12080GRTX to wtedy na pewno okrąg się pojawi
|
||||||
|
- Tak, gdyż stosowana jest nieliniowa interpolacja oświetlenia pomiędzy wierzchołkami
|
||||||
|
-| Nie, gdyż stosowana jest liniowa interpolacja oświetlenia pomiędzy wierzchołkami
|
||||||
|
|
||||||
|
Dana jest macierz $M_A$ reprezentująca układ współrzędnych (położenie obiektu A na scenie). Obiekt B orbituje wokół obiektu A. W danym momencie czasowym kąt obrotu zapisany jest w zmiennej $\alpha$, a promień w zmiennej $r$. Jak wyliczyć $M_B$ — macierz modelu dla obiektu B? Ze względu na kolejność mnożenia macierzy załóż, że wektory określające współrzędne homogeniczne są pionowe. Poprzez $R(\alpha)$ oznaczono macierz obrotu o kąt $\alpha$ (oś nieistotna), a poprzez $T(r)$ oznaczono macierz przesunięcia o odległość $r$ prostopadle do osi obrotu.
|
||||||
|
-| $M_B = M_A \cdot R(\alpha) \cdot T(r)$
|
||||||
|
- $M_B = T(r) \cdot R(\alpha) \cdot M_A$
|
||||||
|
- $M_B = M_A \cdot T(r) \cdot R(\alpha)$
|
||||||
|
|
||||||
|
Współrzędne w przestrzeni dwuwymiarowej wyrażone za pomocą współrzędnych homogenicznych (jednorodnych) składają się z:
|
||||||
|
- 2 liczb
|
||||||
|
- 4 liczb
|
||||||
|
-| 3 liczb
|
||||||
|
|
||||||
|
Nazwa Z-bufora pochodzi od tego, że:
|
||||||
|
- jest buforem służącym do posortowania wierzchołków według ich współrzędnej Z
|
||||||
|
-| składuje on współrzędną Z każdego piksela
|
||||||
|
- poprzez Z oznaczono numer sekwencyjny operacji wykonywanej przez OpenGL, a numery kolejnych operacji są składowane w Z-Buforze
|
||||||
|
|
||||||
|
Koordynaty barycentryczne to:
|
||||||
|
-| koordynaty, które pozwalają na podstawie współrzędnych wierzchołków trójkąta określić położenie punktu wewnątrz trójkąta
|
||||||
|
- koordynaty wyrażone względem położenia obserwatora w przestrzeni oka
|
||||||
|
- koordynaty barów szybkiej obsługi na mapie
|
||||||
|
|
||||||
|
Atrybut programu cieniującego to:
|
||||||
|
- parametr wejściowy programu cieniującego, który dla każdego fragmentu ma inną wartość
|
||||||
|
- parametr wejściowy programu cieniującego, który dla każdego wierzchołka ma taką samą wartość
|
||||||
|
-| parametr wejściowy programu cieniującego, który dla każdego wierzchołka może mieć inną wartość
|
||||||
|
|
||||||
|
Punktowe źródło światła to:
|
||||||
|
-| źródło światła zajmujące dokładnie jeden punkt w przestrzeni, które świeci z jednakową intensywnością w każdym kierunku
|
||||||
|
- źródło światła o ograniczonym zakresie kierunków świecenia (oświetla tylko kilka punktów)
|
||||||
|
- mocno skupione źródło światła (np. laser)
|
||||||
|
|
||||||
|
Powierzchniowe źródło światła to:
|
||||||
|
-| źródło światła, które nie jest punktem
|
||||||
|
- punktowe źródło światła ograniczone pewną powierzchnią (np. światło stożkowe)
|
||||||
|
- światło odbite od powierzchni
|
||||||
|
|
||||||
|
Program cieniujący to:
|
||||||
|
-| program powstały przez połączenie vertex shadera i fragment shadera
|
||||||
|
- inna nazwa fragment shadera
|
||||||
|
- program używający OpenGL API, rysujący ocieniowany model
|
||||||
|
|
||||||
|
Gęstość strumienia promieniowania (irradiancja/emitancja) to:
|
||||||
|
- moc promieniowania emitowanego w kierunku reprezentowanym przez różnicowy kąt bryłowy
|
||||||
|
- moc promieniowania emitowanego przez jednostkę powierzchni w kierunku reprezentowanym przez różnicowy kąt bryłowy
|
||||||
|
-| moc promieniowania przechodzącego przez jednostkę powierzchni
|
||||||
|
|
||||||
|
W modelu Phonga-Blinna wprowadzono tzw. wektor w połowie drogi $\vec{h}$. Wektor ten jest obliczany jako:
|
||||||
|
- znormalizowana suma wektorów odbitego $\vec{r}$ i normalnego $\vec{n}$
|
||||||
|
-| znormalizowana suma wektorów do światła $\vec{l}$ i do obserwatora $\vec{v}$
|
||||||
|
- znormalizowana suma wektorów do światła $\vec{l}$ i normalnego $\vec{n}$
|
||||||
|
|
||||||
|
Funkcja BRDF (Bidirectional Reflectance Distribution Function) opisuje:
|
||||||
|
- stosunek radiancji przychodzącego promieniowania do gęstości emitowanego promieniowania (emitancji)
|
||||||
|
-| stosunek radiancji uchodzącego promieniowania do gęstości przychodzącego promieniowania (irradiancji)
|
||||||
|
- stosunek gęstości przychodzącego promieniowania (irradiancji) do intensywności uchodzącego promieniowania
|
||||||
|
|
||||||
|
Promień cienia to:
|
||||||
|
- promień przeciwny do kierunku do światła (w kierunku krawędzi cienia)
|
||||||
|
- promień przechodzący przez pixel generowanego obrazu, wychodzący z oka obserwatora
|
||||||
|
-| promień do światła
|
||||||
|
|
||||||
|
Kierunkowe źródło światła to:
|
||||||
|
- źródło światła emitujące światło o różnej intensywności w zależności od kierunku świecenia
|
||||||
|
- mocno skupione źródło światła (np. laser) świecące w konkretnym kierunku
|
||||||
|
-| źródło światła świecące z określonego kierunku
|
||||||
|
|
||||||
|
Czy współrzędne homogeniczne mogą mieć współrzędną $w = 0$?
|
||||||
|
- Nie, bo zgodnie z definicją $w$ musi być różne od 0
|
||||||
|
- Nie, bo nie wolno dzielić przez zero
|
||||||
|
-| Tak, w takiej sytuacji są to współrzędne wektora (przesunięcia) a nie pozycji
|
||||||
|
|
||||||
|
Czy współrzędne homogeniczne mogą mieć współrzędną $w = 10$?
|
||||||
|
- Nie, mogą mieć tylko $w = 1$ lub $w = 0$
|
||||||
|
-| Tak, w takiej sytuacji współrzędne te reprezentują pozycję a nie przesunięcie
|
||||||
|
- Tylko wtedy, gdy 10 jest wspólnym dzielnikiem $x$, $y$ i $z$
|
||||||
|
|
||||||
|
Trójkąt <img src="img/trojkat_swiatlo_stozkowe_vertex.png" height="100" /> oświetlony jest światłem stożkowym w sposób przedstawiony na rysunku. Model światła stożkowego został zaimplementowany w vertex shaderze. Czy na trójkącie, po narysowaniu go na ekranie pojawi się jasny okrąg?
|
||||||
|
-| Nie, gdyż stosowana jest liniowa interpolacja oświetlenia pomiędzy wierzchołkami
|
||||||
|
- Tak, gdyż stosowana jest liniowa interpolacja oświetlenia pomiędzy wierzchołkami
|
||||||
|
- Tak, w najnowszych kartach graficznych np. w Geforce NVidia 2080RTX to już jest możliwe
|
||||||
|
|
||||||
|
Animacja szkieletowa polega na:
|
||||||
|
-| interpolacji transformacji geometrycznych związanych z kośćmi w szkielecie
|
||||||
|
- interpolacji współrzędnych wierzchołków modelu pomiędzy keyframe'ami
|
||||||
|
- wyświetlaniu kolejnych keyframe'ów w odpowiednią szybkością (podobnie jak w animacji poklatkowej, ale rysowane są modele 3D)
|
||||||
|
|
||||||
|
Przestrzeń modelu to przestrzeń:
|
||||||
|
- wspólna przestrzeń dla wszystkich modeli, w której kamera nie musi się znajdować w początku układu współrzędnych
|
||||||
|
-| w której model znajduje się na początku układu współrzędnych a jego położenie, rozmiar i obrót nie mają związku z innymi obiektami na scenie
|
||||||
|
- wspólna przestrzeń dla wszystkich modeli, w której kamera zawsze znajduje się w początku układu współrzędnych
|
||||||
|
|
||||||
|
Wektor znormalizowany to:
|
||||||
|
- wektor prostopadły do powierzchni
|
||||||
|
- wektor określający normalne współrzędne w przestrzeni trójwymiarowej przeliczony ze współrzędnych homogenicznych
|
||||||
|
-| wektor o długości jednostkowej
|
||||||
|
|
||||||
|
Niech $\vec{n}$ będzie wektorem normalnym w przestrzeni modelu, $a$ będzie współrzędną wierzchołka w przestrzeni modelu, a $p$ współrzędną źródła światła w przestrzeni oka. Dane są również macierze $P$, $V$ i $M$. Wektory do światła $\vec{l}$ i do obserwatora $\vec{v}$ w przestrzeni oka można wyliczyć następująco:
|
||||||
|
-| $\vec{l} = p - V \cdot M \cdot a$ oraz $\vec{v} = [0,0,0,1]^T - V \cdot M \cdot a$
|
||||||
|
- $\vec{l} = P \cdot p - P \cdot V \cdot M \cdot a$ oraz $\vec{v} = P \cdot [0,0,0,1]^T - P \cdot V \cdot M \cdot a$
|
||||||
|
- $\vec{l} = V^{-1} \cdot p - M \cdot a$ oraz $\vec{v} = V^{-1} \cdot [0,0,0,1]^T - M \cdot a$
|
||||||
|
|
||||||
|
Zmienna jednorodna programu cieniującego to:
|
||||||
|
-| parametr wejściowy programu cieniującego, który dla każdego wierzchołka i każdego fragmentu ma taką samą wartość
|
||||||
|
- parametr wejściowy programu cieniującego, który dla każdego wierzchołka może mieć inną wartość
|
||||||
|
- parametr wejściowy programu cieniującego, który dla każdego fragmentu ma inną wartość
|
||||||
|
|
||||||
|
Jaka macierz $X$ przenosi współrzędne z przestrzeni przycięcia do przestrzeni świata? Ze względu na kolejność operacji mnożenia, przyjmij że współrzędne są wyrażone za pomocą wektorów pionowych.
|
||||||
|
- $X = M^{-1} \cdot V^{-1}$
|
||||||
|
-| $X = V^{-1} \cdot P^{-1}$
|
||||||
|
- $X = (V M)^{-1}$
|
||||||
|
|
||||||
|
Intensywność strumienia promieniowania to:
|
||||||
|
- moc promieniowania przechodzącego przez jednostkę powierzchni
|
||||||
|
-| moc promieniowania emitowanego w kierunku reprezentowanym przez różnicowy kąt bryłowy
|
||||||
|
- moc promieniowania emitowanego przez jednostkę powierzchni w kierunku reprezentowanym przez różnicowy kąt bryłowy
|
||||||
|
|
||||||
|
Podwójne buforowanie pozwala na:
|
||||||
|
- unikanie problemu Z-fighting poprzez alokację dwóch Z-Buforów
|
||||||
|
-| ukrycie procesu rysowania sceny
|
||||||
|
- synchronizację odświeżania ekranu z procesem rysowania sceny
|
||||||
|
|
||||||
|
Stożkowe źródło światła to:
|
||||||
|
- powierzchniowe źródło światła o kształcie stożka
|
||||||
|
- światło odbite od powierzchni i rozproszone w ramach stożka dookoła wektora odbicia
|
||||||
|
-| punktowe źródło światła, które świeci tylko w obrębie stożka a nie w każdym kierunku
|
||||||
|
|
||||||
|
Zjawisko Fresnela to:
|
||||||
|
-| zjawisko polegające na tym, że ilość światła odbitego od powierzchni zależy od kąta patrzenia; odbicie jest silniejsze przy patrzeniu pod małym kątem do powierzchni
|
||||||
|
- zjawisko polegające na zmianie koloru światła podczas przechodzenia przez teksturę
|
||||||
|
- zjawisko polegające na liniowej interpolacji normalnych pomiędzy wierzchołkami trójkąta
|
||||||
90
tools/validate_qaml.php
Normal file
90
tools/validate_qaml.php
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
$file = $argv[1] ?? 'pytania.txt';
|
||||||
|
$baseDir = dirname(__DIR__);
|
||||||
|
$path = $baseDir . '/' . $file;
|
||||||
|
|
||||||
|
if (!is_file($path)) {
|
||||||
|
fwrite(STDERR, "File not found: {$file}\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$lines = file($path, FILE_IGNORE_NEW_LINES);
|
||||||
|
$errors = [];
|
||||||
|
$question = null;
|
||||||
|
$questionLine = 0;
|
||||||
|
$answers = 0;
|
||||||
|
$questionCount = 0;
|
||||||
|
|
||||||
|
$finishQuestion = static function () use (&$errors, &$question, &$questionLine, &$answers, &$questionCount): void {
|
||||||
|
if ($question === null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($answers === 0) {
|
||||||
|
$errors[] = "Line {$questionLine}: question has no answers.";
|
||||||
|
}
|
||||||
|
|
||||||
|
$questionCount++;
|
||||||
|
$question = null;
|
||||||
|
$questionLine = 0;
|
||||||
|
$answers = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach ($lines as $i => $rawLine) {
|
||||||
|
$lineNo = $i + 1;
|
||||||
|
$line = trim($rawLine);
|
||||||
|
|
||||||
|
if ($line === '' || str_starts_with($line, '//')) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!str_starts_with($line, '-')) {
|
||||||
|
$finishQuestion();
|
||||||
|
$question = $line;
|
||||||
|
$questionLine = $lineNo;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($question === null) {
|
||||||
|
$errors[] = "Line {$lineNo}: answer appears before any question.";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (str_starts_with($line, '-|')) {
|
||||||
|
$answer = trim(substr($line, 2));
|
||||||
|
} else {
|
||||||
|
$answer = trim(substr($line, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($answer === '') {
|
||||||
|
$errors[] = "Line {$lineNo}: answer is empty.";
|
||||||
|
}
|
||||||
|
|
||||||
|
$answers++;
|
||||||
|
}
|
||||||
|
|
||||||
|
$finishQuestion();
|
||||||
|
|
||||||
|
$content = file_get_contents($path) ?: '';
|
||||||
|
preg_match_all('/<img\s+[^>]*src=["\']([^"\']+)["\'][^>]*>/i', $content, $matches);
|
||||||
|
foreach ($matches[1] ?? [] as $src) {
|
||||||
|
if (str_starts_with($src, 'img/') && !is_file($baseDir . '/' . $src)) {
|
||||||
|
$errors[] = "Missing image referenced from pytania.txt: {$src}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($questionCount === 0) {
|
||||||
|
$errors[] = 'No questions found.';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($errors !== []) {
|
||||||
|
foreach ($errors as $error) {
|
||||||
|
fwrite(STDERR, $error . PHP_EOL);
|
||||||
|
}
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "OK: {$questionCount} questions validated.\n";
|
||||||
Reference in New Issue
Block a user