我读过API之类的glDrawElementsIndirect,glDrawArraysIndirect帮助我们进行间接渲染.间接渲染不同于直接渲染参数,如"顶点属性数","绘制实例数","从缓冲区对象开始顶点属性"等由GPU本身在缓冲区对象中提供而不是直接渲染由绘图调用中的CPU提供.
我明白.它还解释了它的优点是它可以更快地渲染,因为不涉及CPU交互.但是等等,是不是实际进行渲染调用的CPU?它仍然指定了渲染模式(GL_TRIANGLES等).它也可能加载了顶点属性.
那么,间接渲染中的所有穿孔增益都是通过不必传递这些微小变量来解释的:"计数","原始计数","第一顶点属性","实例计数"?这对我来说没什么意义.(它也没有改变任何状态)
如果我复制从一个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文档中的任何地方找到它.
使用UBO时,我们将统一块绑定到绑定点.然后我们还将UBO绑定到相同的绑定点:类似于:
glUseProgram(ProgramName);
glUniformBlockBinding(ProgramName, uniformLocation, bindingPoint);
glBindBufferBase(GL_UNIFORM_BUFFER, bindingPoint, bufId);
Run Code Online (Sandbox Code Playgroud)
我有2个问题:
因为我不是专家,请不要愚蠢地考虑这个问题.我已经阅读了几个使用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.
请帮我理解两者之间的区别.
我有一个工作代码,我从纹理缓冲区中读取着色器中的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 wiki,用于glSampleMask()设置样本掩码的子字的值.(这对我没有任何意义.)
那么样本掩蔽是什么意思呢?(我知道glColorMask,但不能将它与glSampleMask联系起来).我假设它与计算最终颜色时最终选择的样品有什么关系?但是假设每个像素有4个样本,我设置了glSampleMask(0,0xFF),究竟发生了什么?
掩码号(本例中为0)表示什么?
gl_SamplerMask是shader等效于glSampleMask吗?
有人可以解释这里的条款吗?
如何渲染网格(由三角形组成),其中每个三角形具有相同的颜色,而不是在顶点数组中为每个三角形指定该颜色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) 我在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,现在我们可以吗?
在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)没有提及任何相关内容.至少它应该已经提到它们为什么会被弃用或者你怎么能以不同的方式填充这些面孔.
我在分层渲染中读到,我们创建了一个 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) 它们都可以用来获取以纳秒为单位的流逝时间。前者使用作用域 glBeginQuery/glEndQuery。这就是区别吗?
glViewport:宽度/高度是整数(像素)。
但是 glViewportIndexed 在浮点数中具有这些值。让它们浮动有什么好处。我的理解是基于像素总是整数这一事实。
我知道程序中可以有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纹理)可以"映射"到纹理单元吗?