我用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: Validation Error: Samplers of different types point
to the same texture unit
但是,我的代码按预期工作,至少是渲染结果!
我的问题是:
1)为什么我会收到此错误/警告? —在评论中回答……
2)这是我正在尝试做的正确方法吗?我应该使用其他形式的缓冲区而不是在2D纹理中保存我的函数值吗?
3)我假设当我的数学函数(填充2D纹理)超过某些纹理大小限制时,我会遇到问题.关于我应该如何解决这个问题的任何建议?
最佳答案 1.)在glDraw *命令之前调用glValidateProgram来检查是否正确设置了统一和属性位置.因此发出了错误的警告,因为在程序链接之后两个采样器纹理单元仍为零.
2.)如果这是关于使用颜色索引显示你的功能的结果,那没关系.
如果我理解正确textureData只包含灰色值.如果你只需要纹理中的一个颜色组件,你应该写
float s = texture2D(textureData, f_textureCoord).r;
3.)如果需要显示的数据多于放入单个纹理的数据,则必须使用平铺(即将数据拆分为多个纹理并进行多次绘制).