目前,我正在尝试实现一个片段着色器,它通过结合粒子内部流体相的百分比来混合不同流体粒子的颜色。因此,例如,如果流体1具有15%的粒子,而流体2具有85%的粒子,则生成的颜色应反映该比例。因此,我有一个缓冲区纹理,包含反射为0,1的浮点值的百分比,每个粒子和每个相位,以及一个包含流体颜色的纹理。
缓冲区纹理当前包含子序列列表中每个粒子的百分比。例如:
|粒子1百分比1|粒子1百分比2|粒子2百分比1|粒子2百分比2| ...
我已经通过将纹理直接分配给粒子或将volFrac分配给最终颜色的红色部分来测试纹理的正确性。我还尝试了不同的GLSL调试器,试图分析问题,但在尝试之后,所有流行的选项都不能在我的机器上工作。
#version 330
uniform float radius;
uniform mat4 projection_matrix;
uniform uint nFluids;
uniform sampler1D colorSampler;
uniform samplerBuffer volumeFractionSampler;
in block
{
flat vec3 mv_pos;
flat float pIndex;
}
In;
out vec4 out_color;
void main(void)
{
vec3 fluidColor = vec3(0.0, 0.0, 0.0);
for (int fluidModelIndex = 0; fluidModelIndex < int(nFluids); fluidModelIndex++)
{
float volFrac = texelFetch(volumeFractionSampler, int(nFluids * In.pIndex) + fluidModelIndex).x;
vec3 phaseColor = texture(colorSampler, float(fluidModelIndex)/(int(nFluids) - 1)).xyz;
fluidColor = volFrac * phaseColor;
}
out_color = vec4(fluidColor, 1.0);
}
以及纹理初始化的一小段。
//Texture Initialisation and Manipulation here
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_1D, m_textureMap);
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, nFluids, 0, GL_RGB, GL_FLOAT, color_map);
//Creation and Initialisation for Buffer Texture containing the volume Fractions
glBindBuffer(GL_TEXTURE_BUFFER, m_texBuffer);
glBufferData(GL_TEXTURE_BUFFER, nFluids * nParticles * sizeof(float), m_volumeFractions.data(), GL_STATIC_DRAW);
glBindBuffer(GL_TEXTURE_BUFFER, 0);
glBindTexture(GL_TEXTURE_BUFFER, m_bufferTexture);
glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, m_texBuffer);
现在的问题是,如果我将缓冲区纹理的信息与纹理的信息相乘,应该渲染的粒子将完全消失,没有任何警告或其他错误消息。所以如果我使用下面的语句,粒子就会消失:
fluidColor = volFrac * phaseColor;
有没有人知道为什么会这样,或者我如何进一步调试这个问题?
发布于 2019-06-10 00:53:45
有人知道为什么会这样吗?
是。您似乎对colorSampler
和volumeFractionSampler
使用了相同的纹理单元,这在规范中是不允许的。引用OpenGL 4.6 core profile spec的7.11节
不允许将不同采样器类型的变量指向程序对象中的同一纹理图像单元。只有在发出触发着色器调用的下一个渲染命令时,才能检测到这种情况,然后将生成
INVALID_OPERATION
错误。
因此,虽然您可以绑定不同的纹理同时执行纹理单位0的不同目标,但每个绘制调用只能使用每个纹理单位的一个特定目标。如果只使用一个采样器或另一个采样器(如果它们不影响着色器的输出,着色器编译器将综合优化这些采样器),则您处于合法使用案例中,但一旦您同时使用这两个采样器,它将无法工作。
https://stackoverflow.com/questions/56514958
复制相似问题