lib3ds + opengl текстура отображается плиткой

Всем привет, имеется проблема, при наложении текстуры и изменения её размера она ложится плиткой, пытаюсь поставить TEXTURE_NO_TILE в настройках текстуры, однако это не к чему не приводит.
Вот структура класса текстуры и меша
/*http://esate.ru, revaldo666*/

 [Flags]
   public enum Lib3dsTextureMapFlags
   {
      LIB3DS_TEXTURE_DECALE = 0x0001,
      LIB3DS_TEXTURE_MIRROR = 0x0002,
      LIB3DS_TEXTURE_NEGATE = 0x0008,
      LIB3DS_TEXTURE_NO_TILE = 0x0010,
      LIB3DS_TEXTURE_SUMMED_AREA = 0x0020,
      LIB3DS_TEXTURE_ALPHA_SOURCE = 0x0040,
      LIB3DS_TEXTURE_TINT = 0x0080,
      LIB3DS_TEXTURE_IGNORE_ALPHA = 0x0100,
      LIB3DS_TEXTURE_RGB_TINT = 0x0200
   }
 public class Lib3dsTextureMap
   {
      //public uint user_id;
      //public object user_ptr;
      public string name = "";
      public Lib3dsTextureMapFlags flags;
      public float percent;
      public float blur;
      public float[] scale = new float[2];
      public float[] offset = new float[2];
      public float rotation;
      public float[] tint_1 = new float[3];
      public float[] tint_2 = new float[3];
      public float[] tint_r = new float[3];
      public float[] tint_g = new float[3];
      public float[] tint_b = new float[3];
   }
public class Lib3dsMaterial
   {
      //public uint user_id;
      //public object user_ptr;
      public string name = "";                       // Material name
      public float[] ambient = new float[3];   // Material ambient reflectivity
      public float[] diffuse = new float[3];   // Material diffuse reflectivity
      public float[] specular = new float[3];   // Material specular reflectivity
      public float shininess;                       // Material specular exponent
      public float shin_strength;
      public bool use_blur;
      public float blur;
      public float transparency;
      public float falloff;
      public bool is_additive;
      public bool self_illum_flag;
      public float self_illum;
      public bool use_falloff;
      public int shading;
      public bool soften;
      public bool face_map;
      public bool two_sided;            // Material visible from back
      public bool map_decal;
      public bool use_wire;
      public bool use_wire_abs;
      public float wire_size;
      public Lib3dsTextureMap texture1_map = new Lib3dsTextureMap();
      public Lib3dsTextureMap texture1_mask = new Lib3dsTextureMap();
      public Lib3dsTextureMap texture2_map = new Lib3dsTextureMap();
      public Lib3dsTextureMap texture2_mask = new Lib3dsTextureMap();
      public Lib3dsTextureMap opacity_map = new Lib3dsTextureMap();
      public Lib3dsTextureMap opacity_mask = new Lib3dsTextureMap();
      public Lib3dsTextureMap bump_map = new Lib3dsTextureMap();
      public Lib3dsTextureMap bump_mask = new Lib3dsTextureMap();
      public Lib3dsTextureMap specular_map = new Lib3dsTextureMap();
      public Lib3dsTextureMap specular_mask = new Lib3dsTextureMap();
      public Lib3dsTextureMap shininess_map = new Lib3dsTextureMap();
      public Lib3dsTextureMap shininess_mask = new Lib3dsTextureMap();
      public Lib3dsTextureMap self_illum_map = new Lib3dsTextureMap();
      public Lib3dsTextureMap self_illum_mask = new Lib3dsTextureMap();
      public Lib3dsTextureMap reflection_map = new Lib3dsTextureMap();
      public Lib3dsTextureMap reflection_mask = new Lib3dsTextureMap();
      public uint autorefl_map_flags;
      public int autorefl_map_anti_alias; // 0=None, 1=Low, 2=Medium, 3=High
      public int autorefl_map_size;
      public int autorefl_map_frame_step;
   }
 public class Lib3dsMesh
   {
      //public uint user_id;
      //public object user_ptr;
      public string name = "";                       // Mesh name. Don't use more than 8 characters
      public Lib3dsObjectFlags object_flags;  // see Lib3dsObjectFlags
      public byte color;                               // Index to editor palette [0..255]
      public float[,] matrix = new float[4, 4]; // Transformation matrix for mesh data
      public ushort nvertices;                      // Number of vertices in vertex array (max. 65535)
      public List<Lib3dsVertex> vertices;
      public List<Lib3dsTexturecoordinate> texcos;
      public List<ushort> vflags;
      public ushort nfaces;                        // Number of faces in face array (max. 65535)
      public List<Lib3dsFace> faces;
      public string box_front = "";
      public string box_back = "";
      public string box_left = "";
      public string box_right = "";
      public string box_top = "";
      public string box_bottom = "";
      public Lib3dsMapType map_type;
      public float[] map_pos = new float[3];
      public float[,] map_matrix = new float[4, 4];
      public float map_scale;
      public float[] map_tile = new float[2];
      public float[] map_planar_size = new float[2];
      public float map_cylinder_height;
   }
0      1820        13.08.2012        14

0 
13.08.2012 00:00:00
А можно скрин?
0 
13.08.2012 00:00:00
0 
13.08.2012 00:00:00

А это без изменения размера
0 
13.08.2012 00:00:00
А как именно ты меняешь рамер?

Похоже на то, что ты как то поменял текстурные координаты, так что текстура занимает лишь малую часть модели, что приводит к повторению текстуры. В параметрах текстуры наверное стоит GL_REPEAT…
0 
13.08.2012 00:00:00
Да, меняю текстурные координаты и ещё раз да стоит GL_REPEAT.(поставил CLAMP_TO_EDGE) вроде помогло, сейчас попробую сделать позиционирование и проверю подходит ли данный вариант.
0 
13.08.2012 00:00:00
Конечно при визуализации в программе это помогло, однако когда сохраняю модель в файл и открываю в 3д редакторе(3DSMAX,Cinema4D) то текстура отображается так как при репите.
0 
13.08.2012 00:00:00
Вполне возможно что при сохранении нужно указать какой то флаг…
Но какой это уже нужно смотреть спецификацию 3ds
0 
13.08.2012 00:00:00
Откопал интересный момент, при сохранении координаты текстуры сохраняются, но в 3д редакторе нужно отключать мозаичность (tile) после этого текстура отображается на своём месте.
ЗЫ.Сохраняю с флагом NO_TILE но всёравно флаг мозаичности не убирается… уже не знаю что делать(
0 
14.08.2012 00:00:00
Возник другой вопрос, с пред идущим разобрался.
Мой файл 3D модели состоит из 4-х мешей, так-же имеется 2 материала, как привязать определённый материал к определённому мешу?
0 
14.08.2012 00:00:00
Как разобрался с предыдущим вопросом?

Для сохранения?
0 
15.08.2012 00:00:00
Пред идущий оставил как есть, в программе при загрузке сохранённой модели позиция текстуры остаётся… не сохраняется только флаг при загрузке в редактор (нужно вручную выставлять в самом редакторе)

Да для сохранения… но тоже уже разобрался)
Не мог определится как правильно привязать текстуру, потом почему-то из 3-х текстур на модель вешалось лиш 2. Решение проблемы вогнало меня в истерику, я даже подумать не мог, что имена текстур должны быть уникальными, так как редактор считывает первую попавшеюся (если имена повторяются).

Однако теперь я вобще заблудился, не как не получается ( в программе) отобразить все текстуры которые привязаны к модели, работает только с одной текстурой.
0 
15.08.2012 00:00:00
если на одну модель(ту часть которые отрисовываешь за один раз) несколько текстур, нужно использовать мультитекстурирование и делать glActiveTexture(GL_TEXTUREi); вместо i порядковый номер текстуры. и соответственно привязывать их текстурные координаты.
0 
15.08.2012 00:00:00
Не могли бы Вы подсказать, как и где это применить в данном коде?

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();
}
}
0 
15.08.2012 00:00:00
Советую прочитать статьи, так простым указанием куда вставить команды не обойтись.



К сожалению не помню как с загрузкой рассширений в Tao, вроде там их загрузать не надо, тоесть все функции OpenGL 2.1 есть.
^
Регистрация
Регистрируясь, вы принимаете правила сайта. Если вы не получили код подтв. регистрации - не забудьте проверить папку спам.
Логин*
Email*
Пароль*
Подтверждение пароля*
 
Логин*
Код*
 
×
Восстановление пароля
Пожалуйста, заполните поля, после чего вы получите код подтверждения на ваш Email. Если код не пришел в течении нескольких минут - проверьте папку спам.
Логин

или Email
Логин*
Код подтверждения*
Новый пароль*
Подтверждение пароля*
×
Авторизация
  • Используйте вашу учетную запись на Facebook.com для входа на сайт.
  • Используйте вашу учетную запись VKontakte для входа на сайт.
  • Используйте вашу учетную запись Google для входа на сайт.
Авторизуйтесь с помощью соц. сети или с помощью аккаунта на сайте:
×