当前位置: 首页 > 知识库问答 >
问题:

opengl 3d纹理问题

苗承
2023-03-14

我试图在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);

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

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);

我以前使用过这些类来设置着色器参数,它们工作得很好。四边形抽屉绘制八个实例化的四边形。顶点着色器代码如下所示:

#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纹理问题,我以前也遇到过,哦!)。我没有为纹理生成mipmap,默认的放大/缩小过滤器也没有设置为GL_线性或GL_最近。繁荣没有纹理。2d纹理也会发生同样的情况。

共有1个答案

窦哲彦
2023-03-14

一旦我发布了这篇文章,我就想好了,我会给出答案来帮助其他人(这不是一个具体的3d纹理问题,我以前也遇到过,哦!)。我没有为纹理生成mipmap,默认的放大/缩小过滤器也没有设置为GL_线性或GL_最近。繁荣没有纹理。2d纹理也会发生同样的情况。

 类似资料:
  • 我可以加载725x483 jpg纹理,但不能加载725x544 代码: 我有错误:-VS2012 Express 我调试了SOIL一点,似乎错误是在我们调用glTexImage2D(在SOIL库中)之后出现的。 当我在加载代码中添加时,效果很好。 这个错误也发生在AMD(5570)和英特尔(HD 4000)上。

  • 我正在尝试制作一个四边形,并了解这个小样本是如何工作的。我的代码不是原创的,它混合了各种各样的例子。 纹理:https://jamesmwake.files.wordpress.com/2015/10/uv_texture_map.jpg?w=660 我的问题: 当我在glTexParameteri中将GL_TEXTURE_MIN_FILTER更改为GL_TEXTURE_MAG_FILTER时,纹

  • 译注 注意,由于作者对教程做出了更新,之前本节使用的是SOIL库,但现在改为了使用stb_image.h库,关于SOIL配置的部分现在已经被修改,但我仍决定将这部分教程保留起来,放到一个历史存档中,如果有需要的话可以到这里来查看。 我们已经了解到,我们可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多的颜色。这将会

  • 将图片加载后创建纹理对象,纹理将直接用于绘制 createTextures(object) 纹理异步加载,批量异步加载接口 手Q版本:7.8.0 函数参数object属性: 属性名 类型 是否必填 说明 file Array 是 要加载的图片文件数组 success Function 否 接口调用成功回调 fail Function 否 接口调用失败回调 complete Function 否 接

  • 我在FBO中从渲染缓冲区切换到深度纹理。但它似乎不包含任何深度数据。如果我把这个纹理渲染成全屏的四边形,所有的东西都是黑色的。我非常确定纹理和FBO设置是好的。FBO已经完成,如果我清除了深度,让我们对格雷说: glClearDepth(0.5f); 然后我看到了斑点通道中的颜色,但没有看到几何渲染中的数据。 总之,这就是我创建纹理的方式: 其中intFmt是GL_DEPTH_component

  • 如果我创建一个.png 1024 x 1024的纹理,并在中间画一个124 x 124的圆,它的周围将是空的,它使用的RAM是否与我在124x124空间上画一个124 x 124的圆相同?