纹理中的 OpenGL 片段着色器

Posted

技术标签:

【中文标题】纹理中的 OpenGL 片段着色器【英文标题】:OpenGL fragment shader in a texture 【发布时间】:2016-04-15 16:13:41 【问题描述】:

我有一个简单的 RGBA 纹理,我将在 OpenGL 中将其投影到一个矩形/四边形上。

但是,我想对该纹理的 rgb 像素进行一些操作,例如,我希望显示的颜色是原始图像的 RGB 像素的某个函数。

我的问题是:我可以将片段着色器应用于 2D 纹理吗?如果可以,如何访问原始纹理图像的 rgb 值?

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您当然可以这样做。像往常一样渲染四边形并将纹理作为sampler2D uniform 发送到片段着色器。

在片段着色器中,您可以调用texturetexelFetchtexture 对您的纹理进行采样,texelFetch 从纹理中查找 RGB 纹素而不执行插值等操作。

以下是片段着色器的示例:

片段着色器

#version 330 core

uniform vec2 resolution;
uniform sampler2D myTexture;

out vec3 color;

void main()

    vec2 pos = gl_FragCoord.xy / resolution.xy;
    pos.y = resolution.y - pos.y;

    color = texture(myTexture, pos).xyz;

然后在应用端:

初始化

glGenTextures(1, &m_textureID);
glBindTexture(GL_TEXTURE_2D, m_textureID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_imageWidth, m_imageHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, pImage);

m_textureUniformID = glGetUniformLocation(m_programID, "myTexture");

渲染循环

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, m_textureID);
glUniform1i(m_textureUniformID, 0);

【讨论】:

以上是关于纹理中的 OpenGL 片段着色器的主要内容,如果未能解决你的问题,请参考以下文章

片段着色器中未使用纹理数据 - OpenGL

OpenGL、GLSL 片段着色器无法读取 Sampler2D 纹理

传递给片段着色器的纹理坐标全部为 0

片段着色器究竟如何用于纹理?

纹理上的片段着色器

OpenGL几何着色器传递纹理坐标