Vulkan似乎有很多关于新图形API的嗡嗡声 - https://www.khronos.org/vulkan
我的问题与现有的EGL界面如何适应Vulkan API有关?使用Vulkan新的无状态方法,EGL必须替换为基于Vulkan的替代方案吗?
到目前为止,可以从EGL(OpenGL,OpenGL ES和OpenVG)访问的三个API使用每个线程的上下文,Vulkan怎么样?
像在opengl中一样,我们可以执行glGetActiveAttrib和glGetActiveUniform。
我想确保我正确理解管道障碍。因此,如果第二个屏障的源阶段晚于第一个屏障的目标阶段,则屏障能够同步两个命令缓冲区。它是否正确?当然,如果命令缓冲区在管道的不同迭代期间执行,我将需要使用信号量。
在我看来,同步是Vulkan中最难掌握的部分。IMO规范对此还不够清楚。
我正在尝试将一个场景渲染到Vulkan中的一个图像中,我想在四边形上进行采样,该四边形漂浮在该场景中的某个地方.
我的方法是基本上做我用来将场景渲染成演示图像的相同步骤,除了我只有RGBA8格式的单个图像而不是特定于表示的格式.但我所看到的只是黑暗.验证图层已启用,不会报告任何内容.使用RenderDoc进行调试时,数据似乎是正确的.它显示场景的图像作为绘图命令的输入(参见下面的屏幕截图).
但是,正如您所看到的,表面上的图像只是黑色(右侧图像的中心).那我该如何调试这类问题呢?RenderDoc数据似乎是我所期望的,但结果却不是.验证层没有报告任何内容,所以我必须至少做一些模糊有效的事情.
如果你想挖,为这个特殊的例子完整的源代码可能被发现在GitHub上的Main.cpp和VulkanHelpers.cpp.寻找Vulkan.RenderTarget2.
我目前正在学习Vulkan.在学习几个教程时,大致相同的代码重复出现:
VkInstance g_instance;
void SetupVulkan(){
VkApplicationInfo appInfo = {};
//Set appInfo attributes
VkInstanceCreateInfo instanceInfo = {};
instanceInfo.pApplicationInfo = &appInfo;
//Set ICI attributes
VkResult result = vkCreateInstance(&instanceInfo, NULL, &g_instance);
//Error handling
}
Run Code Online (Sandbox Code Playgroud)
这会在堆栈上创建一个VkApplicationInfo和一个VkInstanceCreateInfo.离开功能并使用时,这是否会导致一些问题g_instance?被vkCreateInstance复制的所有数据VkApplicationInfo和VkInstanceCreateInfo?如果是这样,为什么官方手册没有告诉我这种行为?https://www.khronos.org/registry/vulkan/specs/1.0/man/html/vkCreateInstance.html
整个API都重复相同的模式.我怎样才能知道堆栈上的分配在哪些情况下是可以的,在哪些情况下应该更喜欢像堆或全局内存那样的更持久的方式?
OpenGL具有灰度纹理格式:GL_LUMINANCE.什么相当于Vulkan的内部格式?或者我们如何在vulkan中指定灰度纹理?
据我所知,当我们通过"vkUpdateDescriptorSets"更新统一变量时,相应命令缓冲区的状态将无效.因此,我们必须重置命令缓冲区并重新记录它.
有没有办法更新统一变量而不对命令缓冲区做任何事情?
更新每帧统一变量数据的最佳方法是什么(在性能方面)?
您好,我从Vulkan API开始,我正在尝试显示验证层.但问题是我只能访问一个设备验证层:"VK_LAYER_NV_optimus"
{//Enumerating Device Verification Layers
uint32_t layer_count = 0;
vkEnumerateDeviceLayerProperties(_gpu, &layer_count, nullptr);
std::vector<VkLayerProperties> layer_property_list(layer_count);
vkEnumerateDeviceLayerProperties(_gpu, &layer_count, layer_property_list.data());
std::cout << "Device Layers : \n";
for (auto &i : layer_property_list) {
std::cout << " " << i.layerName << "\t\t | " << i.description << std::endl;
}
std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
在教程中,我跟随这些人有更多层,他正在使用"VK_LAYER_LUNARG_standard_validation".
在这里你可以看到这个家伙得到了什么.
我可能虽然教程不是最新的但我找不到任何与此主题相关的内容.
谢谢你的帮助:)
我不太确定它是否真的正确我想要做的事情但是没有那么多关于Vulkan的文档,所以这就是我提出的.如果我的设计方式完全错误,请纠正我!
在我的Vulkan应用程序中,我有三个不同的队列
我正在尝试实现异步模型加载,这意味着所有顶点,纹理等都在一个单独的线程中加载.模型加载完成后,主线程会更新绘图命令缓冲区,以便渲染新加载的对象.
一切正常,因为它应该期望我从Vulkan Validation层获得警告:
线程错误:VkQueue类型的对象同时用于线程...
如果我单步执行调试器,我可以看到以下行受到影响:
//main Loop
vkQueueSubmit(graphicsQueue, ...) //draw command buffer
Run Code Online (Sandbox Code Playgroud)
和
//Background loading thread
vkQueueSubmit(transferQueue, ...)//copy vertex command buffer
Run Code Online (Sandbox Code Playgroud)
我打印了地址,graphicsQueue并transferQueue发现它们是相同的(相同的地址),所以看起来我的显卡只支持单个队列.所以现在我正在尝试同步vkQueueSubmit使用信号量的调用:
submitInfo.signalSemaphoreCount = 1;
submitInfo.pSignalSemaphores = &queueSemaphore;
Run Code Online (Sandbox Code Playgroud)
不幸的是,错误仍然是一样的.
所以我的问题是:如何正确地同步呼叫vkQueueSubmit?
我已经按照https://vulkan-tutorial.com上的教程进行了操作...我在不使用GLFW扩展的情况下创建了它.到目前为止,我正在进行"Swap chain Recreation",所有设置和渲染都正确.
但是,我似乎无法调整大小正常工作!
我已经迷上了XCB_RESIZE_REQUEST并且正在设置我的信息结构w/h,如下所示:
if (resize->width > 0) { info.width = resize->width; }
if (resize->height > 0) { info.height = resize->height; }
info.framebufferResized = true;
Run Code Online (Sandbox Code Playgroud)
导致(在下次drawFrame()调用中)recreateSwapchain()调用的原因:
if (res == VK_ERROR_OUT_OF_DATE_KHR || res == VK_SUBOPTIMAL_KHR || info.framebufferResized) {
info.framebufferResized = false;
recreateSwapchain();
} else if (res != VK_SUCCESS) {
throw runtime_error("failed to present swap chain image!");
}
recreateSwapchain() {
vkDeviceWaitIdle(info.device);
cleanupSwapchain();
querySwapchainSupport(info.physicalDevice);
createSwapchain();
createImageViews();
createRenderPass();
createGraphicsPipeline();
createFramebuffers();
createCommandBuffers();
}
Run Code Online (Sandbox Code Playgroud)
我做了一些调试,发现swapchainSupport.capabilities.minImageExtent.width(和高度)没有从初始值改变!..就是这个调用 …