Проблема с Open GL-м
От: Аноним  
Дата: 24.04.08 08:43
Оценка:
Проблема заключается в следующем: нужно текстурировать несколько фигур текстурой из одного файла. Причём, допустим, фрагмент 1*2 нужно наложить на первый объект, следующий кусок текстуры — на второй объект, и так далее.
Есть альтернативный вариант: рассовать эти куски по разным файлам и грузить отдельно, но, во-первых, тот вариант мне больше нравится, а во-вторых, я в Open GL-е недавно и не могу наладить пример из книги Игоря Тарасова, в котором загружайются 2 или более текстур. Причём пример с одной текстурой работает хорошо.
Помогите, плз. Если в книге опечатка, то подскажите книгу лучше.
Re: Проблема с Open GL-м
От: 8bit  
Дата: 24.04.08 09:27
Оценка:
Здравствуйте, Аноним, Вы писали:

В чем конкретно проблема и что Вы хотите? Приведите код.
Re[2]: Проблема с Open GL-м
От: Аноним  
Дата: 24.04.08 15:22
Оценка:
Здравствуйте, 8bit, Вы писали:

8>Здравствуйте, Аноним, Вы писали:


8>В чем конкретно проблема и что Вы хотите? Приведите код.



#include <windows.h>

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>


unsigned int photo_tex;
AUX_RGBImageRec* photo_image;


unsigned int space_tex;
AUX_RGBImageRec* space_image;




void CALLBACK resize(int width,int height)
{
glViewport(0,0,width,height);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(-5,5, -5,5, 2,12);
gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
glMatrixMode( GL_MODELVIEW );
}



void CALLBACK display(void)
{

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );




glEnable(GL_TEXTURE_2D);
glColor3d(1,1,1);

glBindTexture(GL_TEXTURE_2D, space_tex );
glBegin(GL_QUADS);
glTexCoord2d(0,0); glVertex3d(-5,-5, -0.1);
glTexCoord2d(0,1); glVertex3d(-5, 5, -0.1);
glTexCoord2d(1,1); glVertex3d( 5, 5, -0.1);
glTexCoord2d(1,0); glVertex3d( 5,-5, -0.1);
glEnd();



glBindTexture(GL_TEXTURE_2D, photo_tex);
glBegin(GL_QUADS);
glTexCoord2d(0,0); glVertex2d(-4,-4);
glTexCoord2d(0,1); glVertex2d(-4, 4);
glTexCoord2d(1,1); glVertex2d( 4, 4);
glTexCoord2d(1,0); glVertex2d( 4,-4);
glEnd();



glDisable(GL_TEXTURE_2D);

auxSwapBuffers();
}



void main()
{
float pos[4] = {3,3,3,1};
float dir[3] = {-1,-1,-1};

auxInitPosition( 50, 10, 400, 400);
auxInitDisplayMode( AUX_RGB | AUX_DEPTH | AUX_DOUBLE );
auxInitWindow( "Texture" );
auxIdleFunc(display);
auxReshapeFunc(resize);


glEnable(GL_DEPTH_TEST);
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);



glLightfv(GL_LIGHT0, GL_POSITION, pos);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);


glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

photo_image = auxDIBImageLoad("photo.bmp");
space_image = auxDIBImageLoad("space.bmp");


glGenTextures(1, &photo_tex);
glGenTextures(1, &space_tex);

glBindTexture(GL_TEXTURE_2D, photo_tex );



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



glTexImage2D(GL_TEXTURE_2D, 0, 3,
photo_image->sizeX,
photo_image->sizeY,
0, GL_RGB, GL_UNSIGNED_BYTE,
photo_image->data);

/*
gluBuild2DMipmaps(GL_TEXTURE_2D, 3,
photo_image->sizeX,
photo_image->sizeY,
GL_RGB, GL_UNSIGNED_BYTE,
photo_image->data);

*/




glBindTexture(GL_TEXTURE_2D, space_tex );

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

glTexImage2D(GL_TEXTURE_2D, 0, 3,
space_image->sizeX,
space_image->sizeY,
0, GL_RGB, GL_UNSIGNED_BYTE,
space_image->data);

auxMainLoop(display);
}

Этот пример не работает.
Это к вопросу о загрузке 2-х и более текстур.
Что требуется в идеале: из одного bmp-файла, представляющего из себя полоску 24*1, нужно загрузить 24 РАЗНЫХ квадратика с изображениями шашек и тенями, падающими в разные стороны (в зависимости от положения на поле фигуры меняется её текстура — иллюзия 3d
Re: Проблема с Open GL-м
От: DeniSS1  
Дата: 24.04.08 18:10
Оценка:
Аноним — это я.
Путём сложных логических умозаключений пришёл к выводу, что траблы не в выводе 2 и более текстур, а в натягивании хотя бы одной на объект.
Вот код, который работает:

#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>

AUX_RGBImageRec* image;

void CALLBACK resize(int width,int height)
{
glViewport(0,0,width,height);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(-5,5, -5,5, 2,12);
gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
glMatrixMode( GL_MODELVIEW );
}

void CALLBACK display(void)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );


glRasterPos2d(-4.5,-3);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelZoom(1.0, 1.0);
glDrawPixels(image->sizeX, image->sizeY,
GL_RGB, GL_UNSIGNED_BYTE,
image->data);


auxSwapBuffers();
}

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
float pos[4] = {3,3,3,1};
float dir[3] = {-1,-1,-1};

image = auxDIBImageLoad("space.bmp");

glEnable(GL_ALPHA_TEST);
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glLightfv(GL_LIGHT0, GL_POSITION, pos);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);

auxInitPosition( 50, 10, 400, 400);
auxInitDisplayMode( AUX_RGB | AUX_DEPTH | AUX_DOUBLE );
auxInitWindow( "Photo" );
auxIdleFunc(display);
auxReshapeFunc(resize);
auxMainLoop(display);
}
Re[2]: Проблема с Open GL-м
От: 8bit  
Дата: 25.04.08 07:58
Оценка:
Здравствуйте, DeniSS1, Вы писали:

DSS>Аноним — это я.

DSS>Путём сложных логических умозаключений пришёл к выводу, что траблы не в выводе 2 и более текстур, а в натягивании хотя бы одной на объект.
DSS>Вот код, который работает:

В этом коде у Вас текстур вообще нет. Тут Вы напрямую рисуете изображение в буфер.
Это очень медленно, если нужно рисовать много.
Re[3]: Проблема с Open GL-м
От: 8bit  
Дата: 25.04.08 08:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Этот пример не работает.

А>Это к вопросу о загрузке 2-х и более текстур.

Вот код который работает как Вам надо:

#include <windows.h>

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>

static unsigned int photo_tex;
static AUX_RGBImageRec* photo_image;

static unsigned int space_tex;
static AUX_RGBImageRec* space_image;

static void DrawRect(int x, int y, int w, int h)
{
    glBegin(GL_QUADS);
    glTexCoord2d(0,0); glVertex2d(x,   y+h);
    glTexCoord2d(0,1); glVertex2d(x,   y  );
    glTexCoord2d(1,1); glVertex2d(x+w, y  );
    glTexCoord2d(1,0); glVertex2d(x+w, y+h);
    glEnd();
}

static void CALLBACK resize(int width,int height)
{
    glViewport(0,0,width,height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, width, height, 0, 0, 1);
    glMatrixMode(GL_MODELVIEW);
}

static void CALLBACK display(void)
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    glEnable(GL_TEXTURE_2D);
    glColor3d(1,1,1);

    glBindTexture(GL_TEXTURE_2D, space_tex );
    DrawRect(25, 25, space_image->sizeX, space_image->sizeY);

    glBindTexture(GL_TEXTURE_2D, photo_tex);
    DrawRect(75, 75, photo_image->sizeX, photo_image->sizeY);

    glDisable(GL_TEXTURE_2D);

    auxSwapBuffers();
}

void main()
{
    auxInitPosition(50, 10, 400, 400);
    auxInitDisplayMode(AUX_RGB | AUX_DEPTH | AUX_DOUBLE);
    auxInitWindow("Texture");
    auxIdleFunc(display);
    auxReshapeFunc(resize);


    glDisable(GL_DEPTH_TEST);
    glDisable(GL_ALPHA_TEST);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);


    photo_image = auxDIBImageLoad("photo.bmp");
    space_image = auxDIBImageLoad("space.bmp");

    glGenTextures(1, &photo_tex);
    glGenTextures(1, &space_tex);

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

    glTexImage2D(GL_TEXTURE_2D, 0, 3,
    photo_image->sizeX,
    photo_image->sizeY,
    0, GL_RGB, GL_UNSIGNED_BYTE,
    photo_image->data);


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

    glTexImage2D(GL_TEXTURE_2D, 0, 3,
    space_image->sizeX,
    space_image->sizeY,
    0, GL_RGB, GL_UNSIGNED_BYTE,
    space_image->data);

    auxMainLoop(display);
}


Обратите внимание на функцию resize в которой выставляется нужная проекция.
И так же на то что отключен DEPTH_TEST, ALPHA_TEST, материалы, освещение.
Для 2d это обычно не нужно.

А>Что требуется в идеале: из одного bmp-файла, представляющего из себя полоску 24*1, нужно загрузить 24 РАЗНЫХ квадратика с изображениями шашек и тенями, падающими в разные стороны (в зависимости от положения на поле фигуры меняется её текстура — иллюзия 3d


Прочтите про функцию glTexCoord2d внимательней. Это ключ к Вашей проблеме.
Re[3]: Проблема с Open GL-м
От: DeniSS1  
Дата: 25.04.08 13:14
Оценка:
Здравствуйте, 8bit, Вы писали:

8>В этом коде у Вас текстур вообще нет. Тут Вы напрямую рисуете изображение в буфер.


Спасибо. А как сделать текстуру на объекте? Пример из книги Игоря Трасова не работает.
Re[4]: Проблема с Open GL-м
От: DeniSS1  
Дата: 25.04.08 13:17
Оценка:
Здравствуйте, 8bit, Вы писали:

8>Вот код который работает как Вам надо:


Спасибо, но этот код при исполнении посылает меня куда-то в ассемблер со словами: "First-chance exception in ещё одна проверка.exe (OPENGL32.DLL): 0xC0000005: Access Violation."
Re[5]: Проблема с Open GL-м
От: 8bit  
Дата: 25.04.08 20:02
Оценка:
Здравствуйте, DeniSS1, Вы писали:

DSS>Спасибо, но этот код при исполнении посылает меня куда-то в ассемблер со словами: "First-chance exception in ещё одна проверка.exe (OPENGL32.DLL): 0xC0000005: Access Violation."


Посмотрите в дебаге в чем проблема-то... Этот код 100% рабочий.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.