vkCmdCopyImageToBuffer没有复制完整的imageExtent

时间:2017-07-23 21:24:44

标签: vulkan

我对Vulkan vkCmdCopyImageToBuffer函数有疑问。根据传递给此函数的imageExtent VkBufferImageCopy VK_FORMAT_R8G8B8A8_*成员...

  

...是要在宽度,高度和深度上复制的图像的纹素的大小。

但是,在尝试复制未压缩的imageExtent 2D图像的颜色方面时,只会读取1/4的图像。如果我将VK_FORMAT_R32G32_*的字段乘以4,则会读取整个图像。 另一方面,如果我将图像格式更改为例如VK_FORMAT_R32G32B32A32_*,我可以检测到图像的一半被读取。在我看来,除非我使用package MegaPackage; import java.util.*; import processing.core.PApplet; import processing.core.PImage; //Main method. Insert public variables and entities here. public class FlatShooter extends PApplet { PImage background; PImage squareImage; PImage life1Image; PImage life2Image; PImage life3Image; PImage redEnemyImage; public float xSpeedPlayer = 9; public int score; public int enemies; public int lives; public boolean moving = false; public boolean moving2 = false; public Square square; public void setup(){ size(900, 900); background=loadImage("background.jpeg"); squareImage=loadImage("player.png"); life1Image=loadImage("life.png"); life2Image=loadImage("life.png"); life3Image=loadImage("life.png"); square = new Square(squareImage, (width-100)/2, height * 4/5); } //Movement for player and other items public void keyPressed(){ if( key == 'd' || key == 'D'){ moving = true; } if(key == 'a' || key == 'A'){ moving2 = true; } } //Stopping movement for players and other items public void keyReleased(){ if( key == 'd' || key == 'D'){ moving = false; } if(key == 'a' || key == 'A'){ moving2 = false; } } public class Square{ PImage square; float xPos; float yPos; public Square(PImage squareImage, float startX, float startY){ square=squareImage; xPos=startX; yPos=startY; } public void drawSquare(){ image(square, xPos, yPos); } } public void move(float x, float y){ if(moving){ x += xSpeedPlayer; } if (moving2){ x-= xSpeedPlayer; } } } 作为图像的颜色方面,否则函数会出现异常。

我是否遗漏了规格中的内容?

感谢任何提示。

P.S。:如果这是驱动程序问题,我会尝试让AMD参与其中。我目前正在等待确认/白名单以访问他们的论坛。我自2009年开始有一个帐户,但我显然仍然认为是新人。

编辑:顺便说一句,LunarG Vulkan SDK验证图层没有错误/警告/性能警告。

1 个答案:

答案 0 :(得分:0)

感谢Antoine的评论(尤其是他的第一个问题)我设法解决了这个问题。复制命令正确地将所有4x8位值从源图像复制到(更大)目标缓冲区。然而,目标缓冲区随后由片段着色器通过VkBufferView处理,具有不匹配的4x32位格式。因此,通过将4个源纹理元素拟合到1个目标纹素中,复制命令似乎仅更新目标缓冲区的1/4。

欢乐时光。