在着色器中使用 glTexture

Posted

技术标签:

【中文标题】在着色器中使用 glTexture【英文标题】:using glTexture in a shader 【发布时间】:2013-02-04 21:40:58 【问题描述】:

我正在使用 openGL,我想做的是将我的场景渲染为纹理,然后存储该纹理,以便我可以将其传递到我的片段着色器中以用于渲染其他内容。

我使用 glGenTexture() 创建了一个纹理并将其附加到帧缓冲区,然后使用 glBindFrameBuffer() 渲染帧缓冲区。然后我将帧缓冲区设置回 0 以渲染回屏幕,但现在我卡住了。

在我的片段着色器中,我有一个统一的 2D 采样器“myTexture”,我想用它来存储纹理。我该怎么做呢?

对于我在网上找到的 .jpg/png 图像,我只使用了以下代码:

glUseProgram(Shader->GetProgramID());
GLint ID = glGetUniformLocation(
              Shader->GetProgramID(), "Map");
glUniform1i(ID, 0);
glActiveTexture(GL_TEXTURE0);
MapImage->Bind();
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );

但是,此代码不适用于我创建的 glTexture。具体来说,我不能以同样的方式调用 myTexture->Bind() 。

【问题讨论】:

【参考方案1】:

如果您的着色器中确实有“a uniform sampler 2D 'myTexture'”,为什么要获得 “地图” 的统一位置?您应该获得“myTexture”的统一位置;毕竟这是采样器的名字。

【讨论】:

我只是用它作为我如何访问 不同 着色器的示例。但是当我试图将它应用到'myTexture' ti ddint' 工作时。主要是因为我用于贴图的纹理来自 jpg 而我用于“myTexture”的纹理来自使用 glGenTexture() @user1782677:所有 OpenGL 纹理来自glGenTextures,无论您是直接使用还是通过库间接使用。【参考方案2】:

所以我使用 glGenTexture() 创建了一个纹理并将其附加到帧缓冲区

也就是说,你这样做了:

glActiveTexture(GL_TEXTURE0);
GLuint myTexture;
glGenTextures(1, &myTexture);
glBindTexture(GL_TEXTURE_2D, myTexture);

// very important and often missed by newbies:
// A framebuffer attachment must be initialized but not bound
// when using the framebuffer, so it must be unbound after
// initializing
glTexImage2D(…, NULL);
glBindTexture(GL_TEXTURE_2D, 0);

glBindFramebuffer(…);
glFramebufferTexture2D(…, myTexture, …);

好的,所以 myTexture 是纹理的名称句柄。我们需要做什么?解绑FBO,这样我们就可以使用附加的纹理作为图像源了,所以:

glBindFrameuffer(…, 0);

glActiveTexture(GL_TEXTURE0 + n);
glBindTexture(GL_TEXTURE_2D, myTexture);

glUseProgram(…);
glUniformi(texture_sampler_location, n);

【讨论】:

谢谢!我会试试这个,看看它是否有效。但是你从哪里得到你的'n'变量? @user1782677:我把n 变量放在那里是为了明确传递给采样器制服的值和纹理单元之间的联系。纹理单元 GL_TEXTURE0 中绑定的纹理由值为 0(而不是 GL_TEXTURE0)的采样器制服访问。 n 可以是任何小于所使用的 OpenGL 实现支持的最大纹理单元数的数值。

以上是关于在着色器中使用 glTexture的主要内容,如果未能解决你的问题,请参考以下文章

LWJGL 无法在着色器中采样帧缓冲纹理

在顶点着色器中更改顶点的颜色

有没有办法在片段着色器中使用先前渲染的结果?

如果未绑定,统一值是不是保留在 GLSL 着色器中?

如何在片段着色器中找到 4 个顶点之间的插值位置?

统一按钮在着色器中丢弃像素