绘制到 Framebuffer 时不能使用 sampler2D

问题描述 投票:0回答:0

我在绘制到 Framebuffer 对象时将 2D 纹理绑定到着色器时遇到问题。 当我直接在屏幕上绘图时没有任何问题,但是当我尝试使用 Framebuffer 时,整个对象从屏幕上消失(可能是纹理和 gest 0.0 作为 alpha 有问题)。 主要问题是,当我使用帧缓冲区并尝试将纹理绑定到着色器时,没有绘制任何内容。直接在屏幕上绘图效果很好。

此外,当我尝试使用帧缓冲区绘制我的点时,当我使用

NVIDIA Nsight Graphics
调试帧时,我看到有关
incomplete texture
的警告。在没有帧缓冲区的情况下绘图时一切正常。

当我在没有 Framebuffer 伪代码的情况下绘制时:

glUseProgram();
glUniform1i(5); //set 5 as texture binding
glActiveTexture(GL_TEXTURE5);
glBindTexture(GL_TEXTURE_2D, textureID);
glDrawArrays(GL_POINTS, 0, 9999);

当我用 Framebuffer 伪代码绘制时:

glUseProgram();
glUniform1i(5); //set 5 as texture binding

glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);
glClearColor(r, g, b, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glActiveTexture(GL_TEXTURE5);
glBindTexture(GL_TEXTURE_2D, textureID);
glDrawArrays(GL_POINTS, 0, 9999);

当我跳过着色器中的读取颜色并使用一种静态颜色时,一切都在正确绘制。 使用帧缓冲区和绑定纹理一定存在某种问题。

我的纹理是这样创建的:

glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 55, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_2D, 0);

我的帧缓冲区是这样创建的:

glGenFramebuffers(1, &framebufferID);
glBindFramebuffer(GL_FRAMEBUFFER, framebufferID);

    //depth texture
glGenTextures(1, &m_depthTextureID);
glBindTexture(GL_TEXTURE_2D, m_depthTextureID);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH_COMPONENT32F, m_windowSize.cx, m_windowSize.cy);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthTextureID, 0);

    //color texture
glGenTextures(1, &m_colorTextureID);
glBindTexture(GL_TEXTURE_2D, m_colorTextureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_windowSize.cx, m_windowSize.cy, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_colorTextureID, 0);
c++ opengl glsl
© www.soinside.com 2019 - 2024. All rights reserved.