首页 > 其他分享 >Vulkan矩形绘制顺序小坑

Vulkan矩形绘制顺序小坑

时间:2024-06-02 16:56:39浏览次数:19  
标签:Vulkan rasterization 0.0 CIO ST 1.0 0.5 矩形 小坑

裁剪坐标不同:

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是此时是逆时针):

ubo1.proj[1][1] *= -1;

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

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

 

标签:Vulkan,rasterization,0.0,CIO,ST,1.0,0.5,矩形,小坑
From: https://www.cnblogs.com/gearslogy/p/18227290

相关文章

  • 60天【代码随想录算法训练营34期】第十章 单调栈part03 (84.柱状图中最大的矩形)
    84.柱状图中最大的矩形classSolution:deflargestRectangleArea(self,heights:List[int])->int:s=[0]result=0heights.insert(0,0)heights.append(0)foriinrange(1,len(height......
  • leetCode. 85. 最大矩形
    leetCode.85.最大矩形部分参考上一题链接leetCode.84.柱状图中最大的矩形此题思路代码classSolution{public:intlargestRectangleArea(vector<int>&h){intn=h.size();vector<int>left(n),right(n);stack<int>......
  • 在 Cognex VisionPro CogRecordDisplay 中创建交互式矩形区域
    在CognexVisionProCogRecordDisplay中创建交互式矩形区域在图像处理和视觉检测应用中,定义和操作特定区域是至关重要的。本文将演示如何在CognexVisionPro中使用C#创建一个可交互的矩形区域,并启用拖拽和调整大小功能,从而提升图像处理的灵活性和效率。前提条件安......
  • iOS开发_绘制圆角矩形虚线环
    -(void)drawRect:(CGRect)rect{//获取上下文(/画笔/绘图环境)CGContextRefcontext=UIGraphicsGetCurrentContext();//小段长度CGFloatline_dash=self.height/20;//虚线的样式:长5空隙15长10空隙30长2空隙20...//CGFloa......
  • qt如何将下拉框的框设置为圆角矩形
    在Qt中,可以使用样式表(QSS)来设置下拉框的外观,包括圆角矩形的样式。以下是一个例子://在C++代码中设置样式表QComboBox{border-radius:8px;/*设置圆角半径*/background-color:#FFFFFF;/*设置背景颜色*/color:#333333;/*设置文字颜色*/p......
  • 【Halcon】实现分离通道、创建矩形、获取灰度级、求最大最小均值、求大于某一灰度级的
    read_image(Image,'D:/image/123.jpg')rgb1_to_gray(Image,GrayImage)gen_rectangle1(Rectangle,100,100,200,200)rectangle1_domain(GrayImage,ImageReduced,100,100,200,200)crop_domain(ImageReduced,ImagePart)get_region_points(ImageP......
  • pytorch 转 tensorRT 踩的几个小坑_tensorrt engine set up failed
    CSDN搬家失败,手动导出markdown后再导入博客园1、版本不匹配[E][TRT]Layer:Where_51'soutputcannotbeusedasshapetensor.[E][TRT]Networkvalidationfailed.[E]Enginecreationfailed.[E]Enginesetupfailed.这实际是由于pytorch与TensorRT版本不匹......
  • 力扣-84. 柱状图中最大的矩形
    1.题目介绍题目地址(84.柱状图中最大的矩形-力扣(LeetCode))https://leetcode.cn/problems/largest-rectangle-in-histogram/题目描述给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。 示......
  • Leedcode-构造矩形
    自己写的classSolution:defconstructRectangle(self,area:int)->List[int]:#计算给定面积的平方根root=area**0.5#初始化结果列表,默认为[1,area],即长为面积,宽为1的情况temp=[1,area]#如果面积是一个完全......
  • PLC程序实现矩形波,三角波,正弦波
    这套程序本来是在Smart200上玩出来的,后来在PLC1200/PLC1500的环境下重写了PLC程序。换句话说,这要遵守程序里的算法公式,不管什么PLC都能做出这几种波形1.采样时间想要生成连续的波形图,本质就是在采样时间点上采集当前输出值,当采样点足够多的时候,在时间线上就形成了随时间变化的......