惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
Blog — PlanetScale
Blog — PlanetScale
H
Help Net Security
The GitHub Blog
The GitHub Blog
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
Recent Announcements
Recent Announcements
量子位
aimingoo的专栏
aimingoo的专栏
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
Microsoft Azure Blog
Microsoft Azure Blog
Martin Fowler
Martin Fowler
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
A
About on SuperTechFans
T
Tailwind CSS Blog
V
V2EX
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
SegmentFault 最新的问题
G
Google Developers Blog
M
MIT News - Artificial intelligence

博客园 - gearslogy

PCG建筑开发 Houdini HDANC -> HDA Houdini NC HDA -> HDA PBRT 蒙特卡洛采样 BRDF是BSSRDF的一个特殊形式 来自伟大的AI UE5.7编辑器扩展 PBRT中的RayDifferentials Unreal Fur 假毛发 草地 Grass PBRT v2中,隐士表面、三角形的dpdu dpdv dndu dndv 思考 Houdini Vulkan HeightBlend 高度混合 Indexmap C++ Runtime Reflection QML NextQT 随手 HDK门格海绵 clang reflection Master LLVM GEP 类型擦除TypeErase Qt问题记录 现代CPP设计模式 CPP2nd CRTP Facade 模式 billboard暴力实现 Fibonacci各种玩法 ubuntu升级编译器
Vulkan矩形绘制顺序小坑
gearslogy · 2024-06-02 · via 博客园 - gearslogy

裁剪坐标不同:

1. vulkan 裁剪坐标Y 朝下,所以下面矩形意义:

static std::vector<Vertex> vertices = {
    {{-0.5f, -0.5f,0}, {1.0f, 0.0f, 0.0f}}, // 左上角
    {{0.5f, -0.5f,0}, {0.0f, 1.0f, 0.0f}},  // 右上角
    {{0.5f, 0.5f,0}, {0.0f, 0.0f, 1.0f}},   // 右下角
    {{-0.5f, 0.5f,0}, {1.0f, 1.0f, 1.0f}}   // 左下角
};

明显看出来是顺时针方向。所以不考虑MVP矩阵时候。Pipeline光栅配置:

VkPipelineRasterizationStateCreateInfo rasterization_ST_CIO{};
rasterization_ST_CIO.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
rasterization_ST_CIO.cullMode = VK_CULL_MODE_BACK_BIT;
rasterization_ST_CIO.frontFace = VK_FRONT_FACE_CLOCKWISE; // 这里,必须配置顺时针。
rasterization_ST_CIO.depthClampEnable = VK_FALSE;
rasterization_ST_CIO.rasterizerDiscardEnable = VK_FALSE;
rasterization_ST_CIO.polygonMode = VK_POLYGON_MODE_FILL;
rasterization_ST_CIO.lineWidth = 1.0f;
rasterization_ST_CIO.depthBiasEnable = VK_FALSE;

glsl:

#version 460 core
layout(location=0) in vec3 P;
layout(location=1) in vec3 Cd;
layout(location = 0) out vec3 fragColor;

void main(){
    gl_Position = vec4(P, 1.0);
    fragColor = Cd;
}

此时渲染符合预期:

2.opengl裁剪坐标Y 朝上,所以按照下面的矩形定义(逆时针)才是符合人类直觉:

而且我们做模型也是按照Y朝上做。符合直觉。假设我们得模型就是这样得:

 static std::vector<Vertex> vertices = {
     {{-0.5f, -0.5f,0}, {1.0f, 0.0f, 0.0f}}, // 左下角
     {{0.5f, -0.5f,0}, {0.0f, 1.0f, 0.0f}},  // 右下角
     {{0.5f, 0.5f,0}, {0.0f, 0.0f, 1.0f}},   // 右上角
     {{-0.5f, 0.5f,0}, {1.0f, 1.0f, 1.0f}}   // 左上角
 };

顺序明显是逆时针。所以管线:

// 6. rasterization
    VkPipelineRasterizationStateCreateInfo rasterization_ST_CIO{};
    rasterization_ST_CIO.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
    rasterization_ST_CIO.cullMode = VK_CULL_MODE_BACK_BIT;
    rasterization_ST_CIO.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
    rasterization_ST_CIO.depthClampEnable = VK_FALSE;
    rasterization_ST_CIO.rasterizerDiscardEnable = VK_FALSE;
    rasterization_ST_CIO.polygonMode = VK_POLYGON_MODE_FILL;
    rasterization_ST_CIO.lineWidth = 1.0f;
    rasterization_ST_CIO.depthBiasEnable = VK_FALSE;

glsl:

#version 460 core
layout(location=0) in vec3 P;
layout(location=1) in vec3 Cd;

layout(location = 0) out vec3 fragColor; 

layout(binding = 0) uniform UniformBufferObject {
    mat4 model;
    mat4 view;
    mat4 proj;
}ubo;

void main(){
     gl_Position =  ubo.proj * ubo.view * ubo.model  *vec4(P,1.0);
    fragColor = Cd;
}

现在一切感觉类似OPENGL操作。然后接下来送入 MVP:

UBO1 ubo1{};
ubo1.model = 1.0f;
ubo1.view = glm::lookAt(glm::vec3(0.0f, 0.0f, 2.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));// OGL
ubo1.proj = glm::perspective(glm::radians(45.0f), bindSwapChainExtent->width / (float) bindSwapChainExtent->height, 0.1f, 10.0f);
ubo1.proj[1][1] *= -1;

因为vulkan的裁剪坐标是Y朝下,glm是给opengl设计的。如果不加下面渲染出来就是反的(而且还看不到,因为你的FRONT是此时是逆时针):

相当于把在裁剪坐标Y反转了,这样就符合逆时针。刚好模型就像制作在Y朝上(逆时针)这个前提。人类直觉!

符合人类直觉的建模,以及正常显示。