GLSL无法获取sampler3D值

时间:2019-04-24 16:54:03

标签: c++ opengl glsl glfw

我无法在GLSL片段着色器中获取sampler3D值。

我正在用GLSL编写着色器,并希望将sampler3D(3d纹理)用作体积数据并进行体积渲染。但是,似乎我无法将3d纹理绑定到我的着色器的sampler3D。 texture3D()始终在着色器端返回(0,0,0,0)。但是在我的应用程序方面,我可以使用glGetTexImage来获取数据。

应用程序侧(dS是Shader类对象):

dS.use();
dS.setInt("volumeData", 0);
uint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_3D, texture);
float data[64];
for (int i = 0; i < 64; ++i)    data[i] = 1.0f;
glTexImage3D(GL_TEXTURE_3D, 0, GL_R16F, 4, 4, 4, 0, GL_RED, GL_FLOAT, data);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_3D, 0);
float read[64];
glBindTexture(GL_TEXTURE_3D, texture);
glGetTexImage(GL_TEXTURE_3D, 0, GL_RED, GL_FLOAT, read);
std::cout << read[0] << "," << read[63] << std::endl;   // 1,1
glBindTexture(GL_TEXTURE_3D, 0);

// When drawing.

dS.use();
dS.setMat4("model", glm::mat4(1.0f));
dS.setMat4("view", view);
dS.setMat4("projection", projection);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_3D, texture);
cube.draw();

顶点着色器

#version 330 core
// for snow rendering
layout (location = 0) in vec3 aPos;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
    gl_Position = projection * view * model * vec4(aPos, 1.0);
}

片段着色器

#version 330
out vec4 FragColor;

uniform sampler3D volumeData;

void main()
{
    ivec3 size = textureSize(volumeData, 0);
    float c = texture3D(volumeData, vec3(0)).x;
    if (size.x == 1)
        FragColor = vec4(1.0, 0.0, c, 1.0);
    else if (size.x > 2)
        FragColor = vec4(0.0, 1.0, 0.0, 1.0);
    else if (size.x == 0)
        FragColor = vec4(0.0, 0.0, 1.0, 1.0);
    else
        FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

我只有一个红色的多维数据集,这意味着size.x == 1,texture3D返回0,预期为size.x == 4,texture3D返回1.0

我对2D纹理使用了类似的方法,并且有效。所以我想我的着色器课是对的。而且我还尝试在执行任何3d纹理操作之前添加glEnable(GL_TEXTURE_3D)。

我不确定这是否有帮助:我使用glfw-3.2.1 WIN64很高兴。

1 个答案:

答案 0 :(得分:0)

我解决了。 这是一个非常愚蠢的错字。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

应使用GL_TEXTURE_3D而不是GL_TEXTURE_2D。 并且由于GL_TEXTURE_MIN_FILTER的默认状态为GL_NEAREST_MIPMAP_LINEAR。导致mipmap不完整。