lib3ds + opengl текстура отображается плиткой
Всем привет, имеется проблема, при наложении текстуры и изменения её размера она ложится плиткой, пытаюсь поставить TEXTURE_NO_TILE в настройках текстуры, однако это не к чему не приводит.
Вот структура класса текстуры и меша
Вот структура класса текстуры и меша
|
А это без изменения размера
Похоже на то, что ты как то поменял текстурные координаты, так что текстура занимает лишь малую часть модели, что приводит к повторению текстуры. В параметрах текстуры наверное стоит GL_REPEAT…
Но какой это уже нужно смотреть спецификацию 3ds
ЗЫ.Сохраняю с флагом NO_TILE но всёравно флаг мозаичности не убирается… уже не знаю что делать(
Мой файл 3D модели состоит из 4-х мешей, так-же имеется 2 материала, как привязать определённый материал к определённому мешу?
Для сохранения?
Да для сохранения… но тоже уже разобрался)
Не мог определится как правильно привязать текстуру, потом почему-то из 3-х текстур на модель вешалось лиш 2. Решение проблемы вогнало меня в истерику, я даже подумать не мог, что имена текстур должны быть уникальными, так как редактор считывает первую попавшеюся (если имена повторяются).
Однако теперь я вобще заблудился, не как не получается ( в программе) отобразить все текстуры которые привязаны к модели, работает только с одной текстурой.
unsigned int mGlTextureObject;
unsigned int MakeGlTexture( int Format, IntPtr pixels, int w, int h)
{
unsigned int texObject=0;
Gl::glGenTextures(1,texObject);
Gl::glPixelStorei( Gl::GL_UNPACK_ALIGNMENT, 1);
Gl::glBindTexture( Gl::GL_TEXTURE_2D, texObject);
Gl::glTexParameteri( Gl::GL_TEXTURE_2D, Gl::GL_TEXTURE_WRAP_S,Gl::GL_CLAMP_TO_EDGE);
Gl::glTexParameteri( Gl::GL_TEXTURE_2D, Gl::GL_TEXTURE_WRAP_T, Gl::GL_CLAMP_TO_EDGE);
Gl::glTexParameteri( Gl::GL_TEXTURE_2D, Gl::GL_TEXTURE_MAG_FILTER, Gl::GL_LINEAR);
Gl::glTexParameteri( Gl::GL_TEXTURE_2D, Gl::GL_TEXTURE_MIN_FILTER, Gl::GL_LINEAR);
Gl::glTexEnvf( Gl::GL_TEXTURE_ENV, Gl::GL_TEXTURE_ENV_MODE, Gl::GL_REPLACE);
switch (Format)
{
case Gl::GL_RGB:
Gl::glTexImage2D( Gl::GL_TEXTURE_2D, 0, Gl::GL_RGB, w, h, 0, Gl::GL_RGB, Gl::GL_UNSIGNED_BYTE, pixels);
break ;
case Gl::GL_RGBA:
Gl::glTexImage2D( Gl::GL_TEXTURE_2D, 0, Gl::GL_RGBA, w, h, 0, Gl::GL_RGBA, Gl::GL_UNSIGNED_BYTE, pixels);
break ;
}
return texObject;
}
//тут в строку url присваевается путь к текстуре из массива материалов и передаётся на обработку в функцию MakeGlTexture
for(int i=0;i<model->meshes->Count;i++)
mesh.Add(model->meshes[i]);
for(int i=0;i<model->materials->Count;i++)
material.Add(model->materials[i]);
int imageId=0;
if(material.Count>0)
{
Il::ilGenImages(1,Convert::ToInt32(imageId));
Il::ilBindImage(imageId);
String ^ url=material[matid]->texture1_map->name;
Il::ilLoadImage(url);
mGlTextureObject=0;
int width=Il::ilGetInteger(Il::IL_IMAGE_WIDTH);
int height=Il::ilGetInteger(Il::IL_IMAGE_HEIGHT);
int bitspp=Il::ilGetInteger(Il::IL_IMAGE_BITS_PER_PIXEL);
switch(bitspp)
{
case 24:mGlTextureObject=MakeGlTexture(Gl::GL_RGB,Il::ilGetData(),width,height);
break;
case 32:mGlTextureObject=MakeGlTexture(Gl::GL_RGBA,Il::ilGetData(),width,height);
break;
}
Il::ilDeleteImage(Convert::ToInt32(imageId));
}
//ну и собственно отрисовка
void display()
{
Gl::glEnable(Gl::GL_DEPTH_TEST);
Gl::glEnable(Gl::GL_TEXTURE_2D);
Gl::glBindTexture(Gl::GL_TEXTURE_2D,mGlTextureObject);
Gl::glDepthFunc(Gl::GL_LEQUAL);
Gl::glClear(Gl::GL_COLOR_BUFFER_BIT|Gl::GL_DEPTH_BITS);
Gl::glClearColor(0, 0, 0, -1);
Gl::glLoadIdentity();
lightup();
Gl::glScalef(0.5,0.5,0.5);
Gl::glTranslatef(0.0,-1200.0,-1500.0);
Gl::glRotatef(280, 1, 0, 0);
Gl::glRotatef(rotat, 0, 0, 1);
Gl::glColor3f(50.0,100.0,0.0);
long meshcount;
for(meshcount=0;meshcount<model->meshes->Count;meshcount++)
{
for(int fd=0;fd<mesh[meshcount]->faces->Count;fd++)
face.Add(mesh[meshcount]->faces[fd]);
if(material.Count>0)
{
for(long i=0;i<mesh[meshcount]->nfaces;i++)
{
Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_DIFFUSE,material[face[i]->material]->diffuse);
Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_AMBIENT,material[face[i]->material]->ambient);
Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_SPECULAR,material[face[i]->material]->specular);
}
}
}
face.Clear();
for(meshcount=0;meshcount<model->meshes->Count;meshcount++)
{
for(int fd=0;fd<mesh[meshcount]->faces->Count;fd++)
face.Add(mesh[meshcount]->faces[fd]);
for(long i=0;i<mesh[meshcount]->nfaces;i++)
{
Gl::glColor3f(50.0,100.0,0.0);
Gl::glBegin(Gl::GL_TRIANGLES);
Gl::glTexCoord2f(mesh[meshcount]->texcos[face[i]->index[0]]->s, mesh[meshcount]->texcos[face[i]->index[0]]->t);
Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[0]]->ToArray());
Gl::glTexCoord2f(mesh[meshcount]->texcos[face[i]->index[1]]->s, mesh[meshcount]->texcos[face[i]->index[1]]->t);
Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[1]]->ToArray());
Gl::glTexCoord2f(mesh[meshcount]->texcos[face[i]->index[2]]->s, mesh[meshcount]->texcos[face[i]->index[2]]->t);
Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[2]]->ToArray());
Gl::glEnd();
}
face.Clear();
}
}
К сожалению не помню как с загрузкой рассширений в Tao, вроде там их загрузать не надо, тоесть все функции OpenGL 2.1 есть.