OpenGL 3D текстурные координаты - PullRequest
2 голосов
/ 30 марта 2011

У меня проблема с 3D-текстурой в OpenGL.

Я установил текстуру через

glTexImage3D(GL_TEXTURE_3D, 0, GL_LUMINANCE, 640, 480, 8, 0, GL_RED, GL_UNSIGNED_BYTE, tex3Ddata);

с tex3Ddata всего 8 срезов 640x480 битовых карт. Теперь, когда я пытаюсь получить доступ к различным фрагментам с координатами текстуры, изображения почему-то смешиваются друг с другом, поэтому я не могу правильно установить координаты, но я не знаю, почему. Сами фрагменты текстуры 8-битные монохромные.

Код для отображения:

for(unsigned int i = 0; i < g_numCameras; i++) {
    float tx = ((float)i) / ((float)g_numCameras - 1);
    //tx = 0.5f; //this is for testing only
    float fI = ((float)i) / ((float)g_numCameras);
    if( i < (g_numCameras >> 1)) {
        glTexCoord3f(0.0f, 1.0f, tx); 
        glVertex3f( -1.0f + fI * 4.0f, 0.0f,  0.5f);

        glTexCoord3f(1.0f, 1.0f, tx); 
        glVertex3f( -1.0f + (fI + 1.0f / ((float)g_numCameras)) * 4.0f, 0.0f,  0.5f);

        glTexCoord3f(1.0f, 0.0f, tx); 
        glVertex3f( -1.0f + (fI + 1.0f / ((float)g_numCameras)) * 4.0f,  1.0f,  0.5f);

        glTexCoord3f(0.0f, 0.0f, tx); 
        glVertex3f( -1.0f + fI * 4.0f,  1.0f,  0.5f);
    }
    else {
        fI -= 0.5f;
        glTexCoord3f(0.0f, 1.0f, tx); 
        glVertex3f( -1.0f + fI * 4.0f, -1.0f,  0.5f);

        glTexCoord3f(1.0f, 1.0f, tx); 
        glVertex3f( -1.0f + (fI + 1.0f / ((float)g_numCameras)) * 4.0f, -1.0f,  0.5f);

        glTexCoord3f(1.0f, 0.0f, tx); 
        glVertex3f( -1.0f + (fI + 1.0f / ((float)g_numCameras)) * 4.0f,  0.0f,  0.5f);

        glTexCoord3f(0.0f, 0.0f, tx); 
        glVertex3f( -1.0f + fI * 4.0f,  0.0f,  0.5f);
    }
}

g_numCameras равно 8, поэтому я ожидаю, что срезы будут доступны через Z-координаты 0.0f, 1/7, 2/7, ..., 1.0f. Все же это всегда интерполируется. Я тестировал с tx = 0.5f; также, но это также смесь изображений. Координаты x / y работают должным образом, и 8 квадов расположены так, как и ожидалось, просто разрезание куба не работает так, как я ожидал.

Есть идеи, что я здесь делаю не так? (Я не смог найти эквивалентный ответ / пример по 3D текстурам).

Я также проверил правильность данных, загрузив 8 раз одно и то же изображение, и это работало просто отлично (поскольку интерполяция приведет к исходному изображению, я получил исходное изображение там).

Ответы [ 3 ]

11 голосов
/ 30 марта 2011

Что с вами происходит, так это то, что эти текстурные координаты обращаются не к центрам текселей, а к краям между текселями.Допустим, у вас есть одномерная текстура размером 8

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

Тогда самый первый | находится в координате текстуры 0.0, а самый последний | находится в координате текстуры 1.0

0.0                             1.0
0/8                             8/8
 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

Позвольте мне написать весь набор дробей:

0/8 1/8 2/8 3/8 4/8 5/8 6/8 7/8 8/8
 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

То, что вы хотите поразить, это центры текселей, то есть числа между столбцами.| 1 |находится в середине от 0/8 до 1/8, т.е. (0/8 + 1/8) / 2 = 1/16, | 2 |находится между 1/8 и 2/8 = (1/8 + 2/8) / 3 = 3/16 и т. д.

Итак, координаты текстуры, к которым вы хотите обратиться, равны 1/16 3/165/16 7/16 9/16 11/16 13/16 15/16

или в более общем виде: (1 + 2*t) / 2*dim

3 голосов
/ 30 марта 2011

Ваши ожидания не верны.

каждый срез i (индексирование от 0) доступно в (i+0.5) / num_slices.

0.f означает интерполяцию на полпути между первым срезом и границей, 1.f означает интерполяцию на полпути между последним срезом и границей (при условии фиксации).

0,5, как этоОказывается, точно в середине, следовательно, между срезами 3 и 4 (если начать отсчет с 0).Таким образом, вы получаете смесь между 2 ломтиками.

2 голосов
/ 30 марта 2011

Допустимо ли звонить по следующему номеру:

glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

Это должно отключить интерполяцию, я думаю.

...