gpt4 book ai didi

opengl - 根据 2D 纹理的值对 1D 纹理进行采样

转载 作者:行者123 更新时间:2023-12-02 02:49:03 30 4
gpt4 key购买 nike

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

我还上传了 1d 纹理作为颜色图/颜色条。然后,我根据 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.) 如果您需要显示的数据多于可以放入单个纹理中的数据,则必须使用平铺(即将数据拆分为多个纹理并进行多次绘制)。

关于opengl - 根据 2D 纹理的值对 1D 纹理进行采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13404910/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com