Direct-X学习笔记--天空盒

利用DirectX 11绘制的大致流程(天空盒示例) 本文的主要内容 刚开始学习DirectX 11时,看着诸多的资料包括源码,仍是一头雾水,花费了大量的时间不断地理解代码到底是如何作用于我想要的结果的。本文旨在记录和阐述各个代码在整个程序中扮演的角色。并以天空球的实现作为了一个小小的例子。 ... 阅读详情

学习了三维的地形系统之后,该抬头看看天空啦。下面学习一下传说中的三维天空系统。其实三维天空的实现比地形系统简单得多,我们只需要用一点点小伎俩,就可以蒙混大多数人。


一.简介

我们在玩游戏的时候,尤其是野外的大场景中,要想更逼真离不开三维天空系统。要用程序来模拟无边无际的天空是不可能的,而聪明的前辈们自然也想到了用“天圆地方”这种古代人们对于天空的认识来作为三维天空设计思想。即用一个足够大的面罩住我们,只要这个罩足够大,在里面看天空就和真实的天空没什么区别啦。而基于这种思想的天空设计方案中,最常用的就是天空盒。所谓天空盒,就是用一个立方体,罩住玩家所在的世界空间,天空盒常常是24个点,6个面,也可以是5个面,地面用三维地形,就不需要天空盒来覆盖了。

而要做出天空的效果,我们就必须要去找到一些天空的纹理素材,找到几张无缝拼接的图片,作为纹理贴图,这样我们看起来才不会穿帮。


二.天空盒类的设计

天空盒其实比较简单,就是一个立方体,然后在立方体的内侧进行纹理贴图即可。要注意的就是纹理贴图的顺序不要搞错,不然一眼就会被发现。

和之前的地形系统一样,都需要保存设备指针,系统内部自己设定顶点,然后根据参数初始化天空盒的大小,以及设置纹理贴图。使用时,我们只需要设定这几个参数就可以创建出各式各样的天空系统啦!

.h文件

/*!
 * \file SkyBox.h
 *
 * \author puppet_master
 * \date 七月 2015
 *
 * 三维天空盒的封装
 */
#ifndef __SKYBOX_H_
#define __SKYBOX_H_

#pragma once

struct SkyBoxVertex
{
	float x, y, z;  //定点位置
	float u, v;		//纹理位置
};
#define D3DFVF_SKYBOX D3DFVF_XYZ | D3DFVF_TEX1


class CSkyBox
{
private:
	LPDIRECT3DDEVICE9 m_pDevice;			//设备指针
	LPDIRECT3DVERTEXBUFFER9 m_pVertexBuffer;//定点缓冲区指针
	LPDIRECT3DTEXTURE9 m_pTexture[5];		//纹理对象指针
	float m_fLength;						//天空盒宽度
public:
	CSkyBox(LPDIRECT3DDEVICE9 pDevice);
	virtual ~CSkyBox(void);

	//初始化天空盒
	bool InitSkyBox(float length);

	//加载纹理
	bool InitSkyBoxTexture(LPSTR szFrontTexture, LPSTR szBackTexture, LPSTR szLeftTexture, LPSTR szRightTexture, LPSTR szTopTexture);
	
	//渲染天空盒
	void RenderSkyBox(D3DXMATRIX *matWorld, bool bRenderFrame = false);
};


#endif


.cpp文件

#include "stdafx.h"
#include "SkyBox.h"


CSkyBox::CSkyBox(LPDIRECT3DDEVICE9 pDevice)
{
	m_pDevice = pDevice;
	m_pVertexBuffer = NULL;
	for (int i = 0; i < 5; i++)
		m_pTexture[i] = NULL;
	m_fLength = 0.0f;
}


CSkyBox::~CSkyBox(void)
{
	SAFE_RELEASE(m_pVertexBuffer);
	for (int i = 0; i < 5; i++)
	{
		SAFE_RELEASE(m_pTexture[i]);
	}
}

bool CSkyBox::InitSkyBox(float length)
{
	m_fLength = length;

	//创建定点缓冲区
	m_pDevice->CreateVertexBuffer(20 * sizeof(SkyBoxVertex), 0, D3DFVF_SKYBOX, D3DPOOL_MANAGED, &m_pVertexBuffer, 0);

	SkyBoxVertex vertices[] = 
	{
		//前面的顶点
		{-m_fLength / 2, 0.0f, m_fLength / 2, 0.0f, 1.0f,},
		{-m_fLength / 2, m_fLength / 2, m_fLength / 2, 0.0f, 0.0f,}, 
		{m_fLength / 2, 0.0f, m_fLength / 2, 1.0f, 1.0f,},
		{m_fLength / 2, m_fLength / 2, m_fLength / 2,  1.0f, 0.0f,},

		//后面的顶点
		{m_fLength / 2, 0.0f, -m_fLength / 2, 0.0f, 1.0f,},
		{m_fLength / 2, m_fLength / 2, -m_fLength / 2, 0.0f, 0.0f,},
		{-m_fLength / 2, 0.0f, -m_fLength / 2, 1.0f, 1.0f,},
		{-m_fLength / 2, m_fLength / 2, -m_fLength / 2, 1.0f, 0.0f,},

		//左面的顶点
		{-m_fLength / 2, 0.0f, -m_fLength / 2 , 0.0f, 1.0f,},
		{-m_fLength / 2, m_fLength / 2, -m_fLength / 2, 0.0f, 0.0f,},
		{-m_fLength / 2, 0.0f, m_fLength / 2, 1.0f, 1.0f,},
		{-m_fLength / 2, m_fLength / 2, m_fLength / 2, 1.0f, 0.0f,},

		//右面的顶点
		{m_fLength / 2, 0.0f, m_fLength / 2, 0.0f, 1.0f,},
		{m_fLength / 2, m_fLength / 2, m_fLength / 2, 0.0f, 0.0f,},
		{m_fLength / 2, 0.0f, -m_fLength / 2, 1.0f, 1.0f,},
		{m_fLength / 2, m_fLength / 2, -m_fLength / 2, 1.0f, 0.0f,},

		//上面的顶点
		{m_fLength / 2, m_fLength / 2, -m_fLength / 2,
DirectX11进阶6_静态天空盒、反射动态场景与天空盒、Render-To-Texture(Fade/MiniMap/ScreenShot) 一、静态天空盒 这一章我们主要学习由6个纹理所构成的立方体映射,以及用它来实现一个静态天空盒。 但是在此之前先要消除两个误区: 认为这一章的天空盒就是简单的在一个超大立方体的六个面内部贴上天空盒纹理; 认为天空盒的顶点都是固定的,距离起始点的位置特别远。 我提出这两个误区,是因为看到有些人的作品直接贴了六个立方体,就说自己用到了天空盒技术,但是当你真正学这一章的话会发现此天空盒非彼天空盒,而且该篇教程除了天空盒的技术实现外,还有其余的一些干货值得学习,建议认真研读。 在此之前还需要回顾一下里面有关纹理子资源 阅读详情

相关推荐

天空盒图片素材.zip

Three.js和Cesium常用的天空盒素材,在Three.js通过new THREE.CubeTextureLoader().load([]);使用就行

天空盒贴图,含夜晚、黄昏、晴天以及玄幻贴图

多达几十个的天空盒贴图,含有夜晚星星,黄昏,晴天,阴天多云等天空盒。

ThreeJS skybox 天空盒 35+

ThreeJS skybox 天空盒 35+

天空盒图片30套素材整理

天空盒素材

在LinuxMint 22.1(Ubuntu24.04)上安装使用同花顺远航版

Linux用户成功在LinuxMint22.1系统上通过Wine9.0运行同花顺远航版,解决了长期困扰的股票行情软件问题。此前Linux原生版同花顺功能简陋且停止更新,Wine版通达信存在显示问题。作者作为自由软件支持者,通过调整Wine配置文件解决了高分屏显示异常问题,实现了远航版的正常使用。期待同花顺能重启Linux原生版开发,支持更多处理器架构,完善国产软件生态。该方案为Linux股票软件用户提供了实用参考。

5133

SAP系统中PP模块全配置文档

配置路径IMG>SAP NetWeaver>常规设置>维护日历>工厂日历事务代码SCAL要求传输工厂代码描述日历代码日历描述起始日期星期一星期二星期三星期四星期五星期六星期日有效开始日期有效结束日期1000南微医学工厂MT南微医学工厂日历√√√√√√√201820502.4定义工厂配置路径IMG>生产>物料清单>常规数据>定义BOM状态事务代码OS23要求传输配置路径IMG>生产>主数据>资源>常规数据>标准值>定义参数。

yanzibing99的博客 1889

软件工程实验报告--用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

用Visio绘制数据流图、ER图、状态图、软件结构图、程序流程图、系统流程图

m0_73814332的博客 4160

光纤布拉格光栅(FBG)笔记【1】:波导结构和布拉格波长推导

引言 本文是光纤布拉格光栅(FBG)的笔记【1】,主要介绍了光纤布拉格光栅的波导结构,并且利用动量和能量守恒推导了光纤布拉格波长的表达式 普通光纤中让折射率发生周期性变化就是结构最简单的均匀光纤布拉格光栅(FBG),其波导结构如下图所示。 其传感原理描述可以分为以下的三点: ①光纤纤芯传播的光会在每个光栅面进行反射和透射; ②如果不满足布拉格条件,依次排列的光栅平面反射的光会逐渐变得不同直到最后相互抵消;同时由于系数不匹配,与布拉格波长不相符的光在每个光栅平面的反射也很微弱,这些光大部分在光纤中发生透.

subtitle_的博客 2万+

基于docker进行安装部署seata,解决Seata的版本与Nacos的版本不匹配

本文分享了在Docker环境下部署Seata时遇到Nacos 3.x API不兼容问题的解决方案。由于Seata 2.0.0内置的nacos-client 1.4.2无法调用Nacos 3.x重构后的接口,导致注册失败。通过下载Seata 2.6.0源码自行构建Docker镜像,并调整启动方式(直接执行Java命令绕过Shell脚本),最终成功实现与Nacos 3.x的集成。关键步骤包括:创建自定义Dockerfile、配置application.yml、处理启动脚本兼容性问题,最终采用java直接运行方案

Dd52698的博客 406

【亲测有效】OpenClaw Gateway 出现 “(no output)“ 卡死问题完整解决指南:从手动重启到 systemd Watchdog 自动恢复

最近在使用 OpenClaw(自托管 AI 助手框架,前身 Clawdbot/Moltbot)时,遇到了一个非常常见的顽疾:TUI(终端界面)或 Telegram 等通道经常显示 "(no output)",消息发出去后机器人完全没反应,看起来像是卡死了。

hampeter的博客 8607

【OpenClaw从入门到精通】第20篇:OpenClaw实战—从零搭建教育自动化助教系统(作业批改+智能答疑+学情分析)【2026实测】

本文基于OpenClaw开源框架,聚焦教育行业“答疑重复、批改耗时、学情模糊”三大核心痛点,提供从环境部署到功能落地的全流程实操方案。通过整合QQ群交互、代码分析、数据可视化等技能,构建“智能答疑+作业批改+学情分析”的自动化助教系统。系统支持7×24小时群聊答疑、多语言作业自动评审、学情数据周报生成,经实测可使助教工作时间减少60%、作业批改效率提升5-10倍、学情问题识别提前5周。文中包含完整配置步骤、可直接运行的代码示例及避坑指南,兼顾新手入门与进阶实操,帮助教育工作者快速落地自动化工具,从重复劳动中

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1448

32、机械臂数字孪生模型创建指南

本文介绍了如何在MATLAB Simscape中为一款3自由度(DOF)微型机械臂创建数字孪生模型。内容涵盖硬件参数测量、Simulink模型搭建流程,包括初始条件设置、基座与上部主体构建、上臂结构设计等关键步骤。通过使用Solid、Revolute Joint和Rigid Transform等模块,实现机械臂多体系统建模,并支持后续运动仿真与物理系统的对比诊断。读者可依据指南逐步完成模型构建,相关资源可通过MATLAB File Exchange或指定网站获取。

qsc9012345的博客 214

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: Direct-X学习笔记--地形
下一篇: Direct-X学习笔记--三维粒子系统
puppet_master
puppet_master 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄12年 2695粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值