小编vik*_*eid的帖子

在OpenGL中使用间接渲染有什么好处?

我读过API之类的glDrawElementsIndirect,glDrawArraysIndirect帮助我们进行间接渲染.间接渲染不同于直接渲染参数,如"顶点属性数","绘制实例数","从缓冲区对象开始顶点属性"等由GPU本身在缓冲区对象中提供而不是直接渲染由绘图调用中的CPU提供.

我明白.它还解释了它的优点是它可以更快地渲染,因为不涉及CPU交互.但是等等,是不是实际进行渲染调用的CPU?它仍然指定了渲染模式(GL_TRIANGLES等).它也可能加载了顶点属性.

那么,间接渲染中的所有穿孔增益都是通过不必传递这些微小变量来解释的:"计数","原始计数","第一顶点属性","实例计数"?这对我来说没什么意义.(它也没有改变任何状态)

opengl shader opengl-es

19
推荐指数
2
解决办法
9283
查看次数

如果指定了GL_COLOR_BUFFER_BIT掩码,glBlitFramebuffer是否会复制所有颜色附件?

如果我复制从一个FBO像素到另一个和他们每个人都有颜色附件的多个(不必是相同的号码),如果我的面具是GL_COLOR_BUFFER_BIT,哪种颜色的附件(GL_COLOR_ATTACHMENT0,GL_COLOR_ATTACHMENT1,..., GL_COLOR_ATTACHMENTi)它复制?他们都是?如果是,如果这些FBO附加了不同数量的颜色缓冲区怎么办?

假设有2个FBO以这种方式绑定:

glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo1); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo2); 
Run Code Online (Sandbox Code Playgroud)

请注意,它fbo1有2个颜色附件,并fbo2有4个颜色附件.

那么glBlitFrameBuffer在这种情况下如何将blit颜色附件?

我无法在OpenGL文档中的任何地方找到它.

opengl graphics framebuffer blit

15
推荐指数
1
解决办法
5391
查看次数

glUniformBlockBinding和glBindBufferBase之间的顺序是否重要?

使用UBO时,我们将统一块绑定到绑定点.然后我们还将UBO绑定到相同的绑定点:类似于:

glUseProgram(ProgramName);
glUniformBlockBinding(ProgramName, uniformLocation, bindingPoint);
glBindBufferBase(GL_UNIFORM_BUFFER, bindingPoint, bufId);
Run Code Online (Sandbox Code Playgroud)

我有2个问题:

  1. 我应该先指定glUniformBlockBinding还是glBindBufferBase,否则顺序无关紧要?
  2. 如果我的理解是正确的,那么只有在我们用数据更新UBO之后才能调用glBindBufferBase.如果这是正确的话,这就回答了我的第一个问题.

opengl framebuffer glsl

8
推荐指数
1
解决办法
2298
查看次数

glTexParameter和glSamplerParameter有什么区别

因为我不是专家,请不要愚蠢地考虑这个问题.我已经阅读了几个使用glTexParameter设置纹理参数的教程.我正在谈论GL_TEXTURE_MIN_FILTER,GL_TEXTURE_MAG_FILTER,GL_TEXTURE_WRAP_R等.突然间,我遇到了一个现在使用glSamplerParameter来设置这些参数的教程.

我看到glTexParameter和glSamplerParameter之间有一些常见的参数,如(GL_TEXTURE_MIN_FILTER,GL_TEXTURE_MAG_FILTER,GL_TEXTURE_WRAP_R,GL_TEXTURE_MIN_LOD等),还有一些只适用于glTexParameter(GL_TEXTURE_BASE_LEVEL,GL_TEXTURE_SWIZZLE_R等).我完全理解不常见的,因为毕竟glTexParameter正在对图像起作用,而这些参数本身就指定了属性图像.

但我不太明白为什么这两个GL调用之间有一些共同的参数.哪个应该用?在我看来,像(GL_TEXTURE_MIN_FILTER,GL_TEXTURE_MAG_FILTER,GL_TEXTURE_WRAP_R等)的采样参数应该只适用于采样器(glSamplerParameter)而不适用于glTexParameter.

请帮我理解两者之间的区别.

opengl textures

8
推荐指数
1
解决办法
1724
查看次数

如何使用纹理缓冲区来读取单个整数而不是vec4

我有一个工作代码,我从纹理缓冲区中读取着色器中的vec4值.

在客户端,我创建了一个位移矢量缓冲区:

vec4 vector1 : vec4(x1, y1, z1, w1);
vec4 vector2 : vec4(x2, y2, z2, w2);
vec4 vector3 : vec4(x3, y3, z3, w3);
..
Run Code Online (Sandbox Code Playgroud)

然后我创建一个包含vector1,vector2,vector3的顶点缓冲区....

接下来,我创建一个纹理并使用以下方法将上面的缓冲区绑定到它:

glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, bufferID);
Run Code Online (Sandbox Code Playgroud)

我之所以选择GL_RGBA32F,是因为x1,y1,z1,w1等都是浮点数.

在着色器中我可以使用以下方法获取单个向量:

vec4 vector1 = texelFetch(samplerObj, 0);
vec4 vector2 = texelFetch(samplerObj, 1);
.
.
Run Code Online (Sandbox Code Playgroud)

但是,现在假设我的位移矢量不是vec4,而是一个整数.即

int vector1 = x1; //(int is 32 bit unsigned)
int vector2 = x2; //(int is 32 bit unsigned)
Run Code Online (Sandbox Code Playgroud)

有人可以告诉相应的internalFormat会是什么?是吗

glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, bufferID);
Run Code Online (Sandbox Code Playgroud)

我还将如何在着色器中使用texelFetch获取值?是吗

int vector1 = texelFetch(samplerObj, 0);
Run Code Online (Sandbox Code Playgroud)

要么

int vector1 = texelFetch(samplerObj, 0).r ?
Run Code Online (Sandbox Code Playgroud)

我很困惑,因为texelFetch应该返回一个有4个组件的纹素,所以我必须使用结果的红色组件吗?

opengl texture2d

7
推荐指数
1
解决办法
3491
查看次数

什么是glSampleMask?

OpenGL wiki,用于glSampleMask()设置样本掩码的子字的值.(这对我没有任何意义.)

那么样本掩蔽是什么意思呢?(我知道glColorMask,但不能将它与glSampleMask联系起来).我假设它与计算最终颜色时最终选择的样品有什么关系?但是假设每个像素有4个样本,我设置了glSampleMask(0,0xFF),究竟发生了什么?

掩码号(本例中为0)表示什么?

gl_SamplerMask是shader等效于glSampleMask吗?

有人可以解释这里的条款吗?

opengl shader

6
推荐指数
1
解决办法
1577
查看次数

如何渲染由三角形组成的网格,其中每个三角形具有相同的颜色,而不是每个三角形指定该颜色3次

如何渲染网格(由三角形组成),其中每个三角形具有相同的颜色,而不是在顶点数组中为每个三角形指定该颜色3次.

假设我想绘制2个三角形.三角1:

Vertex 1,  position:(x1,y1) , color: (r1,g1,b1,a1)
Vertex 2,  position:(x2,y2) , color: (r1,g1,b1,a1)
Vertex 3,  position:(x3,y3) , color: (r1,g1,b1,a1)
Run Code Online (Sandbox Code Playgroud)

三角2:

Vertex 4,  position:(x4,y4) , color: (r2,g2,b2,a2)
Vertex 5,  position:(x5,y5) , color: (r2,g2,b2,a2)
Vertex 6,  position:(x6,y6) , color: (r2,g2,b2,a2)
Run Code Online (Sandbox Code Playgroud)

我知道这可以通过创建2个顶点缓冲区来完成:

Vertex Buffer 1:
[x1, y1]
[x2, y2]
[x3, y3]
[x4, y4]
[x5, y5]
[x6, y6]


Vertex Buffer 2:
[r1, g1, b1, a1]
[r1, g1, b1, a1]
[r1, g1, b1, a1]
[r2, g2, b2, a2]
[r2, g2, b2, a2]
[r2, g2, …
Run Code Online (Sandbox Code Playgroud)

opengl glsl vertex-buffer

5
推荐指数
1
解决办法
2178
查看次数

显式多重采样与OpenGL中的常规多重采样有何不同

我在28byteslater.com上阅读了关于延迟着色的MSAA的本教程.

它说,在显式多重采样中,我们可以访问特定的样本.

难道我们不能从GL_TEXTURE_2D_MULTISAMPLE例如绑定的常规纹理中做同样的事情吗?

这是我之前用于访问单个样本的着色器代码(不使用明显的多重采样):

uniform sampler2DMS Diffuse;

ivec2 Texcoord          = ivec2(textureSize(Diffuse) * In.Texcoord);
vec4  colorFirstSample  = texelFetch(Diffuse, Texcoord, 0);
vec4  colorSecondSample = texelFetch(Diffuse, Texcoord, 1);
vec4  colorThirdSample  = texelFetch(Diffuse, Texcoord, 2);
Run Code Online (Sandbox Code Playgroud)

我在显式多重采样中看到的唯一不同之处是它们texelFetchRenderbuffer()在着色器中使用并且纹理被绑定GL_TEXTURE_RENDERBUFFER_NV.加上如果我没记错,它在着色器中不可能使用RenderBuffer,现在我们可以吗?

opengl multisampling glsl opengl-3

4
推荐指数
1
解决办法
3574
查看次数

为什么在opengl 3.2之后不推荐使用GL_FRONT和GL_BACK

在glPolygonMode,从OpenGL 3.2开始,我无法单独传递GL_FRONT或GL_BACK.例如glPolygonMode(GL_FRONT,GL_LINE); 生成无效的枚举:(生成GL_INVALID_ENUM错误.当前配置文件中禁用了多边形模式.)

有人可以解释为什么这个被弃用了?为什么我必须传入两个面(GL_FRONT_AND_BACK)

如果我想要"填充"正面,然后"完全填充"多边形的背面怎么办?

不幸的是,这个链接(http://www.opengl.org/sdk/docs/man/xhtml/glPolygonMode.xml)没有提及任何相关内容.至少它应该已经提到它们为什么会被弃用或者你怎么能以不同的方式填充这些面孔.

opengl polygon

4
推荐指数
1
解决办法
2515
查看次数

如何在视觉上定义将纹理数组附加到 FBO 的颜色附加点?

我在分层渲染中读到,我们创建了一个 2D 纹理数组 (GL_TEXTURE_2D_ARRAY):

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D_ARRAY, TextureColorbufferName);
glTexParameteri(....
glTexImage3D(...
Run Code Online (Sandbox Code Playgroud)

并可以将其附加到 FBO:

glGenFramebuffers(1, &FramebufferName);
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, TextureColorbufferName, 0);
Run Code Online (Sandbox Code Playgroud)

我在视觉上发现很难理解的是,如何将一层纹理绑定到 FBO 中的单个颜色附着点?颜色附件 0(或 GL_COLOR_ATTACHMENTi 中的任何一个)本身不是单个“图像”吗?

更详细地:

在阅读纹理数组之前,这是我对 FBOS 的理解

                      +--------------+
         +-----------+| FBO object   ++--------------------------------------------+
         |            |              +---------------------+                       |
         |            +--------------+                     |                       |
         |                     +                           |                       |
         |                     |                           |                       |
         |                     |                           |                       |
         v                     v                           v                       v
 +-----------------+     +-----------------+      +-----------------+       +------------------+
 |color attachment |     |color attachment |      |depth attachment |       |stencil attachment|
 |    0            |     |   1             |      | …
Run Code Online (Sandbox Code Playgroud)

opengl textures framebuffer glsl

3
推荐指数
1
解决办法
3059
查看次数

使用 GL_TIME_ELAPSED 和 GL_TIMESTAMP 查询 OpenGL 中经过的时间有什么区别

它们都可以用来获取以纳秒为单位的流逝时间。前者使用作用域 glBeginQuery/glEndQuery。这就是区别吗?

opengl glsl opengl-4

3
推荐指数
1
解决办法
3337
查看次数

为什么视口的宽度/高度在 glViewportIndexed 中从 int 变为浮动

glViewport:宽度/高度是整数(像素)。

但是 glViewportIndexed 在浮点数中具有这些值。让它们浮动有什么好处。我的理解是基于像素总是整数这一事实。

opengl opengl-4

2
推荐指数
1
解决办法
1269
查看次数

我可以将一个纹理单元用于5种不同的2D纹理

我知道程序中可以有GL_MAX_TEXTURE_IMAGE_UNITS纹理单元OpenGL.但我们假设我只使用一个.假设我有5个2D纹理.我可以将它们"映射"到单个纹理单元(TEXTURE0)以渲染所有这些纹理单元.我的意思是我会这样做:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex1);
//specify tex data and tex params for tex1

glBindTexture(GL_TEXTURE_2D, tex2);
//specify tex data and tex params for tex1
Run Code Online (Sandbox Code Playgroud)

..等等所有5个纹理

渲染循环:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex1);
//draw

glBindTexture(GL_TEXTURE_2D, tex2);
//draw
Run Code Online (Sandbox Code Playgroud)

..等等所有5个纹理

在片段着色器中,我只使用1个sampler2d变量,该变量初始化为零(对于纹理单元0)

如果这不能正常工作,那么我应该使用5个不同的纹理单位(TEXTURE0, TEXTURE0+1, ....TEXTURE0+5)并将每个纹理"映射"到不同的纹理单元.

最重要的问题:如果我的第一种方法是正确的,那么有多少2D纹理(我现在只讨论2D纹理)可以"映射"到纹理单元吗?

opengl textures

0
推荐指数
1
解决办法
736
查看次数