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

devtools/2025/3/18 17:10:52/

写在篇前的话

作为一个曾经在代码堆里面苦苦挣扎的萌新,困惑的事情在于库,各种依赖,包换文件,链接库,纠结于代码的作用意义。尤其在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/devtools/168108.html

相关文章

机器学习中说的正向传递和反向传递是什么意思

在机器学习&#xff0c;尤其是深度学习领域&#xff0c;​正向传递&#xff08;Forward Pass&#xff09;​和反向传递&#xff08;Backward Pass&#xff09;​是神经网络训练过程中的两个核心步骤。它们共同构成了训练神经网络的基础框架&#xff0c;通常与梯度下降算法结合使…

数学建模历程之初见

第一次接触数学建模是在上大学前&#xff0c;当时只是听过。起源于我在大学的老乡群里聊天&#xff0c;由于当时年轻有点傻&#xff0c;说的话太多了&#xff0c;什么都问哈哈哈哈哈。 后来有个学长从老乡群里加我&#xff0c;问我怎么话那么多&#xff0c;你们懂当时对我幼小…

大数据学习拓展——Minio安装与使用

本文参考&#xff1a;如何在ubuntu上搭建minio_ubuntu minio-CSDN博客文章浏览阅读2.9k次。本文主要介绍了在ubuntu服务器下部署minio的过程&#xff0c;以及如何通过客户端进行简单操作。_ubuntu miniohttps://blog.csdn.net/bDreamer/article/details/130161669 MinIO是一个…

单元测试、注解

目录 一、单元测试1.快速入门2.Junit在实际开发中的用法 二、注解1.注解概述2.自定义注解3.元注解4.解析注解 一、单元测试 单元测试就是针对最小的功能单元编写测试代码&#xff0c;Java程序最小的功能单元是方法。因此&#xff0c;单元测试就是针对Java方法的测试&#xff0…

【工具】huggingface 模型下载过程

前述 记录下自己下载模型的几种方式 方式 1、网页直接浏览器下载&#xff1a; 简单&#xff0c;但是随时可能断 2、git lfs # 拉代码 GIT_LFS_SKIP_SMUDGE1 git clone https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0 # 进入目录 cd stable-diffusion-…

学习笔记 ASP.NET Core Web API 8.0部署到iis

一.修改配置文件 修改Program.cs配置文件将 if (app.Environment.IsDevelopment()) {app.UseSwagger();app.UseSwaggerUI(); }修改为 app.UseSwagger(); app.UseSwaggerUI(); 二.安装ASP.NET Core Runtime 8.0.14 文件位置https://dotnet.microsoft.com/en-us/download/do…

【GPT入门】第23课 langchain serve介绍

【GPT入门】第23课 langchain serve介绍 1. langchain介绍2. 思路3.代码1. langchain介绍 langserve 是一个用于简化 LangChain 应用部署的工具,它可以将使用 LangChain 构建的链(chains)、代理(agents)等组件快速转化为 RESTful API 服务,下面从多个方面详细介绍它的作…

Docker--Docker 镜像制作

镜像制作的原因 镜像制作是因为官方镜像无法满足自身需求&#xff0c;从而需要自己制作&#xff0c;我们需要通过条件来进行满足需求&#xff1b; 在软件开发过程中&#xff0c;开发环境和生产环境的差异可能导致“在我的机器上可以运行”的问题。Docker镜像将应用程序及其依…