2016-05-25 3 views
3

Ich bin mit den Textur-Tutorial von Sascha Willems und es funktioniert ohne Probleme. Dann ändere ich die Textur von einer 2D-Textur zu einer 3D-Textur ohne Vorzeichen 16 Bit.Sampling-Wert in Fragment-Shader aus einer R16_UINT-3D-Textur in Vulkan

stelle ich die richtige Tiefe und dann diese Werte ändern:

VK_FORMAT_BC3_UNORM_BLOCK -> VK_FORMAT_R16_UINT 
VK_IMAGE_TYPE_2D -> VK_IMAGE_TYPE_3D 
and just one component -> view.components = { VK_COMPONENT_SWIZZLE_R }; 

Im Shader:

sampler2D -> sampler3D 

Aber alle Werte, die ich bekommen von Textur (volumeTexture, textpos) .r jetzt sind Null. Ich möchte ein UINT16-Bild hochladen, aber es als float aus dem Fragment-Shader probieren.

Wenn ich RenderDoc öffnen die Textur sieht gut aus.

pastie.org/private/i7dqw7pm0snkbf40eyywg

Dies ist, was ich in opengl tat:

const auto& glType   = GL_SHORT; 
    const auto& glFormat   = GL_LUMINANCE; 
    const auto& glInternalFormat = GL_LUMINANCE16F_ARB; 
    const auto& glClampMode  = GL_CLAMP_TO_EDGE; 
+0

Was meinst du mit „es als Schwimmer probieren?“ Als was * art * float? 16-Bit IEEE-754 schwimmt? 16-Bit vorzeichenloser normierter Fixpunkt? –

Antwort

2

Dies ist, was ich in opengl tat:

OpenGL pixel transfer functionality ist erforderlich, um unangenehme oder langsame Dinge zu akzeptieren. Vulkan ist nicht.

Was Sie in OpenGL getan haben, war der Treiber gezwungen, jedes Pixel von einem 16-Bit unsigned, normalized fixed-point value zu einem 16-bit IEEE-754 floating-point value zu konvertieren. Fast sicher wurde diese Umwandlung auf der CPU durchgeführt.

Vulkan hat keine Stützräder und Vulkan-Treiber für Sie nicht tun Ihre Arbeit. Vulkan hat Formate, und die Spezifikation gibt genau an, was sie bedeuten. Wenn Ihre Daten nicht mit dem Format übereinstimmen, das Sie eventuell verwenden möchten, müssen Sie die Konvertierung durchführen.

+0

Das erklärt alles, jetzt funktioniert es. Vielen Dank – hidayat

1

Können Sie bitte einige weitere Informationen hinzufügen? Mit "Read from Texture" meinst du Sampling in einem Fragment-Shader? Erhalten Sie Fehler von den Validierungsebenen? Unterstützt Ihre Implementierung Stichproben aus R16_UINT?

Wenn RenderDoc zeigt Ihre Textur, aber es ist nicht „sichtbar“ in Ihrer Anwendung Sie auch ein Bild richtig Layout Übergang verpassen kann, zumindest auf Hardware, die sie erfordert. Dies beinhaltet auch den korrekten Subressourcenbereich.

Und nehmen Sie bitte einen Blick auf die vorgesehene Tabelle auf https://www.khronos.org/registry/vulkan/specs/1.0/xhtml/vkspec.html#resources-image-views

Und stellen Sie sicher, dass Ihr Bild und Ansichtsparameter für 3D-Texturen passen.

+0

ja, Sampling im Fragment-Shader. Was ich in opengl getan habe, ist, dass das interne Format USHORT ist, aber das Format für die Textur Float ist. Wenn Sie also von der Textur abtasten, erhalten Sie Float-Werte. Und ich nehme an, was ich hier tun soll, lade das Bild als Ushort, und dann in VkImageViewCreateInfo setze das Format auf VK_FORMAT_R16_SFLOAT – hidayat

+0

http://pastie.org/private/i7dqw7pm0snkbf40eyywg – hidayat

+0

@hidayat: "* Was ich getan habe In opengl, ist das interne Format USHORT, aber das Format für die Textur ist float. * "... Wenn du davon sprichst,' GL_R16' als [OpenGL internes Format] zu verwenden (https: //www.opengl.org/wiki/Image_Format), das entsprechende Vulkan-Format wäre ein 'R16_UNORM', nicht 'R16_UINT'. –

Verwandte Themen