【发布时间】:2017-03-23 18:36:00
【问题描述】:
查看 RGB 和颜色图之间的 gif 切换:
问题在于两张图片不同。
我正在绘制 RGB 白色 (1.0,1.0,1.0) 的点。 Alpha 通道控制像素亮度,从而创建点模糊。这就是你看到的更亮的图像。然后我有一个黑白 (0.0,0.0,0.0,1.0) (1.0,1.0,1.0,1.0) 的 2 像素纹理,在片段着色器中我做了:
#version 330
precision highp float;
uniform sampler2D originalColor;
uniform sampler1D colorMap;
in vec2 uv;
out vec4 color;
void main()
{
vec4 oldColor = texture(originalColor, uv);
color = texture(colorMap, oldColor.a);
}
非常简单,将 originalColor 纹理的 alpha 值从 0 变为 1 的片段,并将其转换为 colorMap 纹理为黑色到白色的新颜色。 两张图片应该没有区别!或者……至少,这是我的目标。
这是我对颜色图纹理的设置
glActiveTexture(GL_TEXTURE0);
glGenTextures(1, &colormap_texture_id); // get texture id
glBindTexture(GL_TEXTURE_1D, colormap_texture_id);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // required: stop texture wrapping
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // required: scale texture with linear sampling
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA32F, colormapColors.size(), 0, GL_RGBA, GL_FLOAT, colormapColors.data()); // setup memory
渲染循环:
GLuint textures[] = { textureIDs[currentTexture], colormap_texture_id };
glBindTextures(0, 2, textures);
colormapShader->use();
colormapShader->setUniform("originalColor", 0);
colormapShader->setUniform("colorMap", 1);
renderFullScreenQuad(colormapShader, "position", "texCoord");
我使用 1D 纹理作为颜色图,因为这似乎是可能在 GPU 内存中存储 1000 到 2000 个颜色图值索引的唯一方法。如果有更好的方法,请告诉我。我认为问题在于在两个像素之间进行插值的数学不适合我的目的。
我应该怎么做才能获得预期的结果?
为了确保没有恶作剧,我尝试遵循着色器代码:
color = texture(colorMap, oldColor.a); //incorrect results
color = texture(colorMap, (oldColor.r + oldColor.g + oldColor.b)/3); //incorrect
color = texture(colorMap, (oldColor.r + oldColor.g + oldColor.b + oldColor.a)/4); //incorrect
color = vec4(oldColor.a); //incorrect
color = oldColor; // CORRECT... obviously...
【问题讨论】:
-
您的图片链接给了我一个“未找到”页面
-
颜色图是否连续(例如渐变)?如果不是,
GL_LINEAR没有意义。 -
颜色图是 2 个像素,不确定它有多“连续”。图片链接已修复
标签: opengl textures color-mapping