Diese Veröffentlichung enthält eine Übersetzung des Kapitels Bildansicht aus dem Abschnitt Zeichnen eines Dreiecks, Unterabschnitt Präsentation.
Inhalt
1.
2.
3.
4.
5.
6. Uniform-
7.
8.
9.
10. -
11. Multisampling
FAQ
2.
3.
4.
-
-
- Window surface
- Swap chain
- Image views
- (pipeline)
5.
- Staging
6. Uniform-
- layout
- sets
7.
- Image view image sampler
- image sampler
8.
9.
10. -
11. Multisampling
FAQ
Bildansichten
Um VkImage verwenden zu können, müssen wir ein VkImageView- Objekt in der Grafikpipeline erstellen . Die Bildansicht ist buchstäblich ein Blick ins Bild. Es wird beschrieben, wie das Bild interpretiert wird und welcher Teil des Bildes verwendet wird.
In diesem Kapitel schreiben wir eine Funktion
createImageViews
, mit der für jedes Bild in der Auslagerungskette eine Basisbildansicht erstellt wird, die später als Farbziel verwendet wird.
Fügen Sie zunächst ein Mitglied hinzu, um die Bildansichten zu speichern:
std::vector<VkImageView> swapChainImageViews;
Erstellen wir eine Funktion
createImageView
und rufen sie direkt nach dem Erstellen der Swap-Kette auf.
void initVulkan() {
createInstance();
setupDebugMessenger();
createSurface();
pickPhysicalDevice();
createLogicalDevice();
createSwapChain();
createImageViews();
}
void createImageViews() {
}
Als erstes weisen wir den erforderlichen Speicherplatz im Container zu, um alle Bildansichten zu enthalten.
void createImageViews() {
swapChainImageViews.resize(swapChainImages.size());
}
Als nächstes erstellen wir eine Schleife, die alle Bilder aus der Auslagerungskette durchläuft.
for (size_t i = 0; i < swapChainImages.size(); i++) {
}
Die Parameter zum Erstellen der Bildansicht werden an die VkImageViewCreateInfo- Struktur übergeben . Die ersten Parameter sind unkompliziert.
VkImageViewCreateInfo createInfo{}; createInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; createInfo.image = swapChainImages[i];
Die Felder
viewType
und
format
geben an, wie die Bilddaten interpretiert werden sollen. Mit diesem Parameter
viewType
können Sie Bilder als 1D-, 2D-, 3D-Texturen oder Würfelkarten verwenden.
createInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; createInfo.format = swapChainImageFormat;
In diesem Feld
components
können Sie die Farbkanäle untereinander wechseln. Zum Beispiel können wir alle Farbkanäle nur von einer
r
Komponente lesen , wodurch ein monochromes Bild erhalten wird. Oder zum Beispiel zuweisen
1
oder
0
als Konstante für den Alphakanal. Hier verwenden wir die Standardeinstellungen.
createInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY; createInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY; createInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY; createInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
Das Feld
subresourceRange
beschreibt, welcher Teil des Bildes verwendet wird. Unsere Bilder bestehen nur aus 1 Ebene ohne Detailebenen und werden als Farbpuffer verwendet.
createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
createInfo.subresourceRange.baseMipLevel = 0;
createInfo.subresourceRange.levelCount = 1;
createInfo.subresourceRange.baseArrayLayer = 0;
createInfo.subresourceRange.layerCount = 1;
Wenn Sie mit Stereobildern arbeiten, müssen Sie eine Swap-Kette mit mehreren Ebenen erstellen. Erstellen Sie dann für jedes Bild mehrere Bildansichten mit einem separaten Bild für jedes Auge.
Um die Bildansicht zu erstellen, muss die Funktion vkCreateImageView aufgerufen werden :
if (vkCreateImageView(device, &createInfo, nullptr, &swapChainImageViews[i]) != VK_SUCCESS) {
throw std::runtime_error("failed to create image views!");
}
Im Gegensatz zu Objekten
VkImage
wurden Bildansichten von uns erstellt. Daher müssen wir einen ähnlichen Zyklus beschreiben, um sie zu zerstören, bevor Sie das Programm beenden:
void cleanup() {
for (auto imageView : swapChainImageViews) {
vkDestroyImageView(device, imageView, nullptr);
}
...
}
Die Bildansicht reicht aus, um das Bild als Textur zu verwenden. Um das Bild jedoch als Renderziel zu verwenden, müssen wir einen Framebuffer erstellen. Aber zuerst richten wir die Grafik-Pipeline ein.
C ++