Bсем привет!
Я вывожу *.dds в ОpenGL, но из-за того что OpenGL начинает отсчет от левого нижнего угла, а DirectX от верхнего левого угла(а dds это ж директовская фишка) у меня изображения перевернутые получаются. Подскажите пожалуйста как их вернуть в нормальный вид. Там кажется надо как-то хитро текстурные координаты переприсвоить или как?
учше перевернуть саму текстуру во время загрузки, меняй строки в обратном порядке
В смысле "меняй строки в обратном порядке" ?
оно compressed, там не особо то поменяешь...
варианта два - инвертировать t-координату (т.е. вместо t будет 1 - t) (можно при экспорте моделек), либо выставлять соответствующую текстурную матрицу (смотреть доки к glMatrixMode(GL_TEXTURE))
beetle2001
Загрузил картинку в системную память, повернул её как надо, после этого зафигачил в видеопамять... В чём проблема та?
keltar
>оно compressed, там не особо то поменяешь...
То есть? А каким макаром сжатая текстура опенглу скармливается?
glCompressedTexImage2D
у dds в том и прикол, что загружать быстро - не надо тратить время на распаковку
keltar
>glCompressedTexImage2D
Не знал, я всегда думал, что даётся не сжатая текстура, а Видюха уже в видеопамять её сжатую записывает... А чтобы можно было указатель на уже сжатое давать, это новость для меня...
-- удалил, в прошлом мессадже правка успешной получилась
А что за t-координата? Просто я взял уже готовый лоадер и не раздуплился в принципе его работы
>>А что за t-координата?
ну это вроде y, тока для текстур
beetle2001
Напиши софтину, которая будет автоматически все текстуры пережимать в DDS, переворачивая координату.
Или текстурной матрицей:
glMatrixMode(GL_TEXTURE));
glScalef(1,-1,1);
beetle2001
для пространственных координат юзаются обозначения (x, y, z, w), для текстурных - (s, t, r, q)
Я уже просто в фотошопе все флипнул, но все равно охота раздуплиться как это программно сделать. Я не совсем понимаю где искать эту t координату (смысл ее то я понял конечно), но вот в коде не пойму как её выцепить. Вот мой загрузчик: http://www.gamedev.ru/download/?id=3846
Может подскажете мне на примере кода, плиз ....
iPriS же написал как можно для этого юзать текстурную матрицу. Либо флипать t-координату у моделек - т.е. чтобы когда текстурные координаты задаёшь - было не t а 1 - t
>Я не совсем понимаю где искать эту t координату (смысл ее то я понял конечно), но вот в коде не пойму как её выцепить.
glTexCoord2f(...) принимает два параметра, где 2-й - как раз и есть эта t координата, или же координата y, что пофиг.
Соотв если ты в программе юзаешь что-то типа glTexCoord2f(a,b), то надо это заменить на glTexCoord2f(a,1-b) и т.д.
Если ты юзаешь glDrawArray, VBO и иже с ними, то при подготовке массива вершин тебе надо сделать примерно следущее:
Vertex->texcoord.y = 1 - Vertex->texcoord.y.
Или
Vertex->texcoord.t = 1 - Vertex->texcoord.t.
Или
Vertex->texcoord[1] = 1 - Vertex->texcoord[1], это смотря как ты текстуры хранишь.
Если делать это текстурной матрицей, то будет так:
(при применении текстуры)
glActiveTexture(GL_TEXTURE_0+___UNIT___);
glBindTexture(GL_TEXTURE_2D,___Твоя_текстура___);
glMatrixMode(GL_TEXTURE));
glLoadIdentity;
//Устанавливаешь свою матрицу
//типа glScalef(scale.x,scale.y,scale.z);
//glTranslatef(offset.x,offset.y,offset.z);
//или glLoadMatrix(&MyMatrix);
glScalef(1,-1,1);
glMatrixMode(GL_MODELVIEW));
//Отрисовка
glActiveTexture(GL_TEXTURE_0+___UNIT___);
glBindTexture(GL_TEXTURE_2D,0);
Лучше, конечно, glMatrixMode десять раз не вызывать, и перед тем как ты начал смену текстур один раз сделать glMatrixMode(GL_TEXTURE)), а после glMatrixMode(GL_MODELVIEW));
Обрати внимание, что матрица - она общая для TEXTURE UNIT'a, а не для текстуры, т.е. каждый раз надо по новой все выставлять.
>Я уже просто в фотошопе все флипнул
В смысле, переделал все исходные, несжатые текстуры в DDS по-новому? А не проще это делать специальной софтиной автоматически? Прикинь, если у тебя будет 10000 текстур? Это на месяц работы!
В загрузчике вроде у тебя все ОК, но со сжатой текстурой конечно ничо не перевернеш.
Тема в архиве.