Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ opengl三维纹理问题_C++_Opengl - Fatal编程技术网

C++ opengl三维纹理问题

C++ opengl三维纹理问题,c++,opengl,C++,Opengl,我试图在opengl中使用3d纹理来实现体绘制。每个体素都有一个rgba颜色值,当前渲染为面向屏幕的四元体(用于测试)。我似乎无法让采样器在着色器中给我一个颜色值。四边形总是以黑色结尾。当我更改着色器以生成颜色(基于xyz坐标)时,效果良好。我正在使用以下代码加载纹理: glGenTextures(1, &tex3D); glBindTexture(GL_TEXTURE_3D, tex3D); unsigned int colours[8]; colours[0] = Colour::

我试图在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);
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);
并使用以下代码进行渲染:

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);
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纹理也会发生同样的情况。

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

如果您愿意,我将您的答案移动到wiki答案。感谢发布您的解决方案。要正确渲染纹理,它必须是“完整的”(包括纹理图像和缩小/放大过滤器)。请参考OpenGL规范中的“纹理完整性”。实际上我也有同样的问题。不小心用GL_texture_2D为我的3D纹理创建了Mipmap,结果生成了黑色纹理。