Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl es 为什么在片段着色器中无法访问纹理lod_Opengl Es_Fragment Shader_Texture2d_Glsles_Level Of Detail - Fatal编程技术网

Opengl es 为什么在片段着色器中无法访问纹理lod

Opengl es 为什么在片段着色器中无法访问纹理lod,opengl-es,fragment-shader,texture2d,glsles,level-of-detail,Opengl Es,Fragment Shader,Texture2d,Glsles,Level Of Detail,我正在尝试接受OpenGL ES 2.0片段着色器中mipmapped纹理的细节级别 根据,无法使用bias参数texture2D访问片段着色器中的特定细节级别。而是根据细节级别,从相邻片段的并行执行中自动计算。我必须相信这就是事情的运作方式 我不明白的是为什么会这样为什么不可能访问特定级别的细节,而这样做应该非常简单?为什么必须依赖复杂的固定功能? 对我来说,这似乎非常违反直觉。毕竟,所有与OpenGL相关的东西都是从固定功能演变而来的。而OpenGL ES旨在覆盖比OpenGL更广泛的硬件,

我正在尝试接受OpenGL ES 2.0片段着色器中mipmapped纹理的细节级别

根据,无法使用
bias
参数
texture2D
访问片段着色器中的特定细节级别。而是根据细节级别,从相邻片段的并行执行中自动计算。我必须相信这就是事情的运作方式

我不明白的是为什么会这样为什么不可能访问特定级别的细节,而这样做应该非常简单?为什么必须依赖复杂的固定功能?

对我来说,这似乎非常违反直觉。毕竟,所有与OpenGL相关的东西都是从固定功能演变而来的。而OpenGL ES旨在覆盖比OpenGL更广泛的硬件,因此只支持许多东西的简单版本。因此,如果规范的开发人员已经决定LOD参数是强制性的(可能默认为零),并且着色器程序员可以以他认为合适的任何方式计算出合适的LOD,我将完全理解。添加一个自动进行计算的函数似乎是我在桌面OpenGL中所期望的

不提供对特定级别的直接访问对我来说毫无意义,无论我如何看待它。特别是因为
bias
参数表明我们确实可以调整细节级别,所以显然这不是为了从内存中获取数据,而仅仅是针对并行处理的一组片段的单个级别。我想不出任何其他原因


当然,为什么问题往往会吸引意见。但由于堆栈溢出不接受基于意见的答案,请仅将您的意见作为评论发布。另一方面,答案应该以可证实的事实为基础,比如有明确知识的人的陈述。如果有开发者讨论这个事实的记录,那就太完美了。如果有人在博客里讨论这个问题,那还是很好的

由于堆栈溢出问题应该处理实际的编程问题,有人可能会认为询问原因是一个糟糕的问题。得到答案不会使显式lod访问突然出现,因此也不会帮助我解决眼前的问题。但我觉得这里的原因可能是由于OpenGL ES如何工作的一些重要方面,而到目前为止我还没有掌握。如果是这样的话,那么理解这一决定背后的动机将有助于我和其他人更好地理解OpenGL ES作为一个整体,从而在性能、准确性、可移植性等方面更好地在他们的程序中使用它。因此,我可能会将这个问题表述为“我缺少了什么?”,这对我来说是一个非常现实的编程问题。

texture2DLod(…)
在顶点着色器纹理查找中起着非常重要的作用,而在片段着色器中并不需要

当在片段着色器中进行纹理查找时,片段着色器可以访问当前着色的基本体的每属性梯度(偏导数,如
dFdx(…)
dFdy(…)
),并使用此信息确定在过滤期间从哪个LOD提取相邻的texel

在运行顶点着色器时,没有关于基本体的任何信息,也没有此类渐变。在顶点着色器中使用mipmap的唯一方法是显式获取特定LOD,这就是引入该函数的原因

桌面OpenGL通过为顶点着色器提供一种纹理查找的变体,将梯度作为其输入之一,从而更智能地解决了这个问题。该函数称为
textureGrad(…)
,它是在GLSL 1.30中引入的。ESSL 1.0源于GLSL 1.20,并没有从所有相同的基本硬件功能中获益

ES 3.0没有此限制,桌面GL 3.0也没有。当桌面GL(3.0)引入显式LOD查找时,可以从任何着色器阶段进行查找。这可能只是一个疏忽,也可能存在一些基本的硬件限制(回想一下,以前的GPU具有专门的顶点和像素着色器硬件,而嵌入式GPU从未处于GPU设计的前沿)


无论这一限制的最初原因是什么,它都已在后来的OpenGL ES 2.0扩展中得到纠正,并且是OpenGL ES 3.0的核心。现代GL ES 2.0实现很可能会支持片段着色器中的显式LOD查找,具体扩展如下:

显示片段着色器中显式LOD查找的伪代码:
texture2DLod(…)
在顶点着色器纹理查找中起着非常重要的作用,这在片段着色器中是不必要的

当在片段着色器中进行纹理查找时,片段着色器可以访问当前着色的基本体的每属性梯度(偏导数,如
dFdx(…)
dFdy(…)
),并使用此信息确定在过滤期间从哪个LOD提取相邻的texel

在运行顶点着色器时,没有关于基本体的任何信息,也没有此类渐变。在顶点着色器中使用mipmap的唯一方法是显式获取特定LOD,这就是引入该函数的原因

桌面OpenGL通过为顶点着色器提供一种纹理查找的变体,将梯度作为其输入之一,从而更智能地解决了这个问题。该函数称为
textureGrad(…)
,它是在GLSL 1.30中引入的。
#version 100
#extension GL_EXT_shader_texture_lod : require

attribute vec2      tex_st;
uniform   sampler2D sampler;

void main (void)
{
  // Note the EXT suffix, that is very important in ESSL 1.00
  gl_FragColor = texture2DLodEXT (sampler, tex_st, 0);
}