Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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 GLSL采样器如何确定纹理的缩小,从而确定纹理的mipmap级别?_Opengl_Opengl Es_Glsl_Mipmaps - Fatal编程技术网

Opengl GLSL采样器如何确定纹理的缩小,从而确定纹理的mipmap级别?

Opengl GLSL采样器如何确定纹理的缩小,从而确定纹理的mipmap级别?,opengl,opengl-es,glsl,mipmaps,Opengl,Opengl Es,Glsl,Mipmaps,我正在使用OpenGL ES(通过WebGL),但我认为这个问题也适用于完整的OpenGL配置文件 假设我创建了一个具有完整mipmap级别的OpenGL纹理,并将其纹理\u MIN\u过滤器设置为最近的\u mipmap\u最近的。还假设我有一个片段着色器对该纹理进行采样。mipmap级别是根据纹理的缩小程度选择的,但是如何选择缩小程度呢 在我的例子中,我正在合成(在着色器内部)用于采样纹理的纹理坐标。事实上,我的纹理坐标不是基于任何传入的变量。尽管我在这个纹理上启用了mipmapping,但

我正在使用OpenGL ES(通过WebGL),但我认为这个问题也适用于完整的OpenGL配置文件

假设我创建了一个具有完整mipmap级别的OpenGL纹理,并将其纹理\u MIN\u过滤器设置为最近的\u mipmap\u最近的。还假设我有一个片段着色器对该纹理进行采样。mipmap级别是根据纹理的缩小程度选择的,但是如何选择缩小程度呢


在我的例子中,我正在合成(在着色器内部)用于采样纹理的纹理坐标。事实上,我的纹理坐标不是基于任何传入的变量。尽管我在这个纹理上启用了mipmapping,但它似乎没有任何效果。这是预期的吗?我是否需要自己计算LOD并使用偏移参数来纹理2D?(没有texture2DLOD,因为我使用的是ES)

您可以任意计算纹理坐标,着色器将相应地执行操作。。。在一个限制内。你的计算不能包含任何条件逻辑。它们可以包括变量、制服、常量、从其他纹理采样的值,无论您想要什么。但是当你滑到一个?:操作符的时候(更不用说if语句了),你就有麻烦了


既然你在OpenGL ES的土地上,你真的没有工具让自己摆脱困境。Desktop GL 3.0为您提供了
textureGrad
函数集,允许您在达到条件逻辑之前计算梯度。但是如果没有它,你就无能为力了。

相邻像素块是并行计算的。(例如,IIRC PowerVR芯片一次执行4x4块。)当您在片段着色器中调用texture2D时,采样器一次获取所有16个像素的所有16个样本,因此具有计算缩小级别所需的邻接信息。这就是为什么相邻像素从纹理的附近区域采样如此重要的部分原因


请注意,这仅适用于片段着色器。在顶点着色器中,始终使用第一个mipmap级别(除非使用texture2D的Lod版本)。

我不确定如何在不使用某种形式的变化信息的情况下计算非常量值,因为在相同共享的不同调用中唯一不同的信息是变量(记住:gl_FragCoord也是一个变量)。那么你是如何计算它们的呢?即使是噪波函数或RNG也需要一些关键点。另请参见:@Nicol我希望通过省略细节来保持问题的简单性。我为片段着色器提供了两个纹理。第一个纹理是第二个纹理的查找表,其中包含实际的图像数据。因此我使用一个变量来对第一个纹理进行采样Xtre,但该纹理的内容用于计算下一次查找的坐标。因此,我确实假设第二个纹理的坐标基于一个变量,但两者之间的数学并不简单。@Stefan老实说,我搜索过了!我能找到的只是“如何对特定的mipmap级别进行采样”。谢谢。谢谢你的回答。这很有趣,但它并没有真正解决我的基本问题(mipmap级别是如何确定的?)RE PowerVR芯片:AFAIK这些芯片使用2x2块进行过滤器梯度计算,这与其他供应商的芯片非常相似,因为这是在各种API中指定的