c++ - opengl 3d纹理问题

标签 c++ opengl

我正在尝试在 opengl 中使用 3d 纹理来实现体积渲染。每个体素都有一个 rgba 颜色值,当前呈现为面向四边形的屏幕。(用于测试目的)。我似乎无法让采样器在着色器中给我一个颜色值。四边形总是以黑色结束。当我更改着色器以生成颜色(基于 xyz 坐标)时,它工作正常。我正在使用以下代码加载纹理:

glGenTextures(1, &tex3D);
glBindTexture(GL_TEXTURE_3D, tex3D);
unsigned int colours[8];

colours[0] = Colour::AsBytes<unsigned int>(Colour::Blue);
colours[1] = Colour::AsBytes<unsigned int>(Colour::Red);
colours[2] = Colour::AsBytes<unsigned int>(Colour::Green);
colours[3] = Colour::AsBytes<unsigned int>(Colour::Magenta);
colours[4] = Colour::AsBytes<unsigned int>(Colour::Cyan);
colours[5] = Colour::AsBytes<unsigned int>(Colour::Yellow);
colours[6] = Colour::AsBytes<unsigned int>(Colour::White);
colours[7] = Colour::AsBytes<unsigned int>(Colour::Black);

glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, colours);

colors 数组包含正确的数据,即前四个字节的值分别为 0、0、255、255,表示蓝色。在渲染之前,我将纹理绑定(bind)到第二个纹理单元,如下所示:

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_3D, tex3D);

并使用以下代码进行渲染:

shaders["DVR"]->Use();
shaders["DVR"]->Uniforms["volTex"].SetValue(1); 
shaders["DVR"]->Uniforms["World"].SetValue(Mat4(vl_one));
shaders["DVR"]->Uniforms["viewProj"].SetValue(cam->GetViewTransform() * cam->GetProjectionMatrix());

QuadDrawer::DrawQuads(8);

我以前使用这些类来设置着色器参数,它们工作正常。 quaddrawer 绘制八个实例四边形。顶点着色器代码如下所示:

#version 330

layout(location = 0) in vec2 position;
layout(location = 1) in vec2 texCoord;

uniform sampler3D volTex;
ivec3 size = ivec3(2, 2, 2);
uniform mat4 World; 
uniform mat4 viewProj;

smooth out vec4 colour;

void main()
{
    vec3 texCoord3D;

    int num = gl_InstanceID;

    texCoord3D.x = num % size.x;
    texCoord3D.y = (num / size.x) % size.y;
    texCoord3D.z = (num / (size.x * size.y));

    texCoord3D /= size;
    texCoord3D *= 2.0;
    texCoord3D -= 1.0;

    colour = texture(volTex, texCoord3D);
    //colour = vec4(texCoord3D, 1.0);   

    gl_Position = viewProj * World * vec4(texCoord3D, 1.0) + (vec4(position.x, position.y, 0.0, 0.0) * 0.05);

}

取消注释我将颜色值设置为 texcoord 的行效果很好,并使四边形着色。片段着色器很简单:

#version 330

smooth in vec4 colour;
out vec4 outColour;

void main()
{
    outColour = colour;
}

所以我的问题是,我做错了什么,为什么采样器没有从 3d 纹理中获取任何颜色值?

[编辑] 想通了但不能自己回答(新用户):

我一发布这个我就弄明白了,我会把答案贴出来帮助其他人(这不是专门的 3d 纹理问题,而且我之前也遇到过,D'oh!) .我没有为纹理生成 mipmap,默认的放大/缩小过滤器也没有设置为 GL_LINEAR 或 GL_NEAREST。繁荣!没有纹理。 2d 纹理也会发生同样的事情。

最佳答案

我一发布这个我就弄明白了,我会把答案贴出来帮助其他人(这不是专门的 3d 纹理问题,而且我之前也遇到过,D'oh!) .我没有为纹理生成 mipmap,默认的放大/缩小过滤器也没有设置为 GL_LINEAR 或 GL_NEAREST。繁荣!没有纹理。 2d 纹理也会发生同样的事情。

关于c++ - opengl 3d纹理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11178535/

相关文章:

c++ - 如何明确让用户知道模板参数的要求?

c++ - 我如何检查重构时我没有破坏任何东西?

c++ - 需要有关指针和耗时程序的建议。如何修复无效操作数和无法转换错误?

c++ - 为什么要为具有非平凡析构函数的类声明 constrexpr 构造函数(例如 unique_ptr、std::variant)

Cocoa 应用程序在 OpenGL 调用时崩溃

opengl - GPU DirectX 与 OpenGL 支持

c++ - 无法从不是原点的其他地方旋转对象

c++ - 移动设备的最佳加密库?

c++ - 为什么 glGetProgramiv GL_ACTIVE_UNIFORMS 偶尔会返回垃圾并使我的程序崩溃?