从零开始写C++3D游戏引擎(开发环境VS2022+OpenGL)之十一 从打光到材质 细嚼慢咽逐条读代码系列

news/2025/3/25 22:21:18/

写在篇前的话

作为一个曾经在代码堆里面苦苦挣扎的萌新,困惑的事情在于库,各种依赖,包换文件,链接库,纠结于代码的作用意义。尤其在3D引擎开发的问题上,很多人都被各种困难给阻拦,放弃了在3D渲染,3D游戏引擎上大涨鸿图的机会。

当然关于3D游戏引擎的教程已经汗牛充栋,但是大部分的教程都是由过来人写的,代码中的逻辑与实现,在过来人眼中自然且简单,在初学者眼里却是晦涩繁杂,因此从一个初学者的角度来写一篇关于如果利用OpenGL库开发3D游戏引擎的文章,尤其着重于一行行代码的实现,对于初学者将是莫大的帮助!

有感于此,本人准备以自己的方式以飨读者,节省大家的时间。

本片中所有的源码都可以在这个CSDN资源中找到:3D模型添加材质的源代码,代码解释参见金沙阳博客文章《从零开始写C++3D游戏引擎(开发环境VS2022+OpenGL)之十一从打光到材质细嚼慢咽逐条读代码系列》资源-CSDN文库

希望大家多多点赞支持,大家的支持就是我努力更新的动力!

前情回顾

按照惯例,先回顾一下之前的内容,在之前的博文里面,已经介绍了如何使用OpenGL在VS2022开发环境里面,如何改变摄像头的操作,如何使用光线达到漫反射镜面反射的效果。这些内容都可以访问我的博客文章进行回顾。

[!TIP]

从零开始写3D游戏引擎(开发环境VS2022+OpenGL)之八点五 细嚼慢咽3D引擎的代码实现_利用opengl来写渲染引擎-CSDN博客

从零开始写3D游戏引擎(开发环境VS2022+OpenGL)之九 如何编写摄像机操纵镜头 慢条斯理的保姆包教会系列-CSDN博客

从零开始写3D游戏引擎(开发环境VS2022+OpenGL)之九点五 编写运动摄像机镜头的源代码 细嚼慢咽逐条读代码系列-CSDN博客

从零开始写3D引擎(开发环境VS2022+OpenGL)之十 如何给3D图形添加光源设置漫发射镜面放射 保姆包教会系列-CSDN博客

学习目标

本篇的目标就是要给3D模型拥有质感,也就是有了材质属性,效果图如下:

在这里插入图片描述

源文件有哪些?它们的关系如何?

在本人给出的资源文件中,一共有11个文件,分别是:

  1. 着色器小程序(zprograms):3.1.light_cube.fs;3.1.light_cube.vs;3.1.light_cube.fs;3.1.light_cube.vs。其中,.fs文件是片段着色器小程序,.vs文件是顶点着色器小程序。在后文,我们会一个一个讲解它们内部的源码以及相互之间的关系。

  2. 头文件:camera.h;shader_m.h;stb_image.h。这三个头文件,我们将一个一个讲明他们的来历和作用。

  3. 源文件,程序主体文件:materials.cpp。该文件,将是本文描述的重点

  4. 程序配置文件:chapter11.vcxproj;chapter11.vcxproj.filters;chapter11.vcxproj.user。里面有本工程的配置信息,事实上,几乎所有的附文件包,链接库信息都可以在里面找到。本文的第一个目标就是要讲清楚这里面XML文件的作用,理解了这些,各位在使用VS2022开发配置文件的时候将节约大量时间。

工程文件的讲解

在本博客附属的资源中,工程配置文件一共有三个,分别是chapter11.vcxproj;chapter11.vcxproj.filters;chapter11.vcxproj.user,这三个文件都可以用记事本或者nodepad++打开并修改,不过我们更加要关心的是第一个文件chapter11.vcxproj,里面的内容如下:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><ItemGroup Label="ProjectConfigurations"><ProjectConfiguration Include="Debug|Win32"><Configuration>Debug</Configuration><Platform>Win32</Platform></ProjectConfiguration><ProjectConfiguration Include="Release|Win32"><Configuration>Release</Configuration><Platform>Win32</Platform></ProjectConfiguration><ProjectConfiguration Include="Debug|x64"><Configuration>Debug</Configuration><Platform>x64</Platform></ProjectConfiguration><ProjectConfiguration Include="Release|x64"><Configuration>Release</Configuration><Platform>x64</Platform></ProjectConfiguration></ItemGroup><PropertyGroup Label="Globals"><VCProjectVersion>17.0</VCProjectVersion><Keyword>Win32Proj</Keyword><ProjectGuid>{5c49ea2e-3d95-4766-ab3b-129387fbf142}</ProjectGuid><RootNamespace>ConsoleApplication1</RootNamespace><WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion><ProjectName>chapter11</ProjectName></PropertyGroup><Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"><ConfigurationType>Application</ConfigurationType><UseDebugLibraries>true</UseDebugLibraries><PlatformToolset>v143</PlatformToolset><CharacterSet>Unicode</CharacterSet></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"><ConfigurationType>Application</ConfigurationType><UseDebugLibraries>false</UseDebugLibraries><PlatformToolset>v143</PlatformToolset><WholeProgramOptimization>true</WholeProgramOptimization><CharacterSet>Unicode</CharacterSet></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"><ConfigurationType>Application</ConfigurationType><UseDebugLibraries>true</UseDebugLibraries><PlatformToolset>v143</PlatformToolset><CharacterSet>Unicode</CharacterSet></PropertyGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"><ConfigurationType>Application</ConfigurationType><UseDebugLibraries>false</UseDebugLibraries><PlatformToolset>v143</PlatformToolset><WholeProgramOptimization>true</WholeProgramOptimization><CharacterSet>Unicode</CharacterSet></PropertyGroup><Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /><ImportGroup Label="ExtensionSettings"></ImportGroup><ImportGroup Label="Shared"></ImportGroup><ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"><Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /></ImportGroup><ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"><Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />

http://www.ppmy.cn/news/1582542.html

相关文章

c#难点整理2

1.对象池的使用 就是先定义一系列的对象&#xff0c;用一个&#xff0c;调一个。 public class ObjectPool<T> where T : new(){private Queue<T> pool; // 用于存储对象的队列private int maxSize; // 对象池的最大容量// 构造函数public ObjectPool(int maxSi…

github上传操作简单说明

前期准备 0.下载git&#xff08;如果已经有了就不用了&#xff09; 1.在GitHub上新建一个存储库 2.先在本地创建一个目录作为本地库目录&#xff0c;在目录里打开git bash进行上传 上传过程 echo "# Garbled_repair" >> README.md 作用&#xff1a;创建一个…

others-rustdesk远程

title: others-rustdesk远程 categories: Others tags: [others, 远程] date: 2025-03-19 10:19:34 comments: false mathjax: true toc: true others-rustdesk远程, 替代 todesk 的解决方案 前篇 官方 服务器 - https://rustdesk.com/docs/zh-cn/self-host/rustdesk-server-o…

Centos操作系统安装及优化

Centos操作系统安装及优化 零、环境概述 主机名 centos版本 cpu 内存 Vmware版本 ip地址 test CentOS Linux release 7.6.1810 (Core) 2C 2G 15.5.1 10.0.0.10 一、介质下载 1、7.6版本下载 CentOS7.6标准版下载链接: https://archive.kernel.org/centos-vault/7.6.1810/i…

游戏引擎学习第175天

回顾和今天的计划 今天的主要任务是完成稀疏 Unicode 支持。之前我们已经完成了所有的思考和设计工作&#xff0c;但代码部分尚未完成&#xff0c;因为有许多内容需要调整和重构。因此&#xff0c;今天的目标就是把这些内容全部整理好并最终实现。 回顾当前测试资源构建器的状…

解决Jenkins中Vue前端打包时package.json文件冲突的两种常见问题

在现代前端开发中&#xff0c;Jenkins作为持续集成和持续交付&#xff08;CI/CD&#xff09;工具&#xff0c;被广泛用于自动化构建和部署Vue.js项目。然而&#xff0c;在使用Jenkins进行Vue前端打包时&#xff0c;开发者可能会遇到package.json文件的冲突问题。本文将探讨两种…

AI实干家:HK深度体验-【第3篇-香港、新加坡、深圳、上海、首尔五座城市在金融数据维度的对比分析】

以下是香港、新加坡、深圳、上海、首尔五座城市在金融数据维度的对比分析&#xff0c;涵盖货币流通量、存货款规模、资本市场活跃度、国际贸易、外资及外汇储备等关键指标&#xff0c;结合最新公开数据及全球金融中心排名动态&#xff1a; 一、货币流通量&#xff08;M0-M1-M2&…

dify案例分享-儿童故事绘本语音播报视频工作流

1.前言 前期给大家介绍过儿童故事绘本dify工作流的制作&#xff0c;当时的工作流实现大模型生成分境图片提示词&#xff0c;利用文生图模型生成了图片。另外我们调用语音播报TTS 实现了一个简单儿童绘本工作流。当时这个工作流图片内容和文字内容是单独分开的。并没有做成一个…