OpenGL:如何创建颜色图纹理?

OpenGL: How do you create a colormap texture?

colorMap实例化:

GLfloat colormapColors[16];

这是我的颜色图数据:

colormapColors[0] =  0.0f; // black
colormapColors[1] =  0.0f;
colormapColors[2] =  0.0f;
colormapColors[3] =  0.0f;

colormapColors[4] =  0.0f; // blue
colormapColors[5] =  0.0f;
colormapColors[6] =  1.0f;
colormapColors[7] =  0.0f;

colormapColors[8] =  1.0f; // red
colormapColors[9] =  0.0f;
colormapColors[10] = 0.0f;
colormapColors[11] = 0.0f;

colormapColors[12] = 1.0f; // white
colormapColors[13] = 1.0f;
colormapColors[14] = 1.0f;
colormapColors[15] = 1.0f;

在我的渲染循环中我有

glGenTextures(1, &texture); // get texture id
glBindTexture(GL_TEXTURE_1D, texture);
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA32F, 4, 0, GL_RGBA, GL_FLOAT, colormapColors);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // linear interpolation when too small
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // linear interpolation when too bi
glErrorCheck;

片段着色器:

vec4 color = texture(ourTexture, clamp(alpha,0.0,1.0));
gl_FragColor = vec4(color.r, color.g, color.b, 1.0);

alpha是根据到中心的距离计算的,我得到:

所以,很明显我们有黑色、蓝色、红色、白色。应该没有灰色。我认为这是一个数据对齐问题。我做错了 glTexImage1D 吗?

您需要添加 glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) 这样边缘纹素就不会与另一侧的纹素混合。

您还可以将 alpha 值限制在纹素中心 ([1/texSize;1-1/texSize]),只是为了演示纹素插值的工作原理。