Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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创建用于读取的深度模板纹理_Opengl_Textures - Fatal编程技术网

opengl创建用于读取的深度模板纹理

opengl创建用于读取的深度模板纹理,opengl,textures,Opengl,Textures,我在应用程序中使用延迟渲染,并尝试创建一个包含深度和模具的纹理 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, width, height, 0, ???, GL_FLOAT, 0); 现在,opengl希望这个特定纹理使用什么格式的枚举。我试了几次,结果都出错了 另外,访问纹理的深度和模具部分的正确glsl语法是什么。我知道深度纹理通常是均匀的。但我知道吗 float depth = texture(depthstenciltex,uv

我在应用程序中使用延迟渲染,并尝试创建一个包含深度和模具的纹理

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, width, height, 0,
???, GL_FLOAT, 0);
现在,opengl希望这个特定纹理使用什么格式的枚举。我试了几次,结果都出错了

另外,访问纹理的深度和模具部分的正确glsl语法是什么。我知道深度纹理通常是均匀的。但我知道吗

float depth = texture(depthstenciltex,uv).r;// <- first bit ? all 32 bit ? 24 bit ?
float stencil = texture(depthstenciltex,uv).a;
float depth=纹理(depthstenciltex,uv).r;// nvm找到了

glTexImage2D(gl.TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, w,h,0,GL_DEPTH_STENCIL,
GL_UNSIGNED_INT_24_8, 0);
uint24_8是我的问题

glsl(330)中的用法:

现在,opengl希望这个特定纹理使用什么格式的枚举

您遇到的问题是深度+模具是一个完全奇怪的数据组合。前24位(深度)为定点,其余8位(模具)为无符号整数。这需要一种特殊的压缩数据类型:
GL\u UNSIGNED\u INT\u 24\u 8

另外,访问纹理的深度和模具部分的正确glsl语法是什么。我知道深度纹理通常是均匀的

实际上,您将永远无法使用相同的采样器制服对这两种东西进行采样,原因如下:

-8.9纹理函数。158 对于深度/模具纹理,采样器类型应与通过OpenGL API设置访问的组件相匹配。当深度/模具纹理模式设置为
GL_depth_COMPONENT
时,应使用浮点采样器类型。当深度/模具纹理模式设置为
GL_stencil_INDEX
时,应使用无符号整数采样器类型。使用不支持的组合执行纹理查找将返回未定义的值

这意味着如果要在着色器中同时使用深度和模具,则必须使用纹理视图(OpenGL 4.2+)并将这些纹理绑定到两个不同的纹理图像单元(每个视图在
GL\u depth\u stencil\u texture\u MODE
中具有不同的状态)。这两件事加在一起意味着您至少需要一个OpenGL 4.4实现

对深度和模具进行采样的片段着色器:
#版本440
//采样深度+模具纹理的模具索引成为OpenGL 4.4的核心
布局(装订=0)均匀取样器2D深度\u tex;
布局(装订=1)统一的usampler2D模板;
在vec2uv中;
真空总管(真空){
浮动深度=纹理(深度×纹理,uv);
uint模具=纹理(模具纹理,uv);
}
创建模具视图纹理:
//在“深度”模具纹理中交替查看图像数据`
胶合模具视图;
glGenTextures(&stencil_视图,1);
glTextureView(模具视图、GL纹理2D、深度模具纹理、,
GL_深度24_模具8,0,1,0,1);
//^^^这要求使用“glTexStorage2D(…)分配“深度”模具`
//要满足'GL\u纹理\u不可变\u格式,'='GL\u真`
此着色器的OpenGL状态设置:
//纹理图像单元0将其视为深度纹理
玻璃纹理(GL_纹理0);
glBindTexture(GL_纹理_2D,深度_模板_tex);
glTexParameteri(GL_纹理_2D、GL_深度_模具_纹理_模式、GL_深度_组件);
//纹理图像单元1将相应地处理深度_stencil _tex的模具视图
玻璃结构(GL_纹理1);
glBindTexture(GL_纹理_2D,模具视图);
glTexParameteri(GL_纹理_2D、GL_深度_模具_纹理_模式、GL_模具_索引);

可能有一种解决方法是创建原始纹理的纹理视图,并为该视图设置不同的
GL\u DEPTH\u texture\u STENCIL\u模式。@peppe:谢谢您的建议。我也有这样的想法,但后来我愚蠢地认为这行不通,因为
GL\u DEPTH24\u模具8
不是
GL\u视图类32位的成员。但是,由于两种纹理的内部格式完全匹配,这并不重要。我已经更新了我的答案。@AndonM.Coleman这是一个老话题,但你能帮我吗?如果我不想访问着色器中的模具值,但经常使用模具作为遮罩,我应该如何使用模具附件?这是我试过的-。如果您有任何评论,我将不胜感激。我猜您只是为了清楚起见才将其包括在内,但是行
glTexParameteri(GL_纹理\u 2D,GL_深度\u纹理\u模具\u模式,GL_深度\u组件)可以省略,因为
GL\u DEPTH\u TEXTURE\u STENCIL\u MODE
的初始值是
GL\u DEPTH\u COMPONENT
。实际上,只有前24位可用,其他(STENCIL)位未定义。纹理的
GL\u DEPTH\u TEXTURE\u STENCIL\u MODE
属性的初始值为
GL\u DEPTH\u COMPONENT
,因此您可以在不更改纹理对象任何参数的情况下对组合深度/模具纹理的深度分量进行采样。如果您想对组合深度/模具纹理的模具索引进行采样,则可以将纹理的
GL_depth_texture_stencil_MODE
设置为
GL_stencil_index
,就像@Andon在回答中向您展示的那样。
sampler2D depthstenciltex;
...
float depth = texture(depthstenciltex,uv).r;//access the 24 first bit, 
//transformed between [0-1]