Questions tagged «opengl»

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

9
新的图形程序员应该学习Vulkan而不是OpenGL吗?
摘自Wiki:“ Vhkan API最初被Khrono称为'下一代OpenGL计划',并且这是 “一次重新设计,将OpenGL和OpenGL ES统一为一个不会倒退的通用API的尝试。与现有的OpenGL版本兼容”。 那么现在应该更适合学习图形编程的人学习Vulkan而不是OpenGL吗?看来它们将达到相同的目的。
53 opengl  api  vulkan 

6
如何调试GLSL着色器?
在编写非平凡的着色器时(就像在编写其他任何非平凡的代码时一样),人们会犯错误。[需要引用]但是,我不能像其他任何代码一样调试它-毕竟不能仅仅附加gdb或Visual Studio调试器。您甚至无法进行printf调试,因为没有任何形式的控制台输出。我通常要做的是将要查看的数据呈现为彩色,但这是一个非常基本且业余的解决方案。我确信人们已经提出了更好的解决方案。 那么我该如何实际调试着色器?有没有办法遍历着色器?我可以查看着色器在特定顶点/原始/片段上的执行情况吗? (此问题专门用于调试着色器代码,类似于调试“正常”代码的方式,而不是调试状态更改之类的东西。)
45 opengl  glsl  debugging 

1
在OpenGL的上下文中,“ st”是什么意思?
st在查看其他OpenGL片段着色器时,我已经见过几次这个术语。但是,我不知道它代表什么或用途。这是一个例子: uniform vec2 u_resolution; vec2 st = gl_FragCoord.xy/u_resolution; 我可以理解,这是将像素坐标转换为0.0-1.0的规范化坐标,而不是640 x 480(例如)。 我也看过类似的东西position.st。 这是什么意思?
19 opengl 

2
什么是fwidth,它如何工作?
在OpenGL的文档指出fwidth returns the sum of the absolute value of derivatives in x and y。 用较少的数学术语表示什么,有没有办法将其可视化? 根据我对功能的理解,fwidth(p)可以访问p相邻像素中的值。它如何在GPU上工作而又不显着影响性能?它在所有像素上均可靠且均匀地工作吗?
18 opengl 

1
没有任何输入几何体,是否可以在几何着色器中生成图元?
几年前,我尝试在OpenGL中实现此GPU Gem,以使用Marching Cubes生成3D程序地形。本文建议在几何着色器中实现Marching Cubes,以实现最高效率。这意味着我需要为域中的每个体素运行一次着色器,它将在该单元格中生成整个几何体。 我偶然发现的一个问题是如何运行几何着色器,而实际上没有在该着色器之外进行任何渲染。我的解决方案(似乎很棘手)是在每个单元格中渲染一个点,然后用几何着色器丢弃它,然后发出三角形。我从未找到合适的解决方案,并且此解决方法仍保留在最终代码中。 因此,是否有任何方法告诉OpenGL从几何着色器开始渲染过程而无需任何输入几何?还是我总是必须向GPU发送一些虚拟点才能使事情运行。

3
如何调试在OpenGL中渲染到帧缓冲区对象的内容?
我有一个点云正在渲染到屏幕上。每个点都有其位置和颜色以及ID。 我被要求将每个点的ID渲染到纹理,因此我创建了FBO并附加了两个纹理,一个用于颜色,一个用于深度。我为此屏幕外渲染创建了必要的VAO和VBO,并为每个点上载了其位置和ID。 完成向FBO的渲染后,我将读取带有颜色纹理的像素glReadPixels()以查看其值,但它们似乎都被清除了,即它们具有的值与相同glClearColor()。 有什么方法可以调试将其渲染为FBO的颜色纹理的东西吗?非常欢迎您提供任何提示。
17 opengl  debugging 

2
如何在OpenGL中实现轨迹球?
在深入了解转换之后,是时候为我的应用实现跟踪球了。我知道我必须创建一个从起点到单击鼠标的向量,然后再从起点到释放鼠标的另一个向量。 我的问题是,我是否必须将(x,y)像素坐标转换为世界坐标,还是应该只在图像空间中做所有事情(考虑图像空间是以像素为单位测量场景的2D投影)? 编辑 Richie Sams的答案是一个很好的答案。但是,我认为我采用的方法略有不同,如果我错了或者我误会了一些东西,请纠正我。 在我的应用程序有一个SimplePerspectiveCamera接收类position相机中,position of the target我们正在寻找的up载体中,fovy,aspectRatio,near和far距离。 通过这些,我构建了视图和投影矩阵。现在,如果要放大/缩小,请更新视野并更新投影矩阵。如果要平移,请移动摄像机的位置,并按鼠标产生的增量查看。 最后,对于旋转,我可以使用角度轴变换或四元数。为此,我将像素坐标保存在按下鼠标的位置,然后当鼠标移动时,我还将保存像素坐标。 对于每一对COORDS的我可以计算Z值给出的公式为球状,即,SQRT(1-X ^ 2-Y ^ 2),然后计算与从去矢量target到PointMousePressed和从target到PointMouseMoved,做叉积获取旋转轴并使用任何方法计算新的相机位置。 但是,我最大的疑问是(x,y,z)值是以像素坐标给出的,在计算我使用的矢量时,target这是世界坐标中的一个点。坐标系的这种混合不影响我尝试做的旋转结果吗?
15 opengl  trackball 

1
OpenGL兼容性,命名约定以及ARB与EXT
我以为我对OpenGL命名约定和扩展的工作方式已经形成了大致的了解,直到偶然发现一个令我困惑的案例。 到目前为止,这是我的理解: 没有后缀 -例如glGenBuffers()。此功能是核心配置文件的一部分。该wiki页面告诉我,这是添加到从1.5版本开始核心简档。 ARB-例如glGenBuffersARB()。此功能是标准化GL_ARB_vertex_buffer_object扩展的一部分。此扩展的规范GenBuffersARB()在“新过程和函数”部分中明确声明。“依赖关系”部分告诉我,如果硬件支持扩展,则可以从1.4+上下文访问此文件。 EXT-这些是特定于供应商的扩展和功能,只有某些供应商可以支持。顶点缓冲区对象在注册表中似乎没有EXT扩展名。 这是我的理解破裂的地方: glGenFramebuffers正如Wiki所示,在3.0中已添加到核心。 现在,我想以低于3.0的核心配置文件版本访问帧缓冲区功能。因此,我想将其用作扩展。规范注册表告诉我,有两个可用的扩展名-ARB和EXT。 问题1-如果存在ARB扩展名,为什么存在EXT扩展名?您是否总会选择标准化的而不是特定于供应商的一种? 查看“新过程和函数”部分中的ARB规范可知,该扩展定义了该GenRenderbuffers()函数。这次没有ARB后缀。GLEW根本没有功能原型glGenRenderbuffersARB()。奇怪的。 EXT规范GenRenderbuffersEXT()在新功能部分中确实具有功能,而GLEW也具有glGenRenderbuffersEXT()。 问题2-如果有EXT后缀,为什么没有ARB后缀?假设ARB函数的名称和核心函数的名称相同,这对ARB如何起作用? 问题3-我最终希望使用1.4配置文件中的Framebuffer功能。我应该使用哪个扩展名和哪个功能集,以便获得最大的硬件兼容性覆盖?
14 opengl 

3
有什么方法可以在OpenGL中渲染透明度
可以启用Alpha混合以使表面透明,如下所示: glDisable(GL_DEPTH_TEST); //or glDepthMask(GL_FALSE)? depth tests break blending glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 但这仅在对象以从前到后的顺序渲染时才有效。否则,背景中的物体会出现在较近的物体之前,例如下图的地板。对于粒子和GUI元素,可以进行排序,但是对于三角形网格,似乎需要太多的努力和速度,如此处所述:https : //www.opengl.org/wiki/Transparency_Sorting。 有哪些常见方法可以解决此问题?我知道这是相当广泛的,不需要深入的实现细节,而只是对一些方法以及可能涉及的内容进行了简要说明。

1
何时禁用透视校正插值(非透视)
在GLSL中,顶点属性的透视正确插值是默认设置-可以通过使用非透视限定符对特定的顶点属性禁用它。除了在后处理着色器中,我从未见过禁用透视校正的正确插值-还有其他用例吗?此外,从性能角度来看,它是否还会有所作为?

1
同步连续的OpenGL Compute Shader调用
我有几个需要按一定顺序执行的计算着色器,它们的输出取决于以前的输入。理想情况下,我永远不需要在客户端复制缓冲区并在GPU上完成所有工作。 考虑一下,我有两个计算着色器已编译并链接为program_one和program_two。假设我还有一个GL_SHADER_STORAGE_BUFFER包含由写入program_one和读取的数据的program_two。我可以简单地执行以下操作: glUseProgram(program_one); glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer); glDispatchCompute(16, 16, 1); glUseProgram(program_two); glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, index, buffer); glDispatchCompute(16, 16, 1); 是否可以保证第一个计算着色器的所有调用将在第二个计算着色器的任何调用之前完成(以避免读写之间的数据争用buffer)?如果没有,如何同步它们?

2
OpenGL-边缘检测
我想加载任意网格并沿边缘绘制粗黑线以获得类似卡通色调的外观。我设法通过使用模板缓冲区在对象周围绘制了一个黑色的轮廓。您可以在此处查看结果: 但是缺少的是对象本身的黑线。我考虑过检查法线不连续性:检查相邻像素的法向矢量是否不同于当前像素。如果是,则找到边缘。不幸的是,无论是在OpenGL中还是在GLSL顶点/片段着色器中,我都不知道如何实现这种方法。 对于这种方法或其他有关边缘检测的帮助,我将非常高兴。 编辑:我不对我的网格使用任何纹理。 太精确了,我想创建一个看起来像这样的CAD / CAM解决方案(摘自Top Solid https://www.youtube.com/watch?v=-qTJZtYUDB4):

1
“ makeContextCurrent”到底能做什么?
我对该功能非常困惑。GLFW上下文参考如下: 该函数使指定线程的指定窗口的OpenGL或OpenGL ES上下文在调用线程上为当前。每次只能在一个线程上使一个上下文成为当前上下文,而每个线程一次只能具有一个当前上下文。 但这对我没有太大帮助。 可以像glBind-方法一样工作吗?(glBindBuffer,glBindVertexArray等)
12 opengl  c++ 

2
GL_STATIC_DRAW与GL_DYNAMIC_DRAW与GL_STREAM_DRAW:有关系吗?
在OpenGL中,缓冲对象函数(glBufferData,glBufferSubData和,可能还有其他一些)具有参数usage,该参数在文档中被描述为预期用途的暗示,可能意在帮助实现更好的性能。 用法 指定数据存储的预期使用方式。符号常量必须是GL_STREAM_DRAW,GL_STREAM_READ,GL_STREAM_COPY,GL_STATIC_DRAW,GL_STATIC_READ,GL_STATIC_COPY,GL_DYNAMIC_DRAW,GL_DYNAMIC_READ,或GL_DYNAMIC_COPY。 [...] 用法向GL实现提供了有关如何访问缓冲区对象的数据存储的提示。这使GL实现能够做出更明智的决策,从而可能显着影响缓冲区对象的性能。但是,它并不限制数据存储的实际使用。 维基同样含糊不清: 毕竟,这些只是提示。在创建STATIC缓冲区之后修改它,或者永远不要修改STREAM缓冲区,这是完全合法的OpenGL代码。 [...] 这些问题只有通过仔细分析才能回答。即便如此,答案也仅对来自特定硬件供应商的特定驱动程序版本是准确的。 最后,这个参数有多相关(如果有的话)?驾驶员是否真的考虑到了这一点,如果确实如此,根据您的经验,它在实践中会对性能产生多大影响?您有数据要共享吗? 我已经编写了一个薄的图形API抽象层,打算将其作为现有API中的任何一个实现,并且很想完全忽略此参数并将其从公开的抽象中隐藏起来。

1
为什么相邻的三角形在栅格化时永远不会重叠?
对于以下菜鸟问题表示歉意,只是我在任何地方都找不到令人满意的答案... 当我绘制一个由两个三角形组成的简单的与轴对齐的四边形时,我不明白为什么在这些三角形相交的对角线边缘上从来没有可见的伪像。其中一些像素必须同时位于两个三角形中,对吗?因此,如果我的碎片着色器总是发出部分透明的颜色(比如说50%黑色),那么在生成的四边形中是否应该没有可见的深色对角线? 显然,这不是必须解决的实际问题,这很好,我只是不明白为什么不是这样。是什么使它始终有效?
11 opengl  gpu  rasterizer 

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.