Questions tagged «opengl»

对于涉及使用OpenGL图形库的问题。

2
导数图与切线空间法线图
我发现某些引擎使用导数贴图代替切线法线贴图。 经过一番阅读之后,替换切线空间法线似乎是一种很棒的方法,但是使用它们会不会有一些不利之处?为什么仍继续使用切线空间法线? 是否可以将优点和缺点进行比较?

1
着色器中的循环性能
我想知道在着色器中集成动态循环功能的最佳方法是什么? 首先,似乎动态数组是不可能的。因此,创建最大大小的数组并仅填充其中一部分或使用预定义的大小定义数组会更好吗? 那么,迭代此数组的最佳方法是什么? 使用展开循环或动态循环进行4到128次迭代比较好吗?我还看到有可能将其展开到最大的预定义迭代次数,然后使用诸如的条件将其停止if (i == myCurrentMaximumIterationNumber)。

1
更改着色器程序时是否需要重新绑定制服或属性?
渲染场景通常涉及多个着色器程序,在我的情况下,所有着色器程序都使用相同的属性,并且至少共享一些制服。为了使它们正常工作,我目前保持安全,这意味着我每次在着色器程序之间切换时都重新绑定属性并获得适当的统一位置。因此,基本上每个帧中都有多次,这可能不是最佳方法。 因此,在切换着色器程序之后,是否有必要(通常​​)重新绑定属性和制服?又为什么呢? 如果是这样,是否有办法在程序启动时执行一次,而不必再次触摸它们(设置统一值除外)?
11 opengl  glsl  shader 

4
我学习OpenGL还是Direct3D都重要吗?
这两个API之间的区别是否只是次要的实现细节,是否意味着一旦我学到了一个API,便可以将其用于所有内容?或者,如果我希望能够在将来使用它而不需要重新学习另一个API的情况下,有理由学习一个而不是另一个吗?是一般的还是其他的? 特别是我希望能够为任何图形卡编写代码,因此代码不仅限于仅在特定制造商的卡或特定型号上运行。我还希望能够编写在没有显卡的情况下仍然可以运行的代码(尽管速度较慢)。 可移植代码在不同平台(操作系统/体系结构)之间的可移植性是否有所不同?我对与之兼容的其他库的可用性以及是否在更广泛的环境中导致较少的许可限制感兴趣。任何可衡量的因素都会影响其中之一是否是我唯一学习而不限制我的知识。
11 opengl  api  direct3d 

2
是否可以通过模版测试找出有多少碎片?
我有一个OpenGL应用程序,该应用程序广泛使用模板测试来渲染不规则形状(有点像简单的2-D CSG)。如果我能找到通过模板测试并实际渲染的片段数量,这将有助于简化某些计算。具体来说,它可以让我免费确定渲染形状的面积,而不必稍后使用蒙特卡洛模拟对其进行近似。 我知道从几何着色器发出的图元也有类似的概念,称为变换反馈。我想知道片段和模板测试是否存在类似的概念。

1
修改纹理(在其上绘画)是否被视为“状态变化”?
图形中的约定是,执行较少的状态更改比执行较多的状态更改(切换着色器,绑定缓冲区,绑定纹理等)更好。对于纹理,使用单个地图集(用于渲染精灵/文本)渲染许多多边形要比为每个多边形单独绑定一个新纹理要快。 如果我不断通过绘制纹理,这是否成立glTexSubImage2D?我有(通过网络)传入的数据流经过处理,然后一次绘制成纹理。数据以无休止的滚动形式直观呈现。 我会不会更好地在一个大矩形上绘制一种纹理(将绘制的数据滚动到视图中)?这里的想法是,在我继续绘画的同时,在任何给定的时间绑定一个(或两个)纹理。 还是我应该绘制很多小矩形(仅在绘制完成后才显示矩形)?我假设我将为每个矩形绑定一个纹理。
11 opengl  texture 

2
有什么理由比OpenGL更喜欢Direct3D?
所以我读了这篇文章,我有点明白为什么Microsoft Windows上的游戏比任何其他OS都要多的原因。提出的主要问题是Direct3D优于OpenGL。 我不明白的是为什么任何开发人员都会牺牲兼容性?那简直是对公司的财务损失。我知道OpenGL有点混乱,但这对专家来说几乎不成问题。即使是这样,我认为人们会付出更多的努力,而不是蒙受金钱上的损失。 同样,如果我没有记错的话,那么很多跨平台应用程序都会同时使用Direct3D和OpenGL。我认为它们在API之间切换。 这很奇怪,因为他们只能使用OpenGL,为什么还要关心Direct3D? 所以问题是,OpenGL是否存在任何技术问题,或者Direct3D提供了OpenGL缺乏的任何支持? 我知道,这个问题可能因为话题太小或太宽泛而被关闭,我尽力缩小了范围。
11 opengl  direct3d 

2
如何将四边形投影为矩形?
tl; dr:射影几何中的数学问题:如何找到如下所示的投影的4x4相机矩阵,使得点A,B,C,D位于单位框的边缘某处(例如OpenGL归一化设备坐标),单位框的角沿EA,EB,EC,ED射线落在合理的位置? (这可能是单应性,透视性和/或归类的一种特殊情况。不熟悉术语。) 细化 给定视口内的四边形ABCD,我认为存在一个独特的(?)转换,可将其映射回矩形。如下图所示:视口中的四边形ABCD充当物理“窗口”,如果我们将其映射回矩形,它将显得失真。 (右边的方框代表NDC,我稍后再谈) 目的是快速获得右侧的图像。我们可以用光线跟踪每个点来获取图像(我已经完成了),但是我更喜欢使用OpenGL或其他投影技术,因为我想利用诸如混合,基元之类的东西。 第一次尝试 我相信我可以解决以下问题:找到3x4 相机矩阵,该矩阵在3空间(在左侧)中使3 + 1维均匀坐标,然后将其投影到2空间(在2维上)具有2 + 1维均匀坐标(在左侧)正确的)。可以使用直接线性变换来解决此问题,以获得摄像机矩阵Ba=0未知项a的方程组,并使用奇异值分解来求解该系统(SVD)。我将向量EA,EB,EC,ED(其中E是您的肉眼或世界空间中的相机)作为原像中的点,并将(0,0),(1,0),(1 ,1),(0,1)之类的东西作为后图像中​​的点,并且每对点都会给出一些线性方程式以插入SVD。生成的矩阵将映射EA->(0,0)等。(假设有足够的自由度,即,如果解决方案是唯一的,那么我不确定,请参见注释[a]。) 但是令我烦恼的是,这不是OpenGL的工作方式。OpenGL不会直接使用3x4矩阵将3d投影到2d。OpenGL需要“归一化设备坐标”(NDC),它们是三维点。投影到NDC之后,将绘制“单位”框中从(-1,-1,-1,1)到(1,1,1,1)的所有内容;外部的所有内容都会被裁剪(因为我们正在处理同质坐标:仅当(x / w,y / w,z / w的前三个坐标)时,任何点(x,y,z,w)才会显示在屏幕上,1)在-1至1)的单位框中。 因此,问题就变成了:是否存在某种合理的变换,可以将一些看起来怪异的长方体映射到均质坐标中(特别是在左侧绘制的长方体,其ABCD(前端)和A'B'C'D'(后端,隐藏)在前端后面))到单位立方体,例如使用4x4矩阵?怎么做? 我尝试过的 我已经尝试了一些更强大的方法:我使ABCD和A'B'C'D'看起来像是普通的锥体平截头圆锥体(例如gl平截头体)(即,在这种假设的设置中,左侧的图像只是在其上叠加了一个黑色矩形)而不是四边形),然后使用DLT /直接线性变换来求解所谓的4x4矩阵。但是,当我尝试它时,似乎没有足够的自由度...生成的4x4矩阵并未将每个输入向量映射到每个输出向量。在使用A,B,C,D,A'(5对转换前和转换后向量)时,我/几乎/得到了我想要的结果...这些向量已正确映射,但是例如B', C',D'映射到(3,3,1,1)而不是(-1,-1,1,1),并被OpenGL裁剪掉。如果我尝试添加第六点(用于投影4x4矩阵的6对点),我的解决方案似乎退化(零,无限)。我在这里要处理多少自由度,并且使用4x4矩阵映射我们知道和喜欢的4个向量(3 + 1维齐次坐标向量)是否有可能? 随意的小想法 我猜想不可能将任意长方体映射到具有4x4矩阵的任意长方体,尽管我很困惑,因为我认为可以使用2D中的某些矩阵在2d中将任何凸四边形映射到任何其他凸四边形。 ,例如,Photoshop?...不能/不能通过投影变换来完成吗?以及如何将其推广到3d?......同样,由于未能找到4x4矩阵,线性代数表示,在最佳情况下,我们不应该期望NxN矩阵将N个以上线性独立的点映射到N个目标点,但是我觉得这是同质的协调作弊这是因为存在一些隐藏的共线性吗?我猜不会? 另一个解决方案? 我猜可能还可以做以下丑事:使用典型的平截头体相机投影矩阵,找到与角对应的2D点,然后执行2D透视变形单应性,但是如果在渲染像素之后发生(例如photoshop),那么分辨率就会出现问题……也许假设可以找出一个矩阵在NDC空间内的XY平面上执行此转换,然后将其与基于普通视锥峰的矩阵组合起来? (注释[a]:自由度:如果需要的话,可以将ABCD进一步约束为作用在矩形上的投影变换的后图像...可以说是左侧的黑色矩形是投影相框剪贴画模型的结果)

1
制服的排列和申报顺序重要吗?
在部分6.4恒定的缓冲器本书的实用渲染和计算用的Direct3D 11(325页,326)中提到: 默认情况下,HLSL编译器将尝试对齐常量,以使它们不跨越多个float4寄存器。[...] HLSL常量缓冲区的打包也可以通过packoffset关键字手动指定。 我假设类似的规则将适用于OpenGL等效的统一缓冲区对象,因为它们映射到相同的硬件功能。 香草制服呢?宣布制服时适用哪些规则? uniform vec2 xy; // Can we expect the compiler to pack xy uniform vec2 zw; // into a same four component register? uniform vec2 rg; uniform float foo; // Will this prevent from packing rg and ba? uniform vec2 ba; // If so, will …


1
OpenGL GLSL-Sobel边缘检测过滤器
关于此主题,我已经在GLSL中成功实现了Sobel Edge Detection过滤器。这是过滤器的片段着色器代码: #version 330 core in vec2 TexCoords; out vec4 color; uniform sampler2D screenTexture; mat3 sx = mat3( 1.0, 2.0, 1.0, 0.0, 0.0, 0.0, -1.0, -2.0, -1.0 ); mat3 sy = mat3( 1.0, 0.0, -1.0, 2.0, 0.0, -2.0, 1.0, 0.0, -1.0 ); void main() { vec3 diffuse = texture(screenTexture, …

4
现代OpenGL有多个视口?
我使用SDL2。 目前,我唯一的着色器具有MVP矩阵,并使用该矩阵转换点。 我使用GLM计算摄像机的视图和投影矩阵: glm::lookAt(pos, pos + forward, up); glm::perspective(fov, aspectRatio, zNear, zFar); 我进行了搜索,但是我只能找到多个视口的旧版实现。 例如,如果我创建了4个摄像机,并且假设它们都相同,则除了每个摄像机要渲染的屏幕不同之外,其他的四分之一。(所以我想要4个视口具有相同的内容) 我怎样才能做到这一点?抱歉,如果我没有提供足够的信息,请随时提出。
9 opengl  glm 

1
扫描转换期间的样品间隙是多少?
在本教程中, 通常情况下,渲染共享边的三角形。OpenGL提供了保证,只要共享的边顶点位置相同,在扫描转换期间就不会有样本间隙。 1扫描转换期间的样品间隙到底是什么? 2在什么情况下会发生? 3当线穿过片段的中心时会发生吗?

1
在GPU上创建共享的顶点法线
我已经成功地将Marching Cubes的实现从CPU移植到了OpenGL计算着色器中,但是我还没有解决法线问题,并且想知道最好的解决方法。 我的实现专门处理二进制值字段(我正在尝试为尚没有距离估计器的3D分形函数建模),因此渐变和前向差分方法将不起作用。我有共享的顶点在工作,并且我的CPU实现使用此处描述的Quilez方法将面法线累积到每个相邻顶点上。 我可以将该实现移植到另一个着色器上,但是我看到的问题是需要大量的原子。由于我们只能在标量整数类型上使用原子,并且我无法想到一种以可加方式将3个有符号的int打包为1的方法,这意味着每个着色器调用3个轴* 3个顶点= 9个原子加法。它们当然会散布在整个内存中,所以这不像是击中单个原子计数器9次,但它看起来仍然像是个地狱。 另一种选择是针对每个多边形运行一个着色器调用,并构建人脸法线列表(我可能会以此方式打包到x10y10z10),然后每个顶点的着色器来累积所有相邻人脸的法线。但是,这将是一个巨大的内存消耗,面部索引的存储空间每个顶点需要12 int才能处理最坏的情况。还有一个问题,如何在不再次使用原子的情况下写入该存储,以计算出已将多少张面写入特定顶点。 任何人对此有更好的主意吗?

1
OpenGL镶嵌中的每个顶点计算
我尝试使用硬件镶嵌来实现基于位置的布料模拟。这意味着我只想将控制四边形上载到图形卡,然后使用镶嵌和几何着色在布料中创建节点。 这个想法遵循本文: David Huynh,“使用硬件镶嵌细分的布料模拟”(2011年)。论文。罗彻斯特理工学院 http://scholarworks.rit.edu/theses/265/ 我知道如何使用镶嵌来创建模拟点。我不知道如何将计算出的信息存储到帧缓冲区中。 几何图形以及镶嵌评估着色器具有每个顶点计算所需的信息。但是它们可以直接写入帧缓冲区吗? 我知道的片段着色器可以写入帧缓冲区,但是我的信息将被插值,并且我不再知道在哪个位置写入什么内容。

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.