Невозможно создать / сэмплировать 3D-текстуру (Qt / OpenGL) - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь отобразить слой в 3D-текстуре, созданной из некоторых 3D-данных, но все выбранные точки всегда черные (я думаю, что создание / выделение текстуры как-то не получается).Он отображается на плоскости с использованием оконных координат.Я проверил свои данные, это вектор с правильными значениями.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);
}

1 Ответ

0 голосов
/ 08 декабря 2018

glEnable (GL_TEXTURE_…) не действует при использовании шейдеров.Это пережиток эры конвейеров с фиксированными функциями.С другой стороны, текстура должна быть фактически привязана при рисовании.

В вашем коде у вас есть

gl.glBindTexture(GL_TEXTURE_3D, 0);

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

Теперь, поскольку это в коде инициализации, неясно, понимаете ли вы на самом деле последствияэти строки.Итак, давайте разберемся с этим:

gl.glBindTexture(GL_TEXTURE_3D, 0);

Это означает, что текстура 0 (которая с шейдерами является нулевой текстурой, но в старом и отключенном OpenGL-1.0 это фактически может быть сэмплированная форма) привязана к текстуре unit 0. С этого момента, при попытке сэмплирования из текстурного блока 0, он не будет ничего сэмплировать.

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

Установите форму сэмплера с именем "VOXELS" для сэмплирования из текстурного блока 0Какая бы текстура не была привязана к этому текстурному блоку в момент вызова функции рисования, эта текстура будет взята из выборки.

Где-то в вашей программе вы делаете вызов рисования.Вы не показали нам где.Но для того, чтобы ваш рисунок на самом деле пробовал вашу текстуру, вы должны привязать вашу 3d текстуру к текстурному блоку 0.

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_3D, volumeTexture);
draw_stuff();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...