我想使用分层图像(具有 10-1000 z 分辨率的 3D 纹理)作为帧缓冲区的纹理。 我通过以下方式设置帧缓冲区的纹理:
glGenTextures(1, &textureName);
glBindTexture(GL_TEXTURE_3D, textureName);
glTexStorage3D(GL_TEXTURE_3D, 1, GL_R32F, width, height, depth);
glBindTexture(GL_TEXTURE_3D, 0);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureName, 0);
然后我在几何着色器中为图层创建几何
void main() {
for (int layer = 0; layer < textureDepth; ++layer) {
gl_Layer = layer;
//generate and emit vertices
EndPrimitive();
}
}
对于较小的纹理深度(例如 10),这似乎可行,但对于更大的数字,结果似乎是错误的。有很多地方可能会出错,所以我想确保它能正常工作。
- 我设置正确吗?
- 我必须查询的层数是否有限制 (
glGetInteger
)? - 您对将高度分层的图像作为帧缓冲区的性能有任何经验吗?
请注意,我的主要问题是缺少有关此主题的信息。 documentation非常短,非立方体贴图分层图像上的部分甚至更短。如果有任何教程涵盖此主题(不是立方体贴图问题),我会很高兴。
最佳答案
在这种情况下,您可能会遇到许多限制,但我首先想到的是 gl_MaxGeometryOutputVertices
。 OpenGL 实现可以限制您在单个几何着色器调用中输出少至 256 个顶点。如果您遇到此限制,您可以将几何着色器拆分为多个调用。事实上,对于重度分层渲染,您无论如何都应该使用 GS 调用。
如果您用更多细节更新您的问题,尤其是完整的几何着色器,我可以为您提供更详细的答案。包括如何设置 GS 调用(如果您还不熟悉的话)。
关于c++ - 分层图像作为具有大量层的帧缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19990329/