Vulkan开发实战详解 学习笔记 - 变换

各种变换

添加CubeData.h CubeData.cpp

//首先需要对生成物体数据的辅助类进行修改,使其生成可以组装成立方体的数据
#ifndef VULKANEXBASE_BALLDATA_H
#define VULKANEXBASE_BALLDATA_H

class CubeData
{
public:
	static float* vdata;
	static int dataByteCount;
	static int vCount;
	static void  genBallData();
};
#endif
#include "CubeData.h"
#include <vector>
#include <math.h>
#include <string.h>

float* CubeData::vdata;
int CubeData::dataByteCount;
int CubeData::vCount;
void  CubeData::genBallData()
{
	float UNIT_SIZE = 1;
	float vertices[] =
	{
		//前面
		0,0,UNIT_SIZE,
		UNIT_SIZE,UNIT_SIZE,UNIT_SIZE,
		-UNIT_SIZE,UNIT_SIZE,UNIT_SIZE,
		0,0,UNIT_SIZE,
		-UNIT_SIZE,UNIT_SIZE,UNIT_SIZE,
		-UNIT_SIZE,-UNIT_SIZE,UNIT_SIZE,
		0,0,UNIT_SIZE,
		-UNIT_SIZE,-UNIT_SIZE,UNIT_SIZE,
		UNIT_SIZE,-UNIT_SIZE,UNIT_SIZE,
		0,0,UNIT_SIZE,
		UNIT_SIZE,-UNIT_SIZE,UNIT_SIZE,
		UNIT_SIZE,UNIT_SIZE,UNIT_SIZE,
		//后面
		0,0,-UNIT_SIZE,
		UNIT_SIZE,UNIT_SIZE,-UNIT_SIZE,
		UNIT_SIZE,-UNIT_SIZE,-UNIT_SIZE,
		0,0,-UNIT_SIZE,
		UNIT_SIZE,-UNIT_SIZE,-UNIT_SIZE,
		-UNIT_SIZE,-UNIT_SIZE,-UNIT_SIZE,
		0,0,-UNIT_SIZE,
		-UNIT_SIZE,-UNIT_SIZE,-UNIT_SIZE,
		-UNIT_SIZE,UNIT_SIZE,-UNIT_SIZE,
		0,0,-UNIT_SIZE,
		-UNIT_SIZE,UNIT_SIZE,-UNIT_SIZE,
		UNIT_SIZE,UNIT_SIZE,-UNIT_SIZE,
		//左面
		-UNIT_SIZE,0,0,
		-UNIT_SIZE,UNIT_SIZE,UNIT_SIZE,
		-UNIT_SIZE,UNIT_SIZE,-UNIT_SIZE,
		-UNIT_SIZE,0,0,
		-UNIT_SIZE,UNIT_SIZE,-UNIT_SIZE,
		-UNIT_SIZE,-UNIT_SIZE,-UNIT_SIZE,
		-UNIT_SIZE,0,0,
		-UNIT_SIZE,-UNIT_SIZE,-UNIT_SIZE,
		-UNIT_SIZE,-UNIT_SIZE,UNIT_SIZE,
		-UNIT_SIZE,0,0,
		-UNIT_SIZE,-UNIT_SIZE,UNIT_SIZE,
		-UNIT_SIZE,UNIT_SIZE,UNIT_SIZE,
		//右面
		UNIT_SIZE,0,0,
		UNIT_SIZE,UNIT_SIZE,UNIT_SIZE,
		UNIT_SIZE,-UNIT_SIZE,UNIT_SIZE,
		UNIT_SIZE,0,0,
		UNIT_SIZE,-UNIT_SIZE,UNIT_SIZE,
		UNIT_SIZE,-UNIT_SIZE,-UNIT_SIZE,
		UNIT_SIZE,0,0,
		UNIT_SIZE,-UNIT_SIZE,-UNIT_SIZE,
		UNIT_SIZE,UNIT_SIZE,-UNIT_SIZE,
		UNIT_SIZE,0,0,
		UNIT_SIZE,UNIT_SIZE,-UNIT_SIZE,
		UNIT_SIZE,UNIT_SIZE,UNIT_SIZE,
		//上面
		0,UNIT_SIZE,0,
		UNIT_SIZE,UNIT_SIZE,UNIT_SIZE,
		UNIT_SIZE,UNIT_SIZE,-UNIT_SIZE,
		0,UNIT_SIZE,0,
		UNIT_SIZE,UNIT_SIZE,-UNIT_SIZE,
		-UNIT_SIZE,UNIT_SIZE,-UNIT_SIZE,
		0,UNIT_SIZE,0,
		-UNIT_SIZE,UNIT_SIZE,-UNIT_SIZE,
		-UNIT_SIZE,UNIT_SIZE,UNIT_SIZE,
		0,UNIT_SIZE,0,
		-UNIT_SIZE,UNIT_SIZE,UNIT_SIZE,
		UNIT_SIZE,UNIT_SIZE,UNIT_SIZE,
		//下面
		0,-UNIT_SIZE,0,
		UNIT_SIZE,-UNIT_SIZE,UNIT_SIZE,
		-UNIT_SIZE,-UNIT_SIZE,UNIT_SIZE,
		0,-UNIT_SIZE,0,
		-UNIT_SIZE,-UNIT_SIZE,UNIT_SIZE,
		-UNIT_SIZE,-UNIT_SIZE,-UNIT_SIZE,
		0,-UNIT_SIZE,0,
		-UNIT_SIZE,-UNIT_SIZE,-UNIT_SIZE,
		UNIT_SIZE,-UNIT_SIZE,-UNIT_SIZE,
		0,-UNIT_SIZE,0,
		UNIT_SIZE,-UNIT_SIZE,-UNIT_SIZE,
		UNIT_SIZE,-UNIT_SIZE,UNIT_SIZE,
	};
	float colors[] = {
		//前面
		1,1,1,//中间为白色
		1,0,0,
		1,0,0,
		1,1,1,//中间为白色
		1,0,0,
		1,0,0,
		1,1,1,//中间为白色
		1,0,0,
		1,0,0,
		1,1,1,//中间为白色
		1,0,0,
		1,0,0,
		//后面
		1,1,1,//中间为白色
		0,0,1,
		0,0,1,
		1,1,1,//中间为白色
		0,0,1,
		0,0,1,
		1,1,1,//中间为白色
		0,0,1,
		0,0,1,
		1,1,1,//中间为白色
		0,0,1,
		0,0,1,
		//左面
		1,1,1,//中间为白色
		1,0,1,
		1,0,1,
		1,1,1,//中间为白色
		1,0,1,
		1,0,1,
		1,1,1,//中间为白色
		1,0,1,
		1,0,1,
		1,1,1,//中间为白色
		1,0,1,
		1,0,1,
		//右面
		1,1,1,//中间为白色
		1,1,0,
		1,1,0,
		1,1,1,//中间为白色
		1,1,0,
		1,1,0,
		1,1,1,//中间为白色
		1,1,0,
		1,1,0,
		1,1,1,//中间为白色
		1,1,0,
		1,1,0,
		//上面
		1,1,1,//中间为白色
		0,1,0,
		0,1,0,
		1,1,1,//中间为白色
		0,1,0,
		0,1,0,
		1,1,1,//中间为白色
		0,1,0,
		0,1,0,
		1,1,1,//中间为白色
		0,1,0,
		0,1,0,
		//下面
		1,1,1,//中间为白色
		0,1,1,
		0,1,1,
		1,1,1,//中间为白色
		0,1,1,
		0,1,1,
		1,1,1,//中间为白色
		0,1,1,
		0,1,1,
		1,1,1,//中间为白色
		0,1,1,
		0,1,1,
	};

	vCount = (sizeof(vertices) / sizeof(vertices[0])) / 3;
	// 顶点的数量为坐标值数量的1/3,因为一个顶点有3个坐标
	dataByteCount = (sizeof(vertices) / sizeof(vertices[0])) * 2 * sizeof(float);
	vdata = new float[(sizeof(vertices) / sizeof(vertices[0])) * 2];
	int index = 0;
	for (int i = 0; i<vCount; i++)
	{
		vdata[index++] = vertices[i * 3 + 0];
		vdata[index++] = vertices[i * 3 + 1];
		vdata[index++] = vertices[i * 3 + 2];

		vdata[index++] = colors[i * 3 + 0];
		vdata[index++] = colors[i * 3 + 1];
		vdata[index++] = colors[i * 3 + 2];
	}
}

准备好cube数据后,修改void MyVulkanManager::createDrawableObject()

//创建绘制用物体
void MyVulkanManager::createDrawableObject()
{
	//TriangleData::genVertexData();//生成三色三角形顶点数据和颜色数据
	//SixPointedStar::genStarData(0.2,0.5,0);
	//triForDraw = new DrawableObjectCommonLight(TriangleData::vdata, TriangleData::dataByteCount, TriangleData::vCount, device, memoryroperties);//创建绘制用三色三角形对象
	//objForDraw = new DrawableObjectCommonLight(SixPointedStar::vdata, SixPointedStar::dataByteCount, SixPointedStar::vCount, device, memoryroperties);
	objForDraw = new DrawableObjectCommonLight(CubeData::vdata, CubeData::dataByteCount, CubeData::vCount, device, memoryroperties);
}

准备好cube数据后,修改void MyVulkanManager::drawObject()中代码

		MatrixState3D::pushMatrix();
		//这是鼠标旋转的代码
		MatrixState3D::rotate(xAngle, 1, 0, 0);
		MatrixState3D::rotate(yAngle, 0, 1, 0);
		/*
		for (int i = 0; i <= 5; i++) 
		{
												    	//循环绘制所有六角星
			MatrixState3D::pushMatrix(); 									//保护现场
			MatrixState3D::translate(0, 0, i);							//沿Z轴平移
			objForDraw->drawSelf(cmdBuffer, sqsCL->pipelineLayout,sqsCL->pipeline, &(sqsCL->descSet[0]));//绘制物体
			MatrixState3D::popMatrix();
		}*/
		//修改为
		//pushMatrix目的保护现场 防止破坏当前的矩阵
		MatrixState3D::pushMatrix(); 									//保护现场
		objForDraw->drawSelf(cmdBuffer, sqsCL->pipelineLayout,sqsCL->pipeline,
			 &(sqsCL->descSet[0]));//绘制物体
		MatrixState3D::popMatrix();							//恢复现场
		MatrixState3D::pushMatrix();						//保护现场
		//平移后在画另外一个正方体
		MatrixState3D::translate(3.5f, 0, 0);							//沿x轴平移

		objForDraw->drawSelf(cmdBuffer, sqsCL->pipelineLayout, sqsCL->pipeline,
			&(sqsCL->descSet[0]));			//绘制变换后的立方体
		MatrixState3D::popMatrix();	
		MatrixState3D::popMatrix();

在这里插入图片描述

z轴旋转30度

	//第二个旋转30度
	MatrixState3D::rotate(30, 0, 0, 1);									//绕z轴旋转30°

在这里插入图片描述

缩放

MatrixState3D::scale(0.4f, 2.0f, 0.6f);					//x、y、z 3个方向按各自的缩放因子进行缩放

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Vulkan开发实战详解》电子书是一本关于Vulkan图形API的实用指南,专门面向游戏开发人员和图形程序员。Vulkan是一个底层的图形API,提供了更高的性能和更好的跨平台兼容性。 这本书详细介绍了Vulkan的基础知识和常用技术,包括渲染管线、纹理映射、物理设备和内存管理等。读者可以通过这本书的引导和示例代码,了解如何使用Vulkan来创建高性能的图形应用程序。 作者通过实战经验,不仅讲解了如何使用Vulkan API进行图形渲染,还提供了一些实例和案例,让读者能够更好地理解和应用所学知识。此外,书中还解释了Vulkan与其他图形API(如OpenGL)的区别和优势,帮助读者更好地理解其应用背后的原理和设计。 这本电子书的特点之一是提供了大量的代码示例和图形演示,使得读者能够更直观地理解和学习Vulkan的使用。通过实践和实例的学习,读者可以逐步掌握Vulkan开发技巧和最佳实践。 总的来说,《Vulkan开发实战详解》电子书适合有一定图形编程基础的开发人员学习和应用。通过阅读这本书,读者可以全面了解Vulkan的使用和应用,并能够利用其特性和优点来开发出高性能的图形应用程序。 ### 回答2: 《Vulkan开发实战详解》是一本关于Vulkan图形API的电子书。Vulkan是一种专为现代多核处理器和高性能显卡而设计的跨平台图形API。这本书涵盖了Vulkan的基本概念、核心功能和开发实践,旨在帮助读者全面了解和掌握这个强大的图形渲染技术。 该书的内容从Vulkan的基本概念出发,介绍了Vulkan的优势、特点和架构。然后,它详细讲解了Vulkan的主要组件,如命令缓冲区、渲染流水线和资源管理。读者可以学习如何创建和配置这些组件以及它们的工作原理。 此外,该书还涵盖了Vulkan的高级特性,如多线程渲染、异步计算和着色器编译等。它详细解释了如何有效地利用这些特性,以提高应用程序的性能和效率。 《Vulkan开发实战详解》提供了丰富的实例代码和案例,供读者参考和实践。这些例子覆盖了Vulkan的各个方面,从简单的绘制三角形到复杂的光照和阴影效果。读者可以通过学习这些实例,逐步理解Vulkan开发流程和技巧。 总的来说,这本电子书提供了一个全面的指南,帮助读者深入理解和掌握Vulkan图形API的开发实践。无论是初学者还是有经验的开发者,都可以从中学习到丰富的知识和实用的技巧,以应对复杂的图形渲染需求。 ### 回答3: 《Vulkan开发实战详解》是一本针对Vulkan图形API进行深入学习和实践的电子书籍。Vulkan是一款跨平台、高性能的图形API,旨在提供更好的图形渲染和计算性能。该书系统地介绍了Vulkan的核心概念、基本原理和实际应用技巧,对于想要深入学习和了解Vulkan开发的人来说是一本不可多得的指南。 《Vulkan开发实战详解》从入门到进阶,侧重于实践和实际案例,帮助读者快速掌握Vulkan图形API的开发技巧。书中首先介绍了Vulkan的基础知识和API的使用方式,包括创建和管理Vulkan实例、设备、窗口等。接着,书中详细讲解了Vulkan的绘制和渲染过程,包括命令缓冲、渲染通道、管线和着色器等方面的内容,读者可以通过具体的示例代码来理解和实践这些技术。 此外,书籍还特别关注Vulkan的性能优化和高级特性。阅读者可以学习如何通过使用Vulkan的高级功能来提高图形渲染的效率,包括多线程渲染和异步计算等。同时,书中还提供了一些实际案例的分析和解决方法,帮助读者解决在实际项目中可能遇到的问题和挑战。 总之,《Vulkan开发实战详解》是一本很好的Vulkan学习资源,通过阅读本书,读者将能够系统地学习和掌握Vulkan开发技巧和实践经验。无论是初学者还是有一定经验的开发者,都可以从中获得很多实用的知识和技巧,为自己的Vulkan开发之路提供指导和支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值