电脑图像

计算机图形学研究人员和程序员的问答

3
现代游戏引擎中软件栅格化的用途是什么?
我本季度要参加计算机图形学课程。我们的实验室项目之一是软件光栅化。 现在,我正在计划项目建议书,并在考虑如何使它在当代游戏开发中对其他人有用。 经过短暂搜索后,我学习了一种称为“软件遮挡剔除”的技术。它对各种分辨率的缓冲区进行软件光栅化。我们可以使用分层z缓冲区查询遮挡。 我的问题:除了软件遮挡剔除之外,现代游戏引擎中的软件栅格化还有哪些用途?
9 rendering 

2
可靠测试两条贝塞尔曲线的交点
如何可靠地确定两条平面贝塞尔曲线是否相交?“可靠”是指测试仅在曲线相交时回答“是”,而在曲线不相交时回答“否”。我不需要知道在哪里找到交集的参数。我还想在实现中使用浮点数。 我在StackOverflow上找到了几个答案,这些答案使用曲线的边界框进行测试:这不是我想要的,因为即使曲线不相交,此类测试也可能报告相交。 到目前为止,我找到的最接近的东西是Sederberg和Meyers 的“ 边界楔 ”,但“仅”区分最多一个和两个或更多的交叉,而我想知道是否最多为零和一个或多个交叉路口。

2
如何处理光谱渲染?
是否所有光谱渲染都作为模拟处理?是否有专门针对“消费者”渲染的技术,例如用于实时甚至只是“逼真的外观而无需解决完整的物理方程式”? 我想了解我们如何处理频谱效果的渲染。似乎光子需要描述为一定范围的波长,并且与表面的入射或者 替换原始光,并在整个光谱函数中解析多个新光子,每个光子都有自己的新矢量 在给定阈值的情况下,保持原始(或略微修改)的光子 我希望指出现有工作的方向,但希望对此主题进行任何着色。

1
连接两个点而不与先前绘制的曲线段相交的策略
我必须连接没有交叉点的点对。假设我有两个给定的点与一条曲线段相连。然后,再次选择两个新的端点,并且这些新点也必须连接,但是对于任何数量的给定点对,它们都不得与先前绘制的曲线相交。 查找和绘制这些曲线段的最简单方法是什么?
9 algorithm 

1
球面相交遮挡(用于混合光线跟踪)
考虑混合光线跟踪,因此存在以下问题: 假设我有两个实心球和s 2。我们知道它们的中心和半径,并且我们知道它们在空间上有一些重叠的体积。s1个s1个s_1s2s2s_2 我们有一个典型的3D图形设置:假设眼睛在原点,我们在投影领域到视平面一些积极˚F。球体不在视平面内并且不相交。ž= fž=Fz = fFFf 令为空间中的圆,它是两个球体表面上的点,即它们的重叠体积的可见(从某些角度)“连接”。CCc 我想计算将投影到我们的视平面时是否可见。如果s 1或s 2完全成为障碍,则可能不是。CCcs1个s1个s_1s2s2s_2 有什么想法可以解决吗?

1
在GPU上使用查找表时的最佳内存访问?
我正在为单身汉的项目探索GPU上的等值面算法(特别是仅关注二进制输入/输出体素数据,而不是实值字段)。因此,我有一个良好的旧行军多维数据集的CPU实现,并在OpenFrameworks中运行,现在处于尝试将其移植到GLSL计算着色器的阶段,并在下潜之前考虑了陷阱。我只写了vert和frag着色器在此之前,这对我来说都是全新的。 我的第一个问题是如何有效地在工作组中的数十个或数百个线程中使用查找表?我了解GPU可以为不同的任务提供不同类型的内存,但不能完全确定每个GPU的工作方式或使用哪种类型。 Paul Bourke的经典copypasta表是256 * 16的数组,因此,如果使用标量字节类型,则可以将其打包为4kb纹理或SSBO。 问题是,如何阻止不同的线程相互跳闸?每个工作组中的许多多维数据集都可能具有相同的配置,因此尝试同时访问缓冲区中的相同位置。有解决方法或优化来解决吗?

1
现代的显示列表等效项是什么?
显示列表是OpenGL的一项功能,从理论上讲,可以通过存储一组命令供以后使用来加速API的任何部分。以我的理解,就当前减少驱动程序开销的努力而言,这很有意义。 虽然在3.1版中不推荐使用显示列表。现代API的等效功能是什么,DirectX是否提供类似的功能?如果再也没有这样的功能,那么原理是什么?

2
从根本上讲,二维位图是如何渲染的?
假设我们有一台64位的可字寻址的计算机,我们想对其进行编程,以将存储为二进制图像位图(例如下面的一个)的5x7字符输出到内存映射的显示器。 由于每个字符有5 x 7 = 35像素,因此我们可以在单个单词中使用35位存储字符。最低有效位从单词的左侧开始,并且图像中的每个像素由第n位表示,如上所示,数字“ 3”将在内存中存储为:011101000100001001100000100011000101110,后跟29个未使用位设置为0。 这是在旧/现代计算机中存储字符的方式吗?还是每个像素使用单个字节/字? 如果以这种方式存储它们,汇编/机器代码中的例程(仅使用基本指令,例如计算机指令集体系结构中的位,算术和数据传输操作)将用来将这些数据转换为图像显示器是什么样的?会是这样吗? 将要更新的当前像素的x和y显示坐标存储在某个寄存器中。 将两个选定的RGB值(在这种情况下,绿色为0,255,0,黑色为0,0,0)存储在其他两个单独的寄存器中。 还有两个寄存器用作初始化为5和7的计数器,以跟踪正在渲染的图像的当前行和列。 测试列寄存器是否不为0。如果不是,则测试位图的LSB是否设置为1,然后根据结果将相应的RGB值寄存器与x和y坐标寄存器进行“与”运算,然后对结果进行MOV到显示输出寄存器。 将行计数器寄存器减1,测试是否为0。如果为0,则将其设置回5,并将y坐标增加1,并将列计数器减少1。 将持有位图的寄存器向左移动1位。 JMP到指令4。 有没有更简单或更有效的方法来做到这一点?看起来像渲染单个小文本字符这样的简单操作也需要大量的操作,并且大约需要200个CPU周期。 最后,在机器级代码方面是否有任何不错的书籍或资源可用于从头开始显示图像,因为我找不到任何东西,因为它们掩盖了这个特定主题,或者代码是用高级语言编写的,或者是使用宏的汇编程序,所有这些都是“作弊的”,并且没有说明最低层的基本情况。


1
我如何检查流体模拟结果的正确性?
我写了一个基于粒子的流体模拟程序。很难判断我是否得到正确的结果。可视化的结果似乎是合理的,但其中的某些部分看起来很奇怪。我不知道这是流体的特征。有什么准确的方法可以验证我的程序是否正确? 修改一些细节: 我的程序是一个基于2D粒子的模拟程序。流体是可压缩的。该实现几乎基于经典论文: Müller,Matthias,David Charypar和Markus Gross。“用于交互式应用程序的基于粒子的流体模拟。” 2003 ACM SIGGRAPH会议论文集 我用迭代法求解了Navier-Stokes方程。它仅考虑压力,重力,粘度和表面张力。

1
使用所有可用的纹理单位是否是一种好习惯?
当将多个纹理应用于网格时(例如凹凸贴图),我通常将纹理绑定到前几个固定纹理单元,例如:diffuse = unit 0,bump = unit 1,specular = unit 2,然后继续将其重复使用具有不同纹理的不同网格。但是我一直想知道为什么glActiveTexture支持这么多的纹理单位(在上一个链接中,它至少说80个)。 因此,我想到管理纹理的一种可能方法是将不同的纹理绑定到每个可用的单元,并使它们保持启用状态,只是更新统一采样器索引。通过减少纹理开关的数量,可以提高渲染性能。如果纹理的数量少于最大纹理单位,则无需解绑纹理。 这是实时OpenGL应用程序的标准做法吗(我相信这也适用于D3D)?采用这种方法是否会对性能产生不明显的影响?可能是内存开销?
9 opengl  texture 

1
WebGL全向阴影映射问题
首先,我想说的是,我已经阅读了很多有关使用深度图和立方体贴图进行阴影贴图的文章,我了解它们是如何工作的,并且我在使用OpenGL时也有使用它们的工作经验,但是,实现时遇到了问题全向阴影贴图技术在我的3D图形引擎“ EZ3”中使用单点光源。我的引擎使用WebGL作为3D图形API,并使用JavaScript作为编程语言,这是我的计算机科学学士学位论文的目的。 基本上,这就是我实现阴影贴图算法的方式,但是我只关注点光源的情况,因为有了它们,我可以归档全向阴影贴图。 首先,我像这样积极进行正面剔除: if (this.state.faceCulling !== Material.FRONT) { if (this.state.faceCulling === Material.NONE) gl.enable(gl.CULL_FACE); gl.cullFace(gl.FRONT); this.state.faceCulling = Material.FRONT; } 其次,我创建一个深度程序以记录每个立方体贴图面的深度值,这是我在GLSL 1.0中的深度程序代码: 顶点着色器: precision highp float; attribute vec3 position; uniform mat4 uModelView; uniform mat4 uProjection; void main() { gl_Position = uProjection * uModelView * vec4(position, 1.0); } 片段着色器: precision highp float; …

1
非均匀有理B样条(NURBS)基础
我试图理解NURBS曲线(稍后再说!),但是在理解其内部工作原理时遇到了一些麻烦。有人可以向我解释几件事吗?正如我从贝塞尔曲线得出的那样,将两者进行比较特别有用。 在“理性的基础功能”的样子(理性)贝塞尔曲线的伯恩斯坦多项式一点点。参数是否u也从0变为1? 如何“添加细节”到曲线?我的意思是,如果我需要描述一个更复杂的形状,那么我将简单地将多个Beziers“缝合”在一起。或较少地,增加程度。我知道我也可以增加NURBS的度数,并排放置多个NURBS曲线,但是这应该怎么做? 至少对我来说,维基百科的文章对这种“结矢量”似乎不太清楚。到底是什么
9 nurbs 

1
前向渲染和延迟渲染之间的性能折衷是什么?
正向渲染是直接根据输入的几何形状和照明信息计算表面碎片的辐射值的过程。延迟渲染将该过程分为两个步骤:首先生成一个包含空间属性的屏幕空间缓冲区(包含通过光栅​​化输入几何图形而构建的材质属性)(几何缓冲区或G缓冲区),其次通过组合G-缓冲带照明信息。 延迟渲染通常是对正向渲染的优化。一种解释是,照明是相当昂贵的,并且如果您有任何透支,那么您将照明屏幕上永远不会看到的像素,而如果将材质属性存储到G缓冲区中,然后再照明,则您将仅照明将要显示的像素。实际上出现在屏幕上。假设您还可以进行深度预传递,然后再将深度测试设置为D3D11_COMPARISON_EQUAL或GL_EQUAL等效,则进行正向渲染传递,这实际上是递延的优势吗? 延迟渲染还可以在GPU上更好地进行调度。将一个较大的翘曲/波阵面拆分为一个较小的几何波阵面,然后再将较小的照明波阵面拆分,可以提高占用率(同时飞行中有更多的波阵面)。但是,最终还会占用更多带宽(将大量通道写到G缓冲区,然后在照明期间将它们读回)。显然,这里的细节在很大程度上取决于您的GPU,但是一般原则是什么? 在正向渲染和延迟渲染之间做出决定时,还有其他实际性能方面的考虑吗?(假设如有必要,我们可以使用每种技术的变体:即,我们也可以比较前向平铺和延迟的平铺。)

1
为什么会有多个高斯模糊?
应用多个高斯模糊可以产生与更强的高斯模糊等效的效果。 例如,这个问题说:做多个高斯模糊与做一个更大的模糊一样吗? Wikipedia也说了这一点,但是说在多次模糊中进行计算与一次模糊中进行计算总是一样多或更多。 对图像应用多个连续的高斯模糊与应用单个较大的高斯模糊具有相同的效果,后者的半径是实际应用的模糊半径的平方和的平方根。例如,由于\ sqrt {6 ^ 2 + 8 ^ 2} = 10,应用半径为6和8的连续高斯模糊与应用半径为10的单个高斯模糊可获得相同的结果。由于这种关系,处理时间无法通过用连续的较小的模糊模拟高斯模糊可以节省时间-所需的时间至少与执行单个较大的模糊一样长。 资料来源:https : //en.wikipedia.org/wiki/Gaussian_blur#Mechanics 但是,我听说过有关人们在实时图形中进行多次模糊以实现更强模糊效果的信息。 如果不减少计算量,会有什么好处?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.