OpenGL 3D 纹理问题
opengl 3d texture issue
我正在尝试在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 纹理问题,而且我之前也犯过,D'oh!我没有为纹理生成 mipmap,默认的放大/缩小滤镜也没有设置为 GL_LINEAR 或GL_NEAREST。繁荣!没有纹理。2D 纹理也会发生同样的事情。
一旦我发布了这个,我就想通了,我会提出答案来帮助其他人(这不是一个特定的 3D 纹理问题,我之前也犯过,D'oh!我没有为纹理生成 mipmap,默认的放大/缩小滤镜也没有设置为 GL_LINEAR 或GL_NEAREST。繁荣!没有纹理。2D 纹理也会发生同样的事情。
相关文章:
- Qt OpenGL 渲染到纹理性能问题
- SFML 纹理使用问题
- Opengl问题:很可能是简单的纹理问题
- 从文件问题加载纹理 Android NDK 和 OpenGL
- 如何在 Opengl 中使用多个纹理解决此问题
- 初始化多个纹理 OpenGL、SDL C++ 时出现问题
- 呈现纹理D3D11的问题
- 着色器和纹理坐标问题
- 在我的模型DirectX11中添加纹理的问题
- SDL2-从Surface(屏幕快照)创建纹理的问题
- 我的深度纹理有什么问题?
- Qt OpenGL - 纹理透明度问题
- OpenGL 3D 纹理问题
- 使用纹理,法线和索引列表从VBO绘制OpenGL对象的问题
- C++返回 sf::纹理时遇到问题
- 土壤,NPOT纹理问题
- OpenGL 3.3:在3D场景上显示2D纹理的问题
- 在 OpenGL-ES 中使用 Android NDK 上的C++创建具有"glTexImage2D"的纹理会导致问题
- 渲染到纹理问题
- Cinder & C++:镜像纹理和高效绘图问题