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]
),只是为了演示纹素插值的工作原理。
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]
),只是为了演示纹素插值的工作原理。