计算机图形学 | 实验十一:阴影计算

如何通过数理优化提升计算机图形学中的渲染效率 计算机图形学中的渲染效率一直是提升图形处理系统性能的重要议题。通过数理优化方法,结合先进的数学模型和算法,可以显著提升渲染效率,减少计算资源消耗,并为复杂场景的实时渲染提供支持。本文将探讨在计算机图形学中应用数理优化的核心技术、发展趋势以及经典案例,揭示如何通过这些方法提升渲染效率。 阅读详情

华中科技大学《计算机图形学》课程

MOOC地址:计算机图形学(HUST)

计算机图形学 | 实验十一:阴影计算

帧缓冲

创建一个帧缓冲

和OpenGL其他对象一样,我们使用glGenFramebuffers的函数来创建一个帧缓冲对象:

unsigned int fbo; 
glGenFramebuffers(1, &fbo);
在这里插入代码片

它的使用函数也和其它的对象类似。首先我们创建一个帧缓冲对象,将它绑定为激活的(Active)帧缓冲,做一些操作,之后解绑帧缓冲。我们使用glBindFramebuffer来绑定帧缓冲。

glBindFramebuffer(GL_FRAMEBUFFER, fbo);

在完成上面的操作后,我们还是不能直接使用帧缓冲,因为一个完整的帧缓冲至少需要满足以下条件:

  • 附加至少一个缓冲(颜色、深度或模板缓冲)。
  • 至少有一个附件(Attachment)。
  • 所有的附件都必须是完整的(保留了内存)。

由于我们的帧缓冲不是默认帧缓冲,渲染指令将不会对窗口的视觉输出有任何影响。出于这个原因,渲染到一个不同的帧缓冲被叫做离屏渲染(Off-screen Rendering)。要保证所有的渲染操作在主窗口中有视觉效果,我们需要再次激活默认帧缓冲,将它绑定到0:

glBindFramebuffer(GL_FRAMEBUFFER, fbo);

当然,在完成所有的帧缓冲操作之后,不要忘记删除这个帧缓冲对象:

glDeleteFramebuffers(1, &fbo);

纹理附件

当把一个纹理附加到帧缓冲的时候,所有的渲染指令将会写入到这个纹理中,就想它是一个普通的颜色/深度或模板缓冲一样。使用纹理的优点是,所有渲染操作的结果将会被储存在一个纹理图像中,我们之后可以在着色器中很方便地使用它。

为帧缓冲创建一个纹理和创建一个普通的纹理步骤类似:

unsigned int texture; 
glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

创建好纹理后,接下来我们把它附加到帧缓冲上:

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

glFrameBufferTexture2D有以下的参数:

  • target:帧缓冲的目标(绘制、读取或者两者皆有)
  • attachment:我们想要附加的附件类型。当前我们正在附加一个颜色附件。注意最后的0意味着我们可以附加多个颜色附件。如ATTACHMENT1,2…
  • textarget:你希望附加的纹理类型
  • texture:要附加的纹理本身
  • level:多级渐远纹理的级别。我们将它保留为0。

除了颜色附件之外,我们还可以附加一个深度和模板缓冲纹理到帧缓冲对象中。要附加深度缓冲的话,我们将附件类型设置为GL_DEPTH_ATTACHMENT。注意纹理的格式(Format)和内部格式(Internalformat)类型将变为GL_DEPTH_COMPONENT,来反映深度缓冲的储存格式。要附加模板缓冲的话,你要将第二个参数设置为GL_STENCIL_ATTACHMENT,并将纹理的格式设定为GL_STENCIL_INDEX。

渲染缓冲对象附件

渲染缓冲对象(Renderbuffer Object)是在纹理之后引入到OpenGL中,作为一个可用的帧缓冲附件类型的,所以在过去纹理是唯一可用的附件。和纹理图像一样,渲染缓冲对象是一个真正的缓冲,即一系列的字节、整数、像素等。渲染缓冲对象附加的好处是,它会将数据储存为OpenGL原生的渲染格式,它是为离屏渲染到帧缓冲优化过的。

创建一个渲染缓冲对象和帧缓冲类似:

unsigned int rbo;
glGenRenderbuffers(1, &rbo);

绑定操作:

glBindRenderbuffer(GL_RENDERBUFFER, rbo);

由于渲染缓冲对象通常都是只写的,它们会经常用于深度和模板附件,因为大部分时间我们都不需要从深度和模板缓冲中读取值,只关心深度和模板测试。我们需要深度和模板值用于测试,但不需要对它们进行采样,所以渲染缓冲对象非常适合它们。当我们不需要从这些缓冲中采样的时候,通常都会选择渲染缓冲对象,因为它会更优化一点。

创建一个深度和模板渲染缓冲对象可以通过调用glRenderbufferStorage函数来完成:

glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 600);

GL_DEPTH24_STENCIL8作为内部格式,它封装了24位的深度和8位的模板缓冲。

最后附加这个渲染缓冲对象:

glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);

总结

在了解帧缓冲原理后,我们将会将场景渲染到一个附加到帧缓冲对象上的颜色纹理中,之后将在一个横跨整个屏幕的四边形上绘制这个纹理。我们将在第二部分的阴影实验中用到,接下来简单介绍下这个步骤:

  1. 创建并绑定一个帧缓冲;
  2. 创建一个纹理图像并把它作为附件绑定到帧缓冲上;
  3. 将纹理附件(或渲染对象附件)附加到帧缓冲上;
  4. 检查帧缓冲是否完整(检测是否出现异常);
  5. 在帧缓冲上进行绘制;
  6. 解绑 && 删除工作;

阴影映射

算法思想

阴影映射(Shadow Mapping)背后的思路非常简单:具体过程是我们从光源视角出发(以光源所在位置作为摄像机位置),绘制一条射线到达场景上各个片元,得到射线第一次击中的那个物体,然后用这个最近点和射线上其他点进行对比。然后我们将测试一下看看射线上的其他点是否比最近点更远,如果是的话,这个点就在阴影中。我们使用深度缓冲来实现阴影。

深度缓冲里的一个值是摄像机视角下,对应于一个片元的一个0到1之间的深度值。我们从光源的透视图来渲染场景,并把深度值的结果储存到纹理中。通过这种方式,我们就能对光源的透视图所见的最近的深度值进行采样。最终,深度值就会显示从光源的透视图下见到的第一个片元了。我们管储存在纹理中的所有这些深度值,叫做深度贴图(depth map)或阴影贴图。

深度贴图

第一步我们需要生成一张深度贴图(Depth Map)。深度贴图是从光的透视图里渲染的深度纹理,用它计算阴影。因为我们需要将场景的渲染结果储存到一个纹理中,因此需要用到帧缓冲。按照第一节的帧缓冲使用步骤来使用:

首先,我们要为渲染的深度贴图创建一个帧缓冲对象:

GLuint depthMapFBO;
glGenFramebuffers(1, &depthMapFBO);

创建一个2D纹理,提供给帧缓冲的深度缓冲使用:

const GLuint SHADOW_WIDTH = 1024, SHADOW_HEIGHT = 1024;
GLuint depthMap;
glGenTextures(1, &depthMap); 
glBindTexture(GL_TEXTURE_2D, depthMap); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT,SHADOW_WIDTH, SHADOW_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

我们只关心深度值,我们要把纹理格式指定为GL_DEPTH_COMPONENT,1024是我们预先设置的深度贴图的解析度。

绑定帧缓冲,并将纹理附件附加到帧缓冲上:

glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthMap, 0); 
glDrawBuffer(GL_NONE); 
glReadBuffer(GL_NONE); 
glBindFramebuffer(GL_FRAMEBUFFER, 0);

我们需要的只是在从光的透视图下渲染场景的时候深度信息,所以颜色缓冲没有用。然而帧缓冲对象不是完全不包含颜色缓冲的,所以我们需要显式告诉OpenGL我们不适用任何颜色数据进行渲染。调用glDrawBuffer和glReadBuffer把读和绘制缓冲设置为GL_NONE来做这件事。

接下来我们渲染深度贴图,主要分为两个步骤:

  • 光源空间的变换
  • 渲染至深度贴图
  1. 光源空间的变换,这一部分的变换在着色器内完成
    本次实验我们使用的是一个所有光线都平行的定向光。出于这个原因,我们将为光源使用正交投影矩阵:
GLfloat near_plane = 1.0f, far_plane = 7.5f; 
glm::mat4 lightProjection = glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, near_plane, far_plane);

其次创建一个视图矩阵来变换每个物体,把它们变换到从光源视角可见的空间中,我们将使用glm::lookAt函数;这次从光源的位置看向场景中央:

glm::mat4 lightView = glm::lookAt(glm::vec(-2.0f, 4.0f, -1.0f), glm::vec3(0.0f), glm::vec3(1.0));

二者相结合为我们提供了一个光空间的变换矩阵,它将每个世界空间坐标变换到光源处所见到的那个空间:

glm::mat4 lightSpaceMatrix = lightProjection * lightView;
  1. 进行一次渲染,形成深度贴图
// 渲染阴影深度贴图
glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); 
glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT); 
glClear(GL_DEPTH_BUFFER_BIT); 
shadowMap_shader.Use(); 
shadowMap_shader.SetMat4("lightPV", lightPV); 
DrawScene(shadowMap_shader, current_frame); 
glBindFramebuffer(GL_FRAMEBUFFER, 0);

此时顶点着色器内容即为(1)中的空间变换,而片段着色器则什么也不做,如下所示:

void main()
{
	// gl_FragDepth = gl_FragCoord.z;
}

因为其内置变量gl_FragDepth会自动更新深度信息。

在光的透视图视角下,很完美地用每个可见片元的最近深度填充了深度缓冲。通过将这个纹理投射到一个2D四边形上,就能在屏幕上显示出来,显示结果如下:

在这里插入图片描述

渲染阴影

生成深度贴图以后我们就可以开始生成阴影了。这段代码在像素着色器中执行,用来检验一个片元是否在阴影之中,不过我们在顶点着色器中进行光空间的变换:

void main()
{
	//... 
	LightSpaceFragPos = lightPV * vec4(FragPos, 1.0f);
	gl_Position = projection * view * vec4(FragPos, 1.0f);
	//...
}

LightSpaceFragPos这个输出向量。我们用同一个lightSpaceMatrix,把世界空间顶点位置转换为光空间,将这个输出给片段着色器,进行深度的比较。

像素着色器使用Blinn-Phong光照模型渲染场景。我们接着计算出一个shadow值,当fragment在阴影中时是1.0,在阴影外是0.0。

计算阴影:

float ShadowCalculation(vec4 fragPosLightSpace) 
{
	vec3 projCoords = fragPosLightSpace.xyz /fragPosLightSpace.w;
	projCoords = projCoords * 0.5 + 0.5;
	// 光的位置视野下最近的深度
	float closestDepth = texture(depthMap, projCoords.xy).r;
	// 片元的当前深度
	float currentDepth = projCoords.z;
	// 阴影偏移,防止阴影失真
	float bias = 0.005;
	float shadow = currentDepth - bias > closestDepth ? 1.0 : 0.0;
	return shadow;
}

上面即为片段着色器的相关代码,在计算阴影中我们要注意几个问题:

  1. 顶点着色器输出一个裁切空间顶点位置到gl_Position时,OpenGL自动进行一个透视除法,将裁切空间坐标的范围-w到w转为-1到1,这要将x、y、z元素除以向量的w元素来实现。由于裁切空间的FragPosLightSpace并不会通过gl_Position传到像素着色器里,我们必须自己做透视除法。
vec3 projCoords = fragPosLightSpace.xyz / fragPosLightSpace.w;

来自深度贴图的深度在0到1的范围,我们也打算使用projCoords从深度贴图中去采样,所以我们将NDC坐标变换为0到1的范围:

projCoords = projCoords * 0.5 + 0.5;

在渲染阴影时,很容易出现阴影失真的问题,表现为交替黑线,形成原因如下:

在这里插入图片描述

阴影贴图受限于解析度,在距离光源比较远的情况下,多个片元可能从深度贴图的同一个值中去采样。图片每个斜坡代表深度贴图一个单独的纹理像素。你可以看到,多个片元从同一个深度值进行采样。

当光源以一个角度朝向表面的时候就会出问题,这种情况下深度贴图也是从一个角度下进行渲染的。多个片元就会从同一个斜坡的深度纹理像素中采样,有些在地板上面,有些在地板下面;这样我们所得到的阴影就有了差异。因为这个,有些片元被认为是在阴影之中,有些不在,由此产生该现象。

在这里插入图片描述

这时,我们用一个叫做阴影偏移(shadow bias)的技巧来解决这个问题,我们简单的对表面的深度(或深度贴图)应用一个偏移量,这样片元就不会被错误地认为在表面之下了:

float bias = 0.005;
float shadow = currentDepth - bias > closestDepth ? 1.0 : 0.0;

抗锯齿

如果你放大看阴影,在阴影映射边缘你可以看到很明显的锯齿:

在这里插入图片描述

因为深度贴图有一个固定的解析度,多个片元对应于一个纹理像素。结果就是多个片元会从深度贴图的同一个深度值进行采样,这几个片元便得到的是同一个阴影,这就会产生锯齿边;

可以通过增加解析度来降低锯齿。

另一个(并不完整的)解决方案叫做PCF(percentage-closer filtering),这是一种多个不同过滤方式的组合,它产生柔和阴影,使它们出现更少的锯齿块和硬边。核心思想是从深度贴图中多次采样,每一次采样的纹理坐标都稍有不同。每个独立的样本可能在也可能不再阴影中。所有的次生结果接着结合在一起,进行平均化,我们就得到了柔和阴影。

float shadow = 0.0; 
vec2 texelSize = 1.0 / textureSize(shadowMap, 0); 
for(int x = -1; x <= 1; ++x)
{
	for(int y = -1; y <= 1; ++y)
	{
		float pcfDepth = texture(shadowMap, projCoords.xy + vec2(x, y) * texelSize).r; 
		shadow += currentDepth - bias > pcfDepth ? 1.0 : 0.0;
	}
}
shadow /= 9.0;

PCF使用后效果如图:

在这里插入图片描述

assimp库

引擎开发五: Assimp库及使用

Assimp的安装编译及使用过程全纪录(VS2015)(适合菜鸟看的超详细记录)

error LNK2019: 无法解析的外部符号 _stbi_load,该符号在函数 _main 中被引用

结果

在这里插入图片描述

研究生计算机图形学课程PPT详解 本文还有配套的精品资源,点击获取 简介:计算机图形学是研究图像在计算机系统中生成、处理和显示的学科,广泛应用于游戏开发、电影特效等领域。本课程旨在深入讲解计算机图形学的基本原理和高级技术,包括二维和三维图像处理、图形绘制算法、光照与阴影、颜色理论、图形管线、动画与物理模拟、图形用户界面设计以及实时与离线渲染的区别。通过系统学习,学生将掌握核心技能,为未来研究和工作奠定基础。... 阅读详情

相关推荐

长鑫存储面试真题解析:DRAM工程师的工程直觉与产线思维

DRAM作为现代计算系统的底层存储基石,其性能与可靠性高度依赖半导体物理基础、工艺窗口控制和电路-系统协同设计。理解电荷保持机制、位线电容耦合效应、信号完整性约束等核心原理,是突破传统数字IC思维、构建真实产线语感的关键。在晶圆厂级工程实践中,TEM缺陷识别、BIST空间聚类分析、Retention失效定位等能力,直接关联良率爬坡与客户系统稳定性。本文聚焦长鑫存储一线技术面试中高频出现的工艺-电路-测试三维问题,融合‘电荷保持’‘信号完整性’等热词,还原DRAM工程师必备的系统性建模能力与闭环验证思维,覆盖

weixin_34293246的博客 337

Unity-Shader-动态阴影(上) 投影的矩阵变换过程

【旧博客转移 - 2017年1月20日 01:20】 前面的话 最近很长时间没写博文了,一是太忙 ( lan ) 了,二是这段时间又领悟了一些东西,脑子里很混乱,不知道从何写起。但感觉不能再拖延下去了,来不及解释了,快上车(一脸滑稽) 目前我在做一款3D二次元动作游戏,后面可能会用到动态阴影,有的人可能会直接找一个插件分分钟就把阴影做出来了,这样做当然可以,但自己不去熟悉一下底层...

552

ESP32-IDF HTTP服务器实战:从零搭建Web控制界面

本文详细介绍了如何在ESP32平台上使用ESP-IDF框架从零搭建HTTP服务器,并创建Web控制界面。内容涵盖环境配置、服务器基础设置、Web页面处理、GPIO控制接口实现及AJAX异步请求处理,帮助开发者快速掌握物联网设备Web控制开发。

efc123456的博客 1063

计算机图形学【GAMES-101】6、阴影映射(Shadow Mapping)

之前计算着色的时候,并没有考虑遮挡,即有可能着色点跟光源之间会有别的物体或者是自身的某个部位遮挡住光线,这种情况下应该有阴影产生 ShadowMapping特点 (1)在图像空间中计算的,即生成阴影时不需要场景的几何信息 (2)会产生走样现象 (3)只能生成点光源的阴影(硬阴影) 阴影映射的思想 -不在阴影里:能被光源和摄像机同时看道 -在阴影里:能被相机看到,但不能被光源看到 生成过

记录值得记录的东西 2344

S7-1200模拟量

将两种不同的金属或合金金属焊接起来,构成一个闭合回路,利用温差电动势来测量温度,当两端存在温度梯度时,回路中就会有电流通过,此时两端之间就存在电动势--热电动势,这就是所谓的塞贝克效应(seebeck effect)。温差越大,热电动势越高。热电偶是有正负极性的,所以需要确保导线连接到正确的极性,否则会造成明显的测量误差。为了使温度补偿达到最佳效果,必须将热电偶模块安装在温度稳定的环境中简述:两种金属,每一种金属随温度变化是不同的,出现温差--由俩金属构成的回路就会有电流经过,因此两端形成热电动势。

王阿妹小天才的博客 2594

《QGIS快速入门与应用基础》021:插件仓库 URL 获取与添加

详细介绍了在QGIS中添加第三方插件仓库的方法。首先强调必须从官方推荐、开源社区等可靠渠道获取插件仓库URL以确保安全性,并列出了4类可信获取渠道。文章分步骤讲解了URL添加流程,包括打开插件管理器设置面板、填写仓库信息、刷新缓存验证等操作。针对常见问题如URL格式错误、连接失败等提供了具体解决方案。最后总结指出,成功添加第三方仓库后即可直接搜索安装各类专业插件,从而扩展QGIS功能边界。全文注重实操指导,特别适合需要安装行业专用插件的QGIS用户参考。

LuckyHanMo的博客 467

【深圳大学计算机图形学】实验三 光照与阴影

这一行计算了相机坐标系的x轴向量 u,它表示相机右侧的方向。shadowMatrix[0][3], shadowMatrix[1][3], shadowMatrix[2][3], shadowMatrix[3][3]:这一行代表阴影坐标的齐次坐标系的W分量,通常不需要设置为0.0。shadowMatrix[0][3], shadowMatrix[1][3], shadowMatrix[2][3] 和 shadowMatrix[3][3] 通常根据坐标变换的需求设置,它们会影响坐标的平移。

归忆_AC的博客 6360

halcon3d点云补全方法

属于halcon实例中的内容,后面还接了一部分的匹配

Tianwen_running的博客 1232

OpenGL超级宝典笔记——阴影

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34163553的博客 582

使用modelscope加载报错:ImportError: cannot import name ‘AutoTokenizer’ from ‘modelscope’...如何解决?| 提供多种解决方案

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1245

效果炸裂_安装midscene_copw基于midscene操作电脑_基于视觉的软件测试执行_MIDSCENE的安装和使用---AI大模型应用探索0012

摘要:本文介绍了如何通过安装MidSceneJS来增强Copaw的屏幕操作能力。首先需要安装Node.js和npm,并配置淘宝镜像源加速安装。然后全局安装MidScene CLI工具(npm install @midscene/cli -g)。接着配置视觉大模型服务,通过设置环境变量指定模型API密钥、名称、基础URL和家族类型(如qwen3.5-27b),配置文件需存放在C:\Users\Administrator.copaw目录。安装成功后,MidScene已能成功识别并操作屏幕,使用效果良好。文中还提

添柴程序猿的专栏 644

OpenGL: 平面阴影投射矩阵的推导

OpenGL: 平面阴影投射矩阵的推导

danshiming的博客 416

YOLOv13改进策略【Head】| 引入RT-DETR中的RTDETRDecoder,替换检测头

本文记录的是基于RTDETRDecoder模块的YOLOv13目标检测改进方法研究。RT-DETR的模块通过,能为解码器提供高质量的初始,从而。相比v13原始的检测头,RT-DETR能,替换后能够更好的提高模型性能。

Limiiiing的博客 434

计算机图形学

计算机图形学

ProgramNovice的博客 662

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

定积分在计算机图形学中的未来趋势

1.背景介绍 定积分在计算机图形学中的应用非常广泛,尤其是在计算光线的轨迹、计算物体的阴影、计算光照的分布等方面,都需要使用到定积分的计算。随着计算机图形学的不断发展,定积分的应用也不断拓展,其中包括但不限于: 光线追踪:光线追踪是一种用于计算图像的渲染技术,它通过计算光线从光源到像素点的道路来得到图像的颜色和亮度。定积分在光线追踪中用于计算光线在物体表面的交叉面积,从而得到光线的散射和吸收...

AI天才研究院 917

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

计算机图形学的数学基础与应用

1.背景介绍 计算机图形学是一门研究如何在计算机屏幕上生成图像的学科。它涉及到许多数学领域,包括线性代数、几何、数值分析、概率论和统计学等。计算机图形学的主要应用领域包括游戏开发、电影制作、机器人控制、虚拟现实等。 本文将从以下六个方面进行阐述: 背景介绍 核心概念与联系 核心算法原理和具体操作步骤以及数学模型公式详细讲解 具体代码实例和详细解释说明 未来发展趋势与挑战 附录常见问题与解答...

AI天才研究院 1271

Camera2Demo

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

计算机图形学真实感显示代码,计算机图形学实验 - 真实感图形场景的生成

《计算机图形学实验 - 真实感图形场景的生成》由会员分享,可在线阅读,更多相关《计算机图形学实验 - 真实感图形场景的生成(4页珍藏版)》请在人人文库网上搜索。1、计算机图形学实验 - 真实感图形场景的生成实验四 真实感图形的生成 一、 实验内容 ? ? ? ? 创建一个简单场景 场景中有一个复杂的三维几何体 通过一系列处理使得场景和几何体具有真实感 可以通过变换视点观察场景 二、 程序结构 创建...

weixin_35514865的博客 1007

计算机图形学:实验三 光照与阴影

计算机图形学:实验三 光照与阴影。1.掌握OpenGL三维场景的读取与绘制方法,理解光照和物体材质对渲染结果的影响,强化场景坐标系转换过程中常见矩阵的计算方法,熟悉阴影的绘制方法。 2.创建OpenGL绘制窗口,读入三维场景文件并绘制。 3.设置相机并添加交互,实现从不同位置/角度、以正交或透视投影方式观察场景。 4.实现Phong光照效果和物体材质效果。

gyeolhada的博客 1024

计算机图形学的革命:从2D到3D

1.背景介绍 计算机图形学是一门研究如何在计算机屏幕上生成图像的学科。从其出现以来,计算机图形学经历了两次革命性的变革:从2D到3D,以及从矢量图形到位置 Independent Bitmap Images(Pixels)。这篇文章将深入探讨从2D到3D的革命,揭示其背后的核心概念、算法原理、数学模型以及代码实例。 1.1 2D图形学的基本概念 在2D图形学中,图像是由几何形状(如线段、圆形...

AI天才研究院 1750

如何在计算机图形学中遵循无免费午餐定理

1.背景介绍 计算机图形学是一门研究如何在计算机上创建、表示、处理和显示图形信息的学科。它涉及到许多领域,包括计算机视觉、计算机辅机、计算机模型、图形模型、图形渲染、图形动画、人工智能等。在这些领域中,许多问题都可以用算法来解决,但是为了获得更好的性能和效果,需要遵循一些原则和定理。 无免费午餐定理是计算机图形学中一个重要的原则,它指出在设计和实现算法时,不能盲目追求性能和效果的提高,因为这可...

AI天才研究院 906

探索计算机图形学的挑战:实时渲染与高质量图像

1.背景介绍 计算机图形学是一门研究如何在计算机上创建、表示、处理和显示图形内容的学科。它涉及到许多领域,包括计算机图形学、计算机视觉、人工智能、物理学、数学等。计算机图形学的一个重要应用领域是实时渲染,即在实时的速度和性能要求下生成高质量的图像。这篇文章将探讨计算机图形学在实时渲染领域的挑战和发展趋势。 2.核心概念与联系 在计算机图形学中,渲染是将3D模型转换为2D图像的过程。实时渲染则...

AI天才研究院 940

2024-2025-1 山东大学《计算机图形学》期末(回忆版)

2024-2025-1 山东大学《计算机图形学》期末(回忆版)

前人栽树,后人乘凉。 3084

探索计算机图形学的未来:最新趋势和技术

1.背景介绍 计算机图形学是一门研究如何在计算机屏幕上生成图像的学科。它广泛应用于游戏、电影、虚拟现实、机器人等领域。随着技术的不断发展,计算机图形学的技术也在不断进步。本文将探讨计算机图形学的未来趋势和技术,为读者提供深入的见解。 2. 核心概念与联系 计算机图形学涉及到许多核心概念,如图像渲染、几何处理、光线追踪、物理模拟等。这些概念之间存在密切的联系,互相影响和完善。在本节中,我们将详...

AI天才研究院 868

计算机图形学入门18:阴影映射

计算机图形学入门,Shadow Mapping

YanisWu的博客 1552

3D模型中的计算机图形学原理

3D模型中的计算机图形学原理 在计算机的发展过程中,图形的表示从需要在显示器上画一条直线段开始,进而需要画一条曲线,再划出2D几何形状、再到画出复杂的3D几何。这一系列的发展也引出计算机图形的划时代发展,下面详细讲解一下图形在计算机中的表示方法。 图形的表示也是符合一般自然科学的发展路线,同样是从最简单的图形入手。首先是直线段、接着曲线段,有了这两种的表示方法,就可以在计算机上画出简单的平面的图像。画了平面图像就会想到画3D立体的图像。3D图像的由曲面组成。那么相应地就衍生出表示曲面的数学模型。 图形学中对

feiyuezouni的博客 2385
上一篇: 计算机图形学 | 实验十:几何纹理(法线贴图)
下一篇: Leetcode452. 用最少数量的箭引爆气球
UestcXiye
博客等级 码龄8年 9032粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值