gpt4 book ai didi

c++ - 无法创建/采样 3D 纹理 (Qt/OpenGL)

转载 作者:行者123 更新时间:2023-11-30 03:19:28 25 4
gpt4 key购买 nike

我正在尝试在从某些 3D 数据创建的 3D 纹理中显示一个图层,但所有采样点始终为黑色(我猜我的纹理创建/分配不知何故失败了)。它正在使用窗口坐标在平面上呈现。我检查了我的数据,它是一个具有正确值的 vector 。 glEnable(GL_TEXTURE_3D) 之前被调用过。任何线索为什么会失败?

创建纹理的函数:

bool VolumeRender::setVolumeData(QOpenGLShaderProgram *program, vector<unsigned short> v, int x, int y, int z){
voxels.resize(v.size(), 0);

cout << "Processing texture" << endl;

unsigned short sMax = 0;
unsigned short sMin = 32768;

for (unsigned int i =0; i< voxels.size(); i++){
sMax = max(sMax, v[i]);
sMin = min(sMin, v[i]);
} for (unsigned int i =0; i< voxels.size(); i++) voxels[i] = (v[i] - sMin)/(float)(sMax-sMin);

cout << "Loading 3D texture" << endl;

gl.glActiveTexture(GL_TEXTURE0);
gl.glGenTextures(1, &volumeTexture);
gl.glBindTexture(GL_TEXTURE_3D, volumeTexture);

gl.glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
gl.glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
gl.glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
gl.glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
gl.glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER);

gl.glTexImage3D(GL_TEXTURE_3D, 0, GL_RED, x, y, z, 0, GL_RED, GL_FLOAT, &voxels[0]);

gl.glBindTexture(GL_TEXTURE_3D, 0);

program->bind();
program->setUniformValue("VOXELS", 0);
program->release();

voxelsLoaded = true;
return true;
}

简单的片段着色器:

#version 330 core

uniform sampler3D VOXELS;
uniform vec2 SIZE;

out vec4 color;

void main(){
vec2 coords = (gl_FragCoord.xy - 0.5) / SIZE;
vec3 texcoords = vec3(coords, 0.5);
color = texture(VOXELS, texcoords);
}

最佳答案

glEnable(GL_TEXTURE_…) 在使用着色器时无效。它是固定功能管道时代的遗物。另一方面,纹理在绘制时必须实际绑定(bind)。

在你的代码中你有

gl.glBindTexture(GL_TEXTURE_3D, 0);

program->bind();
program->setUniformValue("VOXELS", 0);
program->release();

因为这是在初始化代码中,所以不清楚您是否真正理解这些行的后果。那么让我们分解一下:

gl.glBindTexture(GL_TEXTURE_3D, 0);

这意味着纹理 0(带有着色器的是 nil 纹理,但在旧的和破坏的 OpenGL-1.0 中它实际上可以被采样形式)被绑定(bind)到纹理 unit 0。从那里开始,当尝试从纹理单元 0 采样时,它不会采样任何东西。

program->bind();
program->setUniformValue("VOXELS", 0);
program->release();

将名称为“VOXELS”的采样器统一设置为从纹理单元 0 采样。无论在调用绘制函数时绑定(bind)到该纹理单元的纹理是什么,都将从该纹理采样。

在您的程序中的某处,您正在进行绘制调用。你没有告诉我们在哪里。但是为了让您的绘图真正从纹理中采样,您必须将 3d 纹理绑定(bind)到纹理单元 0。

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_3D, volumeTexture);
draw_stuff();

关于c++ - 无法创建/采样 3D 纹理 (Qt/OpenGL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53686656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com