0%

Quad with Bufferless rendering

如果没记错的话,最初应该是在OpenGL SuperBibile里面看到的无Buffer的渲染方式,把三角形顶点数据写在vertex shader代码里,在shader里通过index取相应的数据,当时感觉平平无奇。后来在SaschaWillems的Vulkan example里看到更精简的写法,当时表示惊呆了,使用gl_VertexIndex来构造顶点数据,画一个覆盖屏幕的quad。下面就是Vulkan example的实现。其中vkCmdDrawIndexed对应gl_VertexIndex, vkCmdDraw对应gl_VertexID;我是在GL环境下,则是glDrawElements对应gl_VertexIndex, glDrawArrays对应gl_VertexID

1
2
3
4
5
6
7
8
9
#version 450

layout (location = 0) out vec2 outUV;

void main()
{
outUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2);
gl_Position = vec4(outUV * 2.0f - 1.0f, 0.0f, 1.0f);
}
阅读全文 »

Vulkan枚举值的字符串化

Vulkan中的枚举值做了很好的枚举类型管理,尽管还是是C类型的枚举,具有全局符号可见行;再尽管不似C++ enum class有严格的命名空间访问机制,但是仍然具备相应的枚举类型作为命名空间管理和访问。这为Vulkan枚举值的字符串转换提供了方便,可能这也是为何VulkanSDK给出了官方实现vk_enum_string_helper.h的原因。

VkImageType为例,

阅读全文 »

MeshLab调试时加载的dll版本不对

MeshLab 2023.12下载安装的2023.12版本,我在本地clone了一份源码编译,发现在C:\Users\Administrator\AppData\Roaming\VCG\MeshLab_64bit_fp\MeshLabExtraPlugins\2023.12位置存放了一套插件的dll文件,也就是这一套dll文件影响了源码的调试,也即调试时加载的这个目录下的dll文件,不是生成路径下的dll文件。

根据调用栈加载dll的路径就是这个路径:

阅读全文 »

OpenGL目前的最新版本是2017年发布的4.6版本,OpenGL老矣也不会再有更新了。尽管OpenGL是一套简单易用的图形API,但是很明显它并没有紧跟图形技术发展的脉搏,不仅仅落后于同时代的DirectX,其自身标准的取舍也使其变的碎片化。模式和兼容性就是其中恶心的一点,本文便是记录GLFW3在创建OpenGL上下文时设置模式和兼容性所设置的一些字段。

以前用GLFW3和OpenGL做一些demo时候,glfwWindowHint随意复制粘贴一下然后设置一下OpenGL Context的版本和Profile即可,并没有过多理会其他的字段的含义和差别。毕竟使用Modern OpenGL或者Core Profile的OpenGL,并不需要在意兼容模式下大量的固定管线API的功能。但是,当实际使用中涉及到了glLineWidth这种从上古时代OpenGL 2.0时期延续至今并在OpenGL 4.6中Deprecated的API,更骚气的是其能不能work还要取决于硬件能力和驱动实现,多重buff于一身,某些字段的设置开始变的微妙起来了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);
glfwWindowHint(GLFW_SAMPLES, 4);
glfwWindowHint(GLFW_SCALE_TO_MONITOR, GLFW_TRUE);

std::cout << "Vendor " << glGetString(GL_VENDOR) << std::endl;
std::cout << "Render " << glGetString(GL_RENDERER) << std::endl;
std::cout << "GL " << glGetString(GL_VERSION) << std::endl;
std::cout << "GLSL " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl;
GLint profile;
glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &profile);
std::cout << "Profile " << (profile & GL_CONTEXT_CORE_PROFILE_BIT ? "Core" : "Compatibility") << std::endl;
阅读全文 »

收录经过整合和验证的Hexo-Next配置方案,主要内容来自于网络技术文章,并给出出处,感谢网络大佬们的分享~

修改超链接颜色

  • Hexo Next 修改超链接颜色
  • Hexo Next博客优化 在./themes/next/source/css/_custom/custom.styl里添加如下代码
    1
    2
    3
    4
    5
    6
    7
    8
    .post-body a:not(.btn){
    color: #0593d3;
    border-bottom: none;
    &:hover {
    color: #0477ab;
    text-decoration: underline;
    }
    }
    a:not(.btn)避免修改首页的”阅读全文”按钮的样式
阅读全文 »

渲染API对于线渲染的支持

wireframe line mode line width
OpenGL glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) glDrawArrays: GL_LINES/GL_LINE_STRIP/GL_LINE_LOOP glLineWidth
Vulkan VkPipelineRasterizationStateCreateInfo/VK_POLYGON_MODE_LINE VkPipelineInputAssemblyStateCreateInfo: VK_PRIMITIVE_TOPOLOGY_LINE_LIST/VK_PRIMITIVE_TOPOLOGY_LINE_STRIP vkCmdSetLineWidth, VkPipelineRasterizationStateCreateInfo::lineWidth
DirectX 11 D3D11_RASTERIZER_DESC/D3D11_FILL_WIREFRAME IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST)
DirectX 12 D3D12_GRAPHICS_PIPELINE_STATE_DESC/D3D12_FILL_WIREFRAME D3D12_GRAPHICS_PIPELINE_STATE_DESC/D3D12_PRIMITIVE_TOPOLOGY_TYPE_LINE, IASetPrimitiveTopology(D3D12_PRIMITIVE_TOPOLOGY_LINELIST)

glLineWidth的文档中说只保证宽度1的设置,其他宽度依赖硬件实现。 > Only width 1 is guaranteed to be supported; others depend on the implementation.

阅读全文 »

人脸关键点

使用Google的人脸检测工具MediaPipe来做人脸关键点的检测,可以按照Face Mesh Detection with Python and OpenCV的操作安装MediaPipe并可视化关键点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import cv2
import mediapipe as mp

#Face Mesh

mp_face_mesh = mp.solutions.face_mesh
face_mesh = mp_face_mesh.FaceMesh()

#Image

image = cv2.imread("/home/python/OpenCV/faceMash/image1.jpg")
height, width, _ = image.shape
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

#Facial landmarks
result = face_mesh.process(image)


for facial_landmarks in result.multi_face_landmarks:
for i in range(0, 468):

pt1 = facial_landmarks.landmark[i]
x = int(pt1.x * width)
y = int(pt1.y * height)

cv2.circle(image, (x,y), 2, (100,100,0), -1)
#cv2.putText(image, str(i), (x,y), 0,1,(0,0,0))



cv2.imshow("Face Mesh detection", image)
cv2.waitKey(0)
阅读全文 »

看到很多人的主页做的好看丝滑又专业,不免得想拥有一个自己的。最开始使用Github Pages的默认静态网页生成器jekyll搭建了一个,但是奈何觉得有些复杂和浮夸。搜索一番,发现HexoNexT Theme使用广泛,而且找到了我想要的比较简洁的风格示例,比如木鸟杂记IIssNan’s NotesNightTeamIn Absentia,在阅读官方文档和热情网友分享的文章(比如如何在 GitHub 上写博客?)中,在不懂得各种前端知识情况下,一步步搭建了一个机遇GitHub Pages + Hexo + NexT的个人主页。刚刚开始,对于Hexo一点儿也不熟悉,还有很多需要配置的地方,但是趁着热乎劲,把搭建的历程记录下来,为后来者以参考,为自己以作备忘。

Note: 完工之后回头看,由于对相关背景知识不了解,胡乱查了很多,其实Hexo的官方文档才是最好的教学和参考,详尽而工整,是很好的技术文档范例,而且有中文版哟~

  1. 个人主页的文件是以repo的形式托管在GitHub上的,所以第一步要创建一个名为 {username}.github.io的项目,按照creating a github pages site一步步操作即可。

  2. 安装Nodejs和Hexo, Hexo Overview

阅读全文 »
×