Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > [OpenGL] текстуры


Автор: Solomon 3.5.2008, 17:09
Всем добрый день
Столкнулся вот с какой проблемой.
есть картинка 2D(рис 1 в прикрепленном файле) 
После её прорисовки получаеться непонятный глюк (рис 2. в прикрепленном файле)
если же увеличить размер по X на 2 и более пикселей, то все рисуеться отлично, если уменьшаем по х то получаеться таже муть...
может кто сталкивался с данной проблемой и может помочь..

p.s. Да, я знаю что OpenGL работает со степенями 2-х, но надо такие размерности


Автор: FIaR 3.5.2008, 18:54
А так по идее и должно рисоваться  smile   А кто мешает текстуру сделать размером 128x128, например просто растянуть(наверное самый легкий вариант), или не растягивая поиграться с текстурными координатами. 

Автор: just_geek 4.5.2008, 11:01
Воспользоватся расширением http://www.nvidia.com/dev_content/nvopenglspecs/GL_ARB_texture_non_power_of_two.txt

Замечу, что хоть ссылка и ведет на сайт nvidia это ARB расширение, должно работать на картах ATI и прочих.

Автор: Solomon 5.5.2008, 10:11
FIaR, это почему так должно рисоваться? можно причину?
И всмысле поиграться с текстурными координатами? Если начну  и играться другие будут криво рисоваться.... 


just_geek, Спасибо.. посмотрю

Автор: Solomon 5.5.2008, 21:21
just_geek, одна проблемка.. проекты у меня казуалки... и как то использовать расширения стремновато, так как наиболее часто в казуалки играют на стареньких тачках... Да я соглсен что уже расширение ARB это стандарт и поддерживаеться почти на 100% машин.. но все же... если например на машине не будут стоять дрова старенькие на видио, то хрен оно его захавает...

Это старенький движок я правлю, корпоративный, там народ раньше юзал какието либы стандартные, но с ними вечно были проблемы, типа зеркально отображенных картинок али вообще чудных багов которых вообще страшно вспоминать... подключил свою загрузку к их движки.. и начали вылазить такие глюки.. так как я когда писал свои загрузчики, я расчитывал только на стандартное разрешение(степень двойки) и не тестил на таких разрешениях. И теперь вот мучаюсь в догадках как все настроить... все работает.. и спрайтовые анимации и и большенство картинок... а вот некоторые парит и [censored 6] :(     

Автор: just_geek 6.5.2008, 09:56
Ну тогда просто грузи как обычно и настраивай текстурные координаты, чтоб только прямоугольник этот рисовался.

Автор: AI0 22.5.2008, 14:48
Привет. У меня проблема при отображении текстуры. Делал я всё по примеру, но так как под Linux нет библиотеки glaux я написал функцию считывания матрицы bmp. Но при запуске программы вместо картинки появляется белый квадрат. Может сцена инициализирована не так, чтобы можно было отображать текстуры? . Исходные коды вот:

imgread.c - содержит функцию чтения
Код


#include <stdio.h>
#include <stdlib.h>
#include <GL/gl.h>

GLubyte* imgr(const char* filename)
{
    GLsizei width=0, height=0, size=0;
    GLubyte *RGBmas, *RGBmas_i;
    
    
    char sign[2];
    char color[3];
    FILE* file=fopen(filename,"rb");
    fseek(file,2,0);
    fread(&size, 4,1, file);
    fseek(file,18,0);
    fread(&width, 4,1, file);
    fread(&height, 4,1, file);
    
    int n;
    n=3*width*height;
    
    int m_size;
    m_size=sizeof(GLubyte)*n;
    RGBmas=(GLubyte*)malloc(m_size);
    RGBmas_i=(GLubyte*)malloc(m_size);
    fseek(file, 54, 0);
    fread(RGBmas,sizeof(GLubyte),n, file);
        
    fclose(file);
    
for(int j=0;j<=n-3;j=j+3)
{
    for(int i=0; i<=2;i++)
    {
        RGBmas_i[(2+j)-i]=RGBmas[j+i];

        
    }
}
    return RGBmas_i;
}


и morda.c - вся сцена
Кстати, размеры картинки я здесь установил явно.
Код

#include <GL/glut.h>
#include <GL/gl.h>
#include <math.h>
#include <stdio.h>
#include <GL/gl.h>
#include <stdlib.h>
extern GLubyte* imgr(const char* filename);
/*  Initialize material property and light source.
 */
float r=0;
float rot[5]= {0,0,0,0,0};
float a=0;
int speed=0;
bool automated=0;
bool paused=1;

struct cubik
{
float size;
float x;
};

//picture's params

unsigned int photo_tex;
GLubyte* photo_image;



void init (void)
{
   glClearColor (0.3, 0.3, 0.3, 0.0);
   
   
  // GLfloat light_ambient[] = { 1, 1, 1, 0.0 };
   //GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 0.0 };
  // GLfloat light_specular[] = { 1.0, 0.0, 0.0, 0.0 };
/*    light_position is NOT default value    */
   GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };

  // glLightfv (GL_LIGHT0, GL_AMBIENT, light_ambient);
   //glLightfv (GL_LIGHT0, GL_EMISSION, light_diffuse);
  // glLightfv (GL_LIGHT0, GL_SPECULAR, light_specular);
   //glLightfv (GL_LIGHT0, GL_POSITION, light_position);

   //glEnable (GL_LIGHTING);
   //glEnable (GL_LIGHT0);
   //glEnable(GL_DEPTH_TEST);
     glEnable(GL_COLOR_MATERIAL);
 
}

void display (void)
{
static float time, time2=0;
   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//glPushMatrix();
//glRotatef(rot[1],rot[2],rot[3],0);
glEnable(GL_TEXTURE_2D);
 //glColor3d(1,1,1);

 glBindTexture(GL_TEXTURE_2D, photo_tex );
  glBegin(GL_QUADS);
     glTexCoord2d(0,0); glVertex3d(-1,-1, -0.1);
     glTexCoord2d(0,1); glVertex3d(-1, 1, -0.1);
     glTexCoord2d(1,1); glVertex3d( 1, 1, -0.1);
     glTexCoord2d(1,0); glVertex3d( 1,-1, -0.1);
  glEnd();
 glDisable(GL_TEXTURE_2D);
//glPopMatrix();



    glutSwapBuffers();    

if(paused==0)
    {
    time=time+speed;

    }
if(automated==1)
{
time2+=1;
    rot[2]=(time2);
    if(rot[3]>=10000)
    {
rot[3]-=1;
rot[2]+=1;}
    if(rot[3]<=10000)
    {rot[3]+=1;
rot[2]-=1;}
        
        rot[1]=rot[1]+(sin((time2)/3000))/10;
}

}


void reshape(int w, int h)
{
glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   gluPerspective(65.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   glTranslatef (0.0, 0.0, -5.0);
   /*glViewport (0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode (GL_PROJECTION);
   glLoadIdentity ();
   if (w <= h) 
      glOrtho (-2.5, 2.5, -2.5*(GLfloat)h/(GLfloat)w, 
               2.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
   else 
      glOrtho (-2.5*(GLfloat)w/(GLfloat)h, 
               2.5*(GLfloat)w/(GLfloat)h, -2.5, 2.5, -10.0, 10.0);
   glMatrixMode (GL_MODELVIEW);
   glLoadIdentity ();*/
}

void keyboard(unsigned char key, int x, int y)
{
   switch (key) {
      case 27:
    a=0;
        rot[1]=0;
    rot[2]=0;
    rot[3]=0;
    rot[4]=0;
    glutPostRedisplay();
         break;

case 'q':
rot[1]=rot[1]+5;
rot[1]=(int)rot[1]%360;
     
     glutPostRedisplay();

     break;

case 'e':
rot[1]=rot[1]-5;
rot[1]=(int)rot[1]%360;
     
     glutPostRedisplay();

     break;

      
      case 'w':
rot[2]=rot[2]+5;
rot[2]=(int)rot[2]%360;

     
     glutPostRedisplay();

     break;
      
      case 's':
rot[2]=rot[2]-5;
rot[2]=(int)rot[2]%360;

     
     glutPostRedisplay();

     break;


      case 'a':
rot[3]=rot[3]+5;
rot[3]=(int)rot[3]%360;
     
     glutPostRedisplay();

     break;
case 'd':
rot[3]=rot[3]-5;
rot[3]=(int)rot[3]%360;
     
     glutPostRedisplay();

     break;
case 'n':
if(speed>0)
{
speed-=1;
}     
     glutPostRedisplay();

     break;
case 'm':
speed+=1;
     
     glutPostRedisplay();

     break;
      case 'z':
exit(0);

     
     glutPostRedisplay();

     break;
      case 'p':
if(paused==0)
{
    paused=1;
    
}

else
{
    paused=0;
    if(speed<1)
    {
    speed=1;
    }
}
     break;
case 'o':
if(automated==0)
{
    automated=1;
    
}

else
{
    automated=0;
    
}
     break;
   }
}

/*  Main Loop
 *  Open window with initial window size, title bar, 
 *  RGBA display mode, and handle input events.
 */
int main(int argc, char** argv)
{


photo_image=imgr("/home/ai/1.bmp");

glGenTextures(0, &photo_tex);
glBindTexture(GL_TEXTURE_2D, photo_tex);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, 3, 
             648,
             483,
             0, GL_RGB, GL_UNSIGNED_BYTE,
             photo_image);





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

   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
   glutInitWindowSize (800, 600);
   glutCreateWindow (argv[0]);
   init ();
   glutReshapeFunc (reshape);
   glutDisplayFunc(display);
    
    
   glutKeyboardFunc (keyboard);

   glutMainLoop();
   
return 0; 
//printf("%i", RGBmas[2]);
}


Автор: Solomon 22.5.2008, 21:16
AI0, ты в дебагере не смотрел переменную c данными о пикселях? нормально грузит? 

p.s. Вообще я думаю стоило создать новую тему!!!!

Автор: AI0 23.5.2008, 18:36
Да. Точнее, я даже тупо в консоль выводил этот массив, и там всё как положено, даже заранее инвертировано BGR на RGB. И ещё, когда я использовал другой пример, где были не 2d текстуры, а 3d, то картинка загружалась, и то по не понятной логике, но показывалась вся. К сожалению, сильно не разбираюсь пока в opengl, поэтому не стал использовать тот код, да и забрасывать то, что уже 4 суток ковырял не охота.

Автор: AI0 29.5.2008, 16:46
Всё, разобрался, только до сих пор не понял, почему был косяк. Просто загрузку и привязку текстуры я вынес в отдельную функцию. И о чудо! Выскочила красная рожица, натянутая на квадратик!)))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)