基于2D纹理的值对1D纹理进行采样

时间:2012-11-15 19:42:13

标签: opengl glsl

我正在用GLubyte填充2D纹理,其中R(实数)的浮点值映射到(0,1)并乘以255给出值(0,255)。保存为GL_R8,因为我只需要纹理中的1个值。这可以例如表示数学函数。

我还上传了1d纹理作为colormap / colorbar。然后,我根据2D纹理的值从1D纹理中进行采样。

这就是我的片段着色器的工作原理:

#version 400
in vec2 f_textureCoord;

layout(location = 0) out vec4 FragColor;

uniform sampler2D textureData;
uniform sampler1D colorBar;


void main() {
    /* Values in the sampler are on (0, 1) * 255 => (0, 255) */
    vec3 texColor = texture2D(textureData, f_textureCoord).rgb;
    float s = texColor.r;

    /* Use the texture value as a coordinate in the 1D colorbar texture */
    vec3 color = texture1D(colorBar, s).rgb;

    float val = color.r;
    FragColor = vec4(val, val, val, 1);
}

使用此我收到以下错误:

  

glValidateProgram:验证错误:不同类型的采样器指向   到相同的纹理单元

但是,我的代码按预期工作,至少是渲染结果!

我的问题是:

1)为什么我会收到此错误/警告? --- 在评论中回答......

2)这是我正在尝试做的正确方法吗?我应该使用其他形式的缓冲区而不是在2D纹理中保存我的函数值吗?

3)我认为当我的数学函数(填充2D纹理)超过某些纹理大小限制时,我会遇到问题。关于如何解决这个问题的任何建议?

2 个答案:

答案 0 :(得分:2)

1。)在glDraw *命令之前调用glValidateProgram来检查是否正确设置了统一和属性位置。因此发出了错误的警告,因为程序链接后两个采样器纹理单元仍为零。

2。)如果这是关于使用颜色索引显示你的功能的结果,那没关系。 如果我理解正确textureData只包含灰色值。如果纹理中只需要一个颜色分量,则应编写

float s = texture2D(textureData, f_textureCoord).r;

3。)如果你需要显示的数据多于放入单个纹理的数据,你将不得不使用平铺(即将数据分成几个纹理并进行多次绘制)。

答案 1 :(得分:0)

glValidateProgram用于检测程序是否可用于使用当前OpenGL状态进行渲染。这包括纹理的当前绑定,统一缓冲区以及纹理直接访问的任何其他内容(绘制缓冲区和顶点属性不是此列表的一部分)。