opengl/vulkan
努力减肥的小胖子5
这个作者很懒,什么都没留下…
展开
-
基于PBR绘制球
参考:https://learnopengl.com/PBR/Theoryhttps://learnopengl.com/PBR/Lighting请先看下参考的两个文章,特别是是第一个,看不懂看这个估计很费劲重点在片段着色器效果图:截图工具不怎清楚主要代码实现绘制球:unsigned int sphereVAO = 0;unsigned int indexCount...原创 2019-11-07 18:07:34 · 255 阅读 · 0 评论 -
帧缓冲整理
参考地址:https://learnopengl-cn.readthedocs.io/zh/latest/04%20Advanced%20OpenGL/05%20Framebuffers/https://www.jianshu.com/p/69c7707afb6f1.创建帧缓冲 unsigned int framebuffer; glGenFramebuffers(1, ...原创 2019-11-05 14:44:59 · 338 阅读 · 0 评论 -
pbr_Theory
原文url:https://learnopengl.com/PBR/Theory只写了一部分,看不太懂理论PBR,也就是通常所说的基于物理的渲染,是一组渲染技术,它们或多或少地基于与物理世界更接近的底层理论。由于基于物理的渲染旨在以一种物理上合理的方式模拟光线,因此它通常看起来比我们原来的照明算法(如Phong和Blinn-Phong)更真实。它不仅看起来更好,因为它非常接近真实的物理,我们...原创 2019-10-15 15:43:52 · 407 阅读 · 0 评论 -
Vulkan学习--10.创建帧缓冲对象
我们在创建渲染流程对象时指定使用的附着需要绑定在帧缓冲对象上使用。帧缓冲对象引用了用于表示附着的 VkImageView 对象。对于我们的程序,我们只使用了一个颜色附着。但这并不意味着我们只需要使用一张图像,每个附着对应的图像个数依赖于交换链用于呈现操作的图像个数。我们需要为交换链中的每个图像创建对应的帧缓冲,在渲染时,渲染到对应的帧缓冲上。示例demo: //存储所有帧缓冲对象--10...原创 2019-04-03 11:00:31 · 417 阅读 · 0 评论 -
Vulkan学习--19.创建纹理图像视图和采样器
采样器:在着色器中是可以直接访问图像数据,但当图像被作为纹理时,我们通常不这样做。通常我们使用采样器来访问纹理数据,采样器可以自动地对纹理数据进行过滤和变换处理.采样器进行的过滤操作可以很好地处理纹理采样过密的问题。考虑一个被映射到一个几何图元上的纹理,每个纹素占据了多个片段。如果我们直接采样与片段最近的纹素作为片段颜色,可能就会得到下面第一幅图的效果:如果使用线性插值组合 4 个最近的纹...原创 2019-04-09 10:17:31 · 727 阅读 · 0 评论 -
Vulkan学习--20.组合图像采样器--实现矩形纹理贴图
组合图像采样器:一种新的描述符类型,着色器可以通过这一类型的描述符访问图像资源.1.修改描述符布局,描述符池和描述符集来使用组合图像采样器描述符2.添加纹理坐标信息到 Vertex 结构体3.修改片段着色器从纹理中读取颜色数据。示例://顶点结构体struct Vertex{ glm::vec2 pos; glm::vec3 color; glm::vec2 ...原创 2019-04-09 11:19:52 · 548 阅读 · 0 评论 -
Vulkan学习--21.添加深度缓冲
深度缓冲:绘制多个图像时,会按顺序进行绘制并显示,而不是按空间坐标的关系,有两种方式可以解决这个问题:• 按照深度坐标对绘制调用进行排序• 使用深度测试通常我们使用第一种方式来绘制需要透明的对象。使用第二种方式来绘制一般对象。使用第二种方式需要用到深度缓冲。深度缓冲是用于存储片段深度值的缓冲对象。光栅化后生成的片段包含了一个深度值可以被深度测试检查是否可以使用这一片段覆盖之前的数据。...原创 2019-04-09 13:30:52 · 884 阅读 · 0 评论 -
Vulkan学习--12.渲染和呈现
子流程依赖:渲染流程的子流程会自动进行图像布局变换。这一变换过程由子流程的依赖所决定。子流程的依赖包括子流程之间的内存和执行的依赖关系。虽然我们现在只使用了一个子流程,但子流程执行之前和子流程执行之后的操作也被算作隐含的子流程。在渲染流程开始和结束时会自动进行图像布局变换,但在渲染流程开始时进行的自动变换的时机和我们的需求不符,变换发生在管线开始时,但那时我们可能还没有获取到交换链图像。有两种...原创 2019-04-03 14:08:52 · 608 阅读 · 0 评论 -
Vulkan学习--22.加载模型
载入模型:使用 tinyobjloader 库来从 OBJ 文件加载顶点数据。tinyobjloader库是一个简单易用的单文件 OBJ 加载器,我们只需要下载 tiny_obj_loader.h文件,然后在代码中包含这一头文件就可以使用它了。我们暂时不使用光照,只简单地将纹理贴在模型上。在这里,我们加载的模型叫做 Chalet Hippolyte Chassande Baroz。我们...原创 2019-04-09 15:10:23 · 876 阅读 · 1 评论 -
Vulkan学习--13.重建交换链
实现窗口大小改变时刷新图像:示例代码: //标记窗口大小是否发生改变: bool framebufferResized = false; //为静态函数才能将其用作回调函数 static void framebufferResizeCallback(GLFWwindow* window,int width , ...原创 2019-04-03 16:22:43 · 495 阅读 · 0 评论 -
Vulkan学习--14.创建顶点缓冲
1.创建缓冲2.申请内存3.填充顶点缓冲4.绑定顶点缓冲我们首先创建一个 CPU 的缓冲,然后将我们要使用的顶点数据先复制到这个 CPU 缓冲中,最后,我们复制 CPU 缓冲中的数据到阶段缓冲顶点着色器:#version 450#extension GL_ARB_separate_shader_objects : enablelayout(location = 0) in vec...原创 2019-04-03 17:51:09 · 663 阅读 · 0 评论 -
Opengl中给矩形添加纹理和绘制一个立方体
效果图:源码:#include <stdio.h>#include <string.h>#include <GL/glew.h>#include <GL/freeglut.h>#include <string>#include <fstream>#include <iostream>#inclu...原创 2019-08-01 17:07:42 · 1483 阅读 · 0 评论 -
绘制一个球体并贴纹理,加载bmp图片
效果图:纹理图:源码:#include <iostream>#include <stdlib.h>#include <fstream>#include <assert.h>#include <GL/freeglut.h>using namespace std;int toInt(const char* bytes...原创 2019-08-22 14:49:23 · 1011 阅读 · 0 评论 -
Vulkan学习--9.创建图像管线
创建图像管线可编程阶段:1.载入着色器2.创建着色器模块3.创建着色器阶段固定功能阶段:在 Vulkan 不存在默认状态,所有状态必须被显式地设置,无论是视口大小,还是使用的颜色混合函数都需要显式地指定。1.顶点输入2.输入装配3.视口和剪裁4.光栅化5.多重采样6.深度和模版测试7.颜色混合8.动态状态9.管线布局示例Demo://读取编译的二进制着色器文件-...原创 2019-04-03 10:12:22 · 500 阅读 · 0 评论 -
Vulkan学习--8.着色器模块概述
着色器模块概述Vulkan 使用的着色器代码格式是一种叫做 SPIR-V 的字节码,这一字节码格式可以在 Vulkan 和 OpenCL 上使用。可以用它来编写图形和计算着色器,在这里,我们将它用于编写图形管线的着色器。GPU 厂商的编译器将字节码转换为原生代码的工作复杂度远远低于直接编译较高级的类 C 代码。过去的经验告诉我们使用类 C 代码,比如GLSL 作为着色器代码,会因为不同 GPU ...原创 2019-04-02 17:40:56 · 1013 阅读 · 0 评论 -
qt5.6中使用vulkan--创建空白窗口
1.在.pro中添加GLM_DIR = F:/opengl/glm-0.9.9.4/qt5.6/lib-releaseGLFW_DIR = F:/opengl/glfw-3.2.1/qt5.6/lib-releaseVulKan_LIB_DIR = D:/VulkanSDK/1.0.11.1/Source/lib32VulKan_DIR = D:/VulkanSDK/1.0.11.1...原创 2019-03-26 16:15:44 · 2138 阅读 · 4 评论 -
Vulkan学习--15.暂存缓冲
目的:暂存缓冲可以提升性能现在我们创建的顶点缓冲已经可以使用了,但我们的顶点缓冲使用的内存类型并不是适合显卡读取的最佳内存类型。最适合显卡读取的内存类型具有 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT 标记,含有这一标记的内存类型通常 CPU 无法直接访问。在本章节,我们会创建两个顶点缓冲。一个用于 CPU 加载据,一个用于显卡设备读取数据。我们通过缓冲复制指令将 C...原创 2019-04-04 09:28:35 · 870 阅读 · 0 评论 -
Vulkan学习--16.创建索引缓冲
绘制一个矩形可以通过绘制两个三角形来实现,如果不共享顶点,就需要 6 个顶点。共享顶点的话,只需要 4 个顶点就可以。可以想象对于更加复杂的三维网格,通过共享顶点可以节约大量内存资源。索引缓冲是一个包含了指向顶点缓冲中顶点数据的索引数组的缓冲。使用索引缓冲,我们可以对顶点数据进行复用。上图演示了索引缓冲的原理,顶点缓冲中包含每一个独一无二的顶点的数据,索引缓冲使用顶点缓冲中顶点数据的索引来引...原创 2019-04-04 09:59:06 · 481 阅读 · 0 评论 -
Vulkan学习--17.描述符布局、缓冲、描述符池和描述符集
现在,我们已经可以传递顶点属性给顶点着色器,但对于一些所有顶点都共享的属性,比如顶点的变换矩阵,将它们作为顶点属性为每个顶点都传递一份显然是非常浪费的。Vulkan 提供了资源描述符来解决这一问题。描述符是用来在着色器中访问缓冲和图像数据的一种方式。我们可以将变换矩阵存储在一个缓冲中,然后通过描述符在着色器中访问它。使用描述符需要进行下面三部分的设置:• 在管线创建时指定描述符布局• 从描述...原创 2019-04-04 15:21:38 · 1309 阅读 · 0 评论 -
Vulkan学习--18.使用纹理图像
在我们的程序中使用纹理,需要采取下面的步骤:• 创建设备内存 (显存) 支持的图像对象• 加载图像文件的像素数据• 创建图像采样器• 使用图像采样器描述符采样纹理数据之前,我们对图像对象已经有所熟悉,我们的渲染操作是在我们获取的交换链图像上进行的,但我们还没有自己创建过图像对象。现在,我们将开始自己创建一个图像对象:1.创建一个暂存资源,后使用像素数据填充它2.将像素数据从暂存资源复...原创 2019-04-04 17:43:20 · 1561 阅读 · 0 评论 -
Vulkan学习--1.简介
简介Vulkan是Khronos集团开发的高级图形API。其他图形API(如OpenGL和Direct3D)要求驱动程序执行从高级API到适合硬件的必要转换。当时的意图是让开发人员不必管理更复杂的图形硬件细节。随着那些旧的图形API不断发展,它们慢慢地将越来越多的低级硬件功能直接暴露给程序员。程序员要求对硬件进行较低级别的访问,从而牺牲了具有更高开销和更低性能的手持功能的便利性和安全性。Vu...原创 2019-03-28 15:40:38 · 555 阅读 · 0 评论 -
Vulkan学习--2.创建一个Vulkan实例
Vulkan API使用该vkInstance对象存储所有每个应用程序状态。应用程序必须在执行任何其他Vulkan操作之前创建Vulkan实例。基本的Vulkan架构如下所示:上图显示Vulkan应用程序链接到Vulkan库,通常称为加载器。创建实例会初始化加载器。加载程序还加载并初始化低级图形驱动程序,通常由GPU硬件供应商提供。请注意,此图中描述了各个层,这些层也由加载程序加载。层通常...原创 2019-03-28 15:41:47 · 933 阅读 · 0 评论 -
Vulkan学习--3.选择一个支持 Vulkan 的图形设备 (VkPhysicalDevice)
从Vulkan获取对象列表在Vulkan中获取对象列表是一种相当常见的操作,并且API具有一致的模式。返回列表的API函数具有count和pointer参数。count参数是一个指向整数的指针,以便API可以设置其值。步骤是:1.使用指向count参数的整数的有效指针调用该函数,并为指针参数调用NULL。2.API使用列表中的对象数填充count参数。3.应用程序分配足够的空间来存储列表。...原创 2019-03-28 15:42:39 · 3081 阅读 · 0 评论 -
Vulkan学习--4.创建 VkDevice(逻辑设备) 和 VkQueue(队列)
设备队列和队列系列与其他图形API不同,Vulkan将设备队列暴露给程序员,以便程序员可以决定使用多少队列以及使用哪种类型的队列。队列是用于向硬件提交命令的抽象机制。稍后您将看到Vulkan应用程序如何构建一个充满命令的命令缓冲区,然后将它们提交到队列以供GPU硬件进行异步处理。Vulkan根据队列类型将队列排列到队列系列中。为了找到您感兴趣的队列的类型和特征,您可以从物理设备查询Queue...原创 2019-03-28 15:43:27 · 1522 阅读 · 0 评论 -
Vulkan学习--11.创建指令缓冲对象
基本命令缓冲区操作在其他图形API中,应用程序可以通过进行API调用来设置诸如线宽之类的属性glLineWidth()。在幕后,驱动程序将此API调用转换为特定于GPU的命令,并将命令放入命令缓冲区。驱动程序还通过在应用程序视图之外创建和销毁命令缓冲区来管理命令缓冲区。最终,驱动程序将命令缓冲区“提交”到GPU以处理命令。在Vulkan中,您创建一个命令缓冲区并进行类似的Vulkan API调...原创 2019-03-28 15:44:20 · 504 阅读 · 0 评论 -
Vulkan学习--5.创建一个窗口表面和交换链
• 创建一个窗口,窗口表面和交换链1.检测交换链是否支持2.启用交换链扩展3.选择适当的表面格式4.查找最佳的可用呈现模式5.设置交换范围6.创建窗口表面7.创建交换链8.查询交换链支持细节Vulkan 是一个平台无关的 API,它不能直接和窗口系统交互。为了将 Vulkan 渲染的图像显示在窗口上,我们需要使用 WSI(Window SystemIntegration) 扩...原创 2019-04-02 16:47:05 · 1142 阅读 · 0 评论 -
Vulkan学习--6.将交换链图像包装进 VkImageView
使用任何 VkImage 对象,包括处于交换链中的,处于渲染管线中的,都需要我们创建一个 VkImageView 对象来绑定访问它。图像视图描述了访问图像的方式,以及图像的哪一部分可以被访问。比如,图像可以被图像视图描述为一个没有细化级别的二维深度纹理,进而可以在其上进行与二维深度纹理相关的操作。示例demo: //存储图像视图--5 std::vector<VkImage...原创 2019-04-02 17:15:15 · 784 阅读 · 0 评论 -
Vulkan学习--7.图形管线概述
图形管线概述:图形管线是一系列将我们提交的顶点和纹理转换为渲染目标上的像素的操作。它的简化过程如下:input assembler 获取顶点数据,顶点数据的来源可以是应用程序提交的原始顶点数据,或是根据索引缓冲提取的顶点数据。vertex shader 对每个顶点进行模型空间到屏幕空间的变换,然后将顶点数据传递给图形管线的下一阶段。tessellation shaders 根据一定的...原创 2019-04-02 17:19:50 · 431 阅读 · 0 评论 -
在qt creator中使用freeglut3.0.0
在.pro中加入:prefix=F:/opengl/freeglut-3.0.0/freeglutlibreleaselibdir=F:/opengl/freeglut-3.0.0/freeglutlibrelease/libINCLUDEPATH += $${prefix}/includeLIBS += -L$${libdir} libfreeglutLIBS += -lop...原创 2018-06-20 16:11:54 · 1433 阅读 · 0 评论