LINUX.ORG.RU

Привидите пожалуйсто рабочий код или покажите ошибку.


0

0

Похожую тему создавал уже но она была нещадно погребена новыми поэтому вопрос остался.
Возниикла проблема с наложением текстуры в слудующем коде.


-------------------------------- main.cpp ----------------------------------------------
#include "bmp.h"

#include "GL/glut.h"
#include "GL/gl.h"
#include "GL/glu.h"

GLdouble angel = 0.0;
GLdouble angel_pos = 50.0;
GLdouble k = 5;
int n = 0;

tagBITMAPFILEHEADER bmpFileHeader;
tagBITMAPINFOHEADER bmpInfoHeader;

int file_bmp,nCol,nRow;
tagRGBQUAD* flat;

void readFile(void)
{
file_bmp = open ("/home/alexandr/Documents/Coding/C++/MyProjects/sphere/32b.bmp", O_RDONLY);
read (file_bmp, &bmpFileHeader, 14);
read (file_bmp, &bmpInfoHeader, 40);

nCol = bmpInfoHeader.biWidth;
nRow = bmpInfoHeader.biHeight;

n = nCol * nRow;

for (int y = bmpInfoHeader.biHeight; y > 0; y--)
{
for (int x = 0; x < bmpInfoHeader.biWidth; x++)
{
read (file_bmp, &flat[n].r, 1);
read (file_bmp, &flat[n].g,1);
read (file_bmp, &flat[n].b,1);
read (file_bmp, &flat[n].a,1);
n++;
}
}
}

void setTexture(GLuint name)
{
glBindTexture(GL_TEXTURE_2D,name);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,nCol,nRow,0,GL_RGB,GL_UNSIGNED_BYTE,flat);
}

void Init (void)
{
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

void resize(int width,int height)
{
glClearColor(0.0,0.0,0.0,0.0);
glViewport(0,0,width,height);
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(-12,12, -12,12, -20,20);
gluLookAt( 3,1,1, 0,0,0, 0,1,0 );
glMatrixMode( GL_MODELVIEW );
}

void display(void)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); //Function of clear window

///// Plase code here //////

GLuint* num;

glPushMatrix();
glGenTextures(1,num);
setTexture (num[0]);
glBegin(GL_POLYGON);
glTexCoord2f(0,2*k);
glVertex3d(-1*k,0*k,1*k);
glTexCoord2f(0,2*k);
glVertex3d(1*k,0*k,1*k);
glTexCoord2f(0,2*k);
glVertex3d(1*k,0*k,-1*k);
glTexCoord2f(0,2*k);
glVertex3d(-1*k,0*k,-1*k);
glEnd();
glPopMatrix();

///////////////////////////////////////////
glFlush();
glutSwapBuffers();
}

void timer(int value)
{
glutPostRedisplay(); //Reshape function
glutTimerFunc(10, timer, 0); //Create loop of timers
angel ++;
}

int main(int argc, char *argv[])
{
glutInit(&argc, argv);

glutInitWindowSize(900, 900); //Position and
glutInitWindowPosition(0, 0); // size of window

glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE ); //Mode of MainWindow
glutCreateWindow(" Created by Cyclon (_cyclon_@mtu.ru) "); //Create window with Caption

Init(); //Initalization function

glutReshapeFunc(resize); //Function for reshape
glutDisplayFunc(display); //Function for resize

glutTimerFunc(25, timer, 0); //Timer with 25ms interval

glutMainLoop(); //Just run main loop

return 0;
}
-------------------------------------------------------------------------------- --------------

--------------------------------bmp.h------------------------------------------- -----------
#include <fcntl.h>
#include <unistd.h>
#include <iostream.h>

#pragma pack(push,1)

typedef unsigned long DWORD;
typedef unsigned short WORD;
typedef signed long LONG;
typedef unsigned int UINT;

typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 'BM' = 4D42h
DWORD bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits;
};


typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
};

-------------------------------------------------------------------------------- --------------

Пожалуйсто покажите где может быть ошибка и почему текстура не накладывается, или же кинте ссылкой н пример реально работающего примера делающего тоже самое и таким же способом, т.е. прямым чтением из файла, но имеющего небольшой размер (в строчках, чтобы было проще разобраться).

★★★★★

на www.opengl.org.ru есть(был) пример с наложением текстуры читаемой из битмапа.

код этот читать/тестить лень :( сорри

из общих советов могу предложить подумать на тему читается-ли текстура и лежит-ли она в памяти в том виде в котором нужно для накладывания... в последнем я особенно сомневаюсь

в общем примеров пресс. хоть на opengl.org хоть на opengl.org.ru а в гугле вообще... тутор NeHe или на домашней страничке глюта первое что в голову пришло.

anonymous
()
Ответ на: комментарий от cyclon

В меса посмотрел так вроде у меня всё так же, или же нет, может кто нибудь всё же заценит код и подскажет что не так, а то я уже не знаю где ошибку искать.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Извиняюсь просто не туда на сайте повернул.
Но тем не менее что мы видим из этого примера, а собсно ничего, т.е. если не считать команд типа: photo_image = auxDIBImageLoad("photo.bmp") - которая у месы нет, т.к. она мастдайная, и которая реализована у меня соответствующим кодом, да и

quadObj = gluNewQuadric();
gluQuadricTexture(quadObj, GL_TRUE);
gluQuadricDrawStyle(quadObj, GLU_FILL);
gluDeleteQuadric(quadObj);

которые вообще вызвали странное поведение приложение которое при наличии этих строк вообще не запускалось т.е. окно закрывалось сразу же после открытия.

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

ну во-первых поставленную задачу она решает.

во-вторых " auxDIBImageLoad("photo.bmp") - которая у месы нет, т.к. она мастдайная, и которая реализована у меня соответствующим кодом, да и" только подтверждает мою гипотезу о том, что что-то с загрузкой/подсовыванием текстуры неладно.

в третьих glu вполне себе портабельная либа, и если она ведет себя странно, значит ты забыл что-то для нее сделать(инициализировать итп)

если с aux не нравится то можно за 5 минут найти в туторе глюта пример наложения текстуры для глюта. (хинт: glaux и glut _очень_ похожи.)

сам справишься с поиском? или опять дяде поиграть в гугл ?

anonymous
()
Ответ на: комментарий от cyclon

вот блин. я ведь еще тогда нашел пачку доков... до думал сам вкуришь.

ключевый слова: nate robins glut opengl, opengl.org glut doc

http://www.opengl.org/developers/code/glut_examples/examples.zip http://www.opengl.org/developers/code/glut_examples/examples/examples.html

http://www.xmission.com/~nate/tutors/tutors.zip http://web.pdx.edu/~marius/dl/glsamples.tar.gz

в экзамплесах.зип mjkwarp.с и mjksift.c натягивают чью-то морду(из mjkimage) в виде текстуры на что попало. собирается тривиально без всяких мэйкфайлов, работает.

собсно я-бы на твоем месте или туда вставил свой код текстурирования, или наоборот выдрал оттуда код загрузки.

PS. я в жизни написал только одну глную прогу, типа хелловорлд :)

также помню глютовую дему солнечной системы (текстурированную) что-то вроде solarsys

HTH

anonymous
()
Ответ на: комментарий от anonymous

[alexandr@cyclon examples]$ gcc mjksift.c -lGL -lGLU -lglut /tmp/ccqm8saJ.o(.text+0x810): In function `main': : undefined reference to `mjk_depth' /tmp/ccqm8saJ.o(.text+0x81a): In function `main': : undefined reference to `mjk_width' /tmp/ccqm8saJ.o(.text+0x824): In function `main': : undefined reference to `mjk_height' /tmp/ccqm8saJ.o(.text+0x833): In function `main': : undefined reference to `mjk_image' /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libglut.so: undefined reference to `glXBindChannelToWindowSGIX' /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libglut.so: undefined reference to `XGetExtensionVersion' /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libglut.so: undefined reference to `XFreeDeviceList' /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libglut.so: undefined reference to `XQueryDeviceState' /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libglut.so: undefined reference to `XListInputDevices' /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libglut.so: undefined reference to `glXQueryChannelDeltasSGIX' /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libglut.so: undefined reference to `glXChannelRectSyncSGIX' /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libglut.so: undefined reference to `glXChannelRectSGIX' /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libglut.so: undefined reference to `XFreeDeviceState' /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libglut.so: undefined reference to `XOpenDevice' /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libglut.so: undefined reference to `glXQueryChannelRectSGIX' /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libglut.so: undefined reference to `XmuLookupStandardColormap' /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../libglut.so: undefined reference to `XSelectExtensionEvent' collect2: ld returned 1 exit status

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

ей богу десткий сад :)

пишу по памяти,

gcc -c mjkimage.c
gcc mjksift.c mjkimage.o -lglut -lGL
./a.out

note: порядок перечисления либ важен.

HTH

anonymous
()
Ответ на: комментарий от anonymous

Re

Да х***н с ним, сжальтесь над бедным студентом у которого времени почти нет разбираться с этим, покажите пример моего кода (но с ручным чтением файла, как в приведённым коде), но только который работает, а то пытался врезать свой код в имеющиеся примеры но так ничего путного не вышло. Я запарился, потратил три часа вчера но так и не допёр в чём трабла.

cyclon ★★★★★
() автор топика
Ответ на: Re от cyclon

интересно как тебе показать пример твоего работающего кода если он не собирается.

anonymous
()
Ответ на: Re от cyclon

не знаю как он собирается и чем, но определение tagRGBQUAD мне лично не по глазам.

anonymous
()
Ответ на: комментарий от cyclon

ну вот. а говорил собирается. опять нагнал... если тебе не надо разобраться то всем остальным тем более не надо.

бери один из многочисленных примеров и выкидывай куски, проверяя работоспособность, если доки не хочешь читать.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.