OpenGL Texture3D FragmentShader 写入图层
OpenGL Texture3D FragmentShader Write Into Layers
我想过滤纹理(无 mipmapping)并将过滤后的级别写入 3D 纹理。我已经使用以下代码创建了一个 3D 纹理:
glGenTextures(1, &outTexture);
glBindTexture(GL_TEXTURE_3D, outTexture);
glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, width, height, layer, 0, GL_RGBA, GL_INT, 0);
glBindTexture(GL_TEXTURE_3D, 0);
我这样渲染我的模型:
glFramebufferTexture3D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_3D, outTexture, 0, layer);
entity.render();
有没有办法让片段着色器同时写入多个层并知道你在哪一层?像这样?
out_color[layer] = vec4(r,g,b,a);
PS:我需要知道片段着色器在哪一层(一些过滤的东西&请不要 gl_Layer ...只能在 OpenGL 4 上使用,我只能使用 OpenGL 3) ...我可以将它写成一个制服并渲染多次,但如果有一种方法可以一次性完成...那就太好了:)
片段着色器的实例无法选择它正在写入的层。这是由构造生成相关片段的基元的几何着色器为其选择的。所以如果你想渲染到多层,你将需要使用 layered rendering and GS's.
如果您的片段着色器需要知道它正在写入哪个层,则让几何着色器将其作为每个顶点参数传递:
//Geometry shader
flat out int layerIndex;
void main()
{
for(int currLayer = 0; currLayer < numLayers; ++currLayer)
{
for(int currVertex = 0; currVertex < gl_in.length(); ++currVertex)
{
layerIndex = currLayer;
gl_Layer = currLayer;
//Compute other per-vertex outputs
EmitVertex();
}
EndPrimitive();
}
EmitVertex();
}
//Fragment shader
flat in int layerIndex;
void main()
{
//Do stuff with layerIndex;
}
我想过滤纹理(无 mipmapping)并将过滤后的级别写入 3D 纹理。我已经使用以下代码创建了一个 3D 纹理:
glGenTextures(1, &outTexture);
glBindTexture(GL_TEXTURE_3D, outTexture);
glTexParameterf(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, width, height, layer, 0, GL_RGBA, GL_INT, 0);
glBindTexture(GL_TEXTURE_3D, 0);
我这样渲染我的模型:
glFramebufferTexture3D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_3D, outTexture, 0, layer);
entity.render();
有没有办法让片段着色器同时写入多个层并知道你在哪一层?像这样?
out_color[layer] = vec4(r,g,b,a);
PS:我需要知道片段着色器在哪一层(一些过滤的东西&请不要 gl_Layer ...只能在 OpenGL 4 上使用,我只能使用 OpenGL 3) ...我可以将它写成一个制服并渲染多次,但如果有一种方法可以一次性完成...那就太好了:)
片段着色器的实例无法选择它正在写入的层。这是由构造生成相关片段的基元的几何着色器为其选择的。所以如果你想渲染到多层,你将需要使用 layered rendering and GS's.
如果您的片段着色器需要知道它正在写入哪个层,则让几何着色器将其作为每个顶点参数传递:
//Geometry shader
flat out int layerIndex;
void main()
{
for(int currLayer = 0; currLayer < numLayers; ++currLayer)
{
for(int currVertex = 0; currVertex < gl_in.length(); ++currVertex)
{
layerIndex = currLayer;
gl_Layer = currLayer;
//Compute other per-vertex outputs
EmitVertex();
}
EndPrimitive();
}
EmitVertex();
}
//Fragment shader
flat in int layerIndex;
void main()
{
//Do stuff with layerIndex;
}