标签: vulkan

Vulkan与EGL配合

Vulkan似乎有很多关于新图形API的嗡嗡声 - https://www.khronos.org/vulkan

我的问题与现有的EGL界面如何适应Vulkan API有关?使用Vulkan新的无状态方法,EGL必须替换为基于Vulkan的替代方案吗?

到目前为止,可以从EGL(OpenGL,Op​​enGL ES和OpenVG)访问的三个API使用每个线程的上下文,Vulkan怎么样?

opengl graphics opengl-es egl vulkan

1
推荐指数
1
解决办法
1689
查看次数

在vkCreateShaderModule之后,是否有办法在Vulkan中获取属性和制服?

像在opengl中一样,我们可以执行glGetActiveAttrib和glGetActiveUniform。

glsl vulkan spir-v

1
推荐指数
1
解决办法
333
查看次数

使用管道障碍代替信号灯

我想确保我正确理解管道障碍。因此,如果第二个屏障的源阶段晚于第一个屏障的目标阶段,则屏障能够同步两个命令缓冲区。它是否正确?当然,如果命令缓冲区在管道的不同迭代期间执行,我将需要使用信号量。

在我看来,同步是Vulkan中最难掌握的部分。IMO规范对此还不够清楚。

vulkan

1
推荐指数
1
解决办法
1334
查看次数

在Vulkan中调试黑色图像

我正在尝试将一个场景渲染到Vulkan中的一个图像中,我想在四边形上进行采样,该四边形漂浮在该场景中的某个地方.

我的方法是基本上做我用来将场景渲染成演示图像的相同步骤,除了我只有RGBA8格式的单个图像而不是特定于表示的格式.但我所看到的只是黑暗.验证图层已启用,不会报告任何内容.使用RenderDoc进行调试时,数据似乎是正确的.它显示场景的图像作为绘图命令的输入(参见下面的屏幕截图).

RenderDoc的屏幕截图,捕获第二帧. 左侧的API跟踪,右侧第二次独立传递的渲染传递输入.

但是,正如您所看到的,表面上的图像只是黑色(右侧图像的中心).那我该如何调试这类问题呢?RenderDoc数据似乎是我所期望的,但结果却不是.验证层没有报告任何内容,所以我必须至少做一些模糊有效的事情.


如果你想挖,为这个特殊的例子完整的源代码可能被发现在GitHub上Main.cppVulkanHelpers.cpp.寻找Vulkan.RenderTarget2.

debugging vulkan

1
推荐指数
1
解决办法
639
查看次数

在哪些情况下可以在堆栈上分配

我目前正在学习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复制的所有数据VkApplicationInfoVkInstanceCreateInfo?如果是这样,为什么官方手册没有告诉我这种行为?https://www.khronos.org/registry/vulkan/specs/1.0/man/html/vkCreateInstance.html

整个API都重复相同的模式.我怎样才能知道堆栈上的分配在哪些情况下是可以的,在哪些情况下应该更喜欢像堆或全局内存那样的更持久的方式?

c++ c++11 vulkan

1
推荐指数
1
解决办法
179
查看次数

在vulkan的灰度纹理格式

OpenGL具有灰度纹理格式:GL_LUMINANCE.什么相当于Vulkan的内部格式?或者我们如何在vulkan中指定灰度纹理?

vulkan

1
推荐指数
2
解决办法
461
查看次数

Vulkan:更新统一变量而不重置命令缓冲区

据我所知,当我们通过"vkUpdateDescriptorSets"更新统一变量时,相应命令缓冲区的状态将无效.因此,我们必须重置命令缓冲区并重新记录它.

有没有办法更新统一变量而不对命令缓冲区做任何事情?

更新每帧统一变量数据的最佳方法是什么(在性能方面)?

vulkan

1
推荐指数
1
解决办法
335
查看次数

设备验证层vulkan

您好,我从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".

在这里你可以看到这个家伙得到了什么.

我可能虽然教程不是最新的但我找不到任何与此主题相关的内容.

谢谢你的帮助:)

c++ vulkan

1
推荐指数
1
解决办法
339
查看次数

Vulkan异步模型加载

我不太确定它是否真的正确我想要做的事情但是没有那么多关于Vulkan的文档,所以这就是我提出的.如果我的设计方式完全错误,请纠正我!

在我的Vulkan应用程序中,我有三个不同的队列

  • graphicsQueue:用于提交图形命令缓冲区
  • presentQueue:用于显示完成的图像
  • transferQueue:用于复制缓冲区,纹理等.

我正在尝试实现异步模型加载,这意味着所有顶点,纹理等都在一个单独的线程中加载.模型加载完成后,主线程会更新绘图命令缓冲区,以便渲染新加载的对象.

一切正常,因为它应该期望我从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)

我打印了地址,graphicsQueuetransferQueue发现它们是相同的(相同的地址),所以看起来我的显卡只支持单个队列.所以现在我正在尝试同步vkQueueSubmit使用信号量的调用:

submitInfo.signalSemaphoreCount = 1;
submitInfo.pSignalSemaphores = &queueSemaphore;
Run Code Online (Sandbox Code Playgroud)

不幸的是,错误仍然是一样的.

所以我的问题是:如何正确地同步呼叫vkQueueSubmit

c c++ vulkan

1
推荐指数
1
解决办法
385
查看次数

调整xcb窗口大小时,VkSurfaceKHR不会更新

我已经按照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(和高度)没有从初始值改变!..就是这个调用 …

resize xcb vulkan

1
推荐指数
1
解决办法
295
查看次数

标签 统计

vulkan ×10

c++ ×3

c ×1

c++11 ×1

debugging ×1

egl ×1

glsl ×1

graphics ×1

opengl ×1

opengl-es ×1

resize ×1

spir-v ×1

xcb ×1