我对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验证图层没有错误/警告/性能警告。
答案 0 :(得分:0)
感谢Antoine的评论(尤其是他的第一个问题)我设法解决了这个问题。复制命令正确地将所有4x8位值从源图像复制到(更大)目标缓冲区。然而,目标缓冲区随后由片段着色器通过VkBufferView
处理,具有不匹配的4x32位格式。因此,通过将4个源纹理元素拟合到1个目标纹素中,复制命令似乎仅更新目标缓冲区的1/4。
欢乐时光。