Setup OpenGL Development with Clion on MacOS
前言伴随图形学课程进入中后期,我们也不能光讲理论,不做实践。在2021年的岁月里,让我们“撸起袖子加油干”!
今天,我们从比较容易上手的OpenGL开始。
这门课程的前置基础:
杂货铺里Danny之前写的图形学入门课程
C/C++编程语言
开发环境:
Mac OS, Clion, XCode
或者
Windows,Clion,Visual Studio 2016。
为了统一大家的开发环境,这门课里采用Clion。本人的工作环境是Macbook,所以接下来的内容主要会围绕Macbook+Clion环境配置OpenGL来讲解。
配置C/C++开发环境第一步:Install BrewBrew 是Macbook上用来安装和管理各种工具的的command工具。
安装方法如下:
1/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
第二步:确认自己的MacOS上安装了gcc:1~ ❯❯❯ gcc --version ...
Setup Vulkan Development Environment with Clion on MacOS
前言学习图形学编程的时候,其实在MacOS的编程环境默认都是用Xcode,Windows又经常用Visual Studio。但是因为我经常要在Windows 和 MacOS上切换编程,偶尔还得跑到Ubuntu上去,也不想反复的切换不同的IDE,所以我选择了Clion。Clion 好的好处就是跨平台的使用。
今天花了几个小时在MacOS上配置了Clion+Vulkan的开发环境,对于后期学习Vulkan做铺垫。 了解Clion的人都知道,Clion的C/C++编程采用的是cmake 做工程构建,这样子又可以逼迫我使用一个跨平台的构架方案,对于底层的工程构建可以了如指掌,也可使促我更进一步的了解和学习cmake。
我的工作环境MacOS: Big Sur
gcc verson123456~/C/V/shaders ❯❯❯ gcc --versionConfigured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Library/Developer/CommandL ...
Vulkan 导读3: 分配Image资源和创建Swapchain
导读2学习了CB和内存管理。这一节对《Learning Vulkan》的第6章的导读。特介绍了两个主要概念,一个是image resources,另一个是swapchain 和 depth image。
主要内容如下:
Getting started with image resources
Understanding an image resource
Memory allocation and binding an image resource
Introducing swapchains
Creating a depth image
Summarizing the application flow
Getting started with image resourcesVulkan 的资源主要分成两种: 1. image; 2 buffer. 书中的第六章主要是讲解image resources。第七章开始讲解了buffer resources。 image resoure 主要是被用来创建swapchain。
Vulkan的images 主要为contiguous text ...
Vulkan 导读2: Command Buffer 和内存管理
导读2 主要是讲解第五章,之所以跳过2,3,4章是因为这三章关键概念很少,更多的是围绕Vulkan初始化阶段的准备工作。第五章重点讲解了CB和内存的概念,值得对其细节进行整理。
一个command buffer就是a collection of commands. Command buffer 会被提交到一个合适的 hardware queue 让GPU来处理。driver会fetches和validates并compiles这些command buffers,然后再把它们交给GPU来处理。这一章节主要围绕command buffers 和 memory allocation的讲解了以下topics:
Getting started with command buffers
Understanding the command pool and command buffer APIs
Recording command buffers
Implementing the command buffer wrapper class
Managing memory in Vulkan
Get ...
Vulkan 导读1: 下一代图形API
写在之前:此篇为Danny针对《Learning Vulkan》一书的导读。导读的目的主要是将一些重要的概念重点归纳和解释,并对不清楚的概念提出疑问,作为后续工作和学习中的待澄清点。
Danny认为,一本好的书,是可以加深技术理解,自画自圆,其义自见的;一本不好的书,要靠读者去猜,搜索很多其他补助资料才能澄清。优秀的书是可以从全局观开始,聚焦到细节。一本不好的书,说的都是正确的废话。 最近读了两本关于Vulkan的书,一本是电子版的《Learning Vulkan》。
一本是花了$175购买的纸质的《Computer Graphics and the Vulkan API》
两本书都是对下一代图形API的细节展开,Danny希望通过一种导读的形式来将这两本书的一些重要概念融合一下。写这篇文章的内容不是说大家看导读就不用去读书了,而是希望辅助大家阅读图书。如今的时代都是速食知识消费,time is money。 大家都没有时间,但是这种速食知识消费很容易让大家知其然而不知其所以然。
导读的梳理其实比较耗时间。技术读物不像读小说那样可以进行速读,阅读过程要注意的环节是避免眼球回跳。但是, ...
C++ 的函数模板和类模板
介绍C++提供函数模板(function template)。所谓的函数模板,实际上是建立一个通用函数,其函数的类型和形参类型不具体制定,有一个虚拟的那类型来代表。这个通用函数就成为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在末班中定义一次即可。在调用函数时,系统会根据形参的类型来取代模板的虚拟类型,从而实现了不同函数的功能。
C++ 提供两种模板机制: 函数模板,类模板来进行泛型编程
类属 – 类型参数化,又称参数模板
使程序(算法)可以从逻辑功能上抽象,把被处理的对象(数据)类型作为参数传递。
总结:
模板把函数或类要处理的数据类型参数化,表现为参数的多态性,成为类属。
模板用于表达逻辑的结构相同,但具体数据元素类型不同的数据对象的通用行为。
让算法和数据类型分离
函数模板为什么要有函数模板当函数业务逻辑相同但参数不同时,我们就需要用到函数模板。
函数模板做函数参数的本质是类型参数化,好处就是可以编写与类型无关的代码;
注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或 ...
C++:在堆上创建对象,还是在栈上?
本文参考自:https://www.devbean.net/2014/02/cpp-create-object-on-heap-or-stack/ 觉得对初学者有些帮助。
关于究竟是在堆上还是在栈上创建对象,可能很多初学者感到迷惑。我想可以把这部分内容拿出来详细介绍一下。现在,假设你已经清楚什么是堆,什么是栈。
如果需要在堆上创建对象,要么使用new运算符,要么使用malloc系列函数。这点没有异议。
真正有异议的是下面的代码:
1Object obj;
此时,obj是在栈上分配的吗?
要回答这个问题,我们首先要理解这个语句是什么意思。这个语句就是代表着,在栈上创建对象吗?
其实,这行语句的含义是,使对象obj具有“自动存储(automatic storage)”的性质。所谓“自动存储”,意思是这个对象的存储位置取决于其声明所在的上下文。
如果这个语句出现在函数内部,那么它就在栈上创建对象。
如果这个语句不是在函数内部,而是作为一个类的成员变量,则取决于这个类的对象是如何分配的。
考虑下面的代码:
123456class Class{ Object obj; ...
struct vs class in C++
基本区别struct 由c语言引入。在c语言中,是定义结构化数据的标准选择。其主观上的定义可参考:https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/classes/#vs
c++ 同时支持struct 和 class. 原因之一是c++ 是 c 的超集,涵盖c 已支持的语言要素,将更好的支持向下兼容(原来能够工作的c 源程序移植到c++,可以支付极少甚至0代价)。首先我们来看结构体在C和C++中的区别。
C语言中的结构体C语言中的结构体不能为空,否则会报错要求一个结构或联合至少有一个成员
C语言中的结构体只涉及到数据结构,而不涉及到算法.也就是说在C中数据结构和算法是分离的。换句话说就是C语言中的结构体只能定义成员变量,但是不能定义成员函数。然而在C++中既可以定义成员变量又可以定义成员函数, C++中的结构体和类体现了数据结构和算法的结合。 不过虽然C语言的结构体中不能定义成员函数,但是却可以定义函数指针,不过函数指针本质上不是函数而是指针,所以总的来说C语言中的结构体只是一个复杂数 ...
Data Type in C
Data Type Encapulationvoid means “no type”. void * means “a pointer with no type”. void * can point to any type of address.
Usage 1: void is to encapulate the data type
int initHardEnv(void ** handle). A typical example is memory opertation functions such as memcpy and memset
void * memcpy(void * dest, const void * src, size_t len);
void * memset(void * buffer, int c, size_t num);
Usage 2: void is to describe the return value and parameters. It only means “empty” or “nothing”.
If a funct ...
Design Patterns-Single Responsibility Principle
Introduction
Design patters are common architecture approaches. (是架构的设计的具体应用方法论)
Students in Software Engineering Major are usually requirde to take the design patterns in their 3rd year program.
Popularized by the Gang of Fours book, 1994 – Smalltalk & C++
Translated to many OOP languages: C#, Jav
Course Structure
Creational (创建型)
Structual (结构型)
Behavioral (行为型)
About Me
Software Coach in 2012 Software Engineering Lab
The SOLID Design PrinciplesSOLID is an acronym which stands for the ...