写在篇前的话
作为一个曾经在代码堆里面苦苦挣扎的萌新,困惑的事情在于库,各种依赖,包换文件,链接库,纠结于代码的作用意义。尤其在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个文件,分别是:
着色器小程序(zprograms):3.1.light_cube.fs;3.1.light_cube.vs;3.1.light_cube.fs;3.1.light_cube.vs。其中,.fs文件是片段着色器小程序,.vs文件是顶点着色器小程序。在后文,我们会一个一个讲解它们内部的源码以及相互之间的关系。
头文件:camera.h;shader_m.h;stb_image.h。这三个头文件,我们将一个一个讲明他们的来历和作用。
源文件,程序主体文件:materials.cpp。该文件,将是本文描述的重点
程序配置文件: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" />