#c #opengl
#c #opengl
Вопрос:
Мне нужно сопоставить текстуру с квадратом в трехмерном пространстве.
Это то, что у меня есть на данный момент:
#include "Display.h"
#include "Bitmap.h"
#include "Glut/glut.h"
#include "GL/gl.h"
#include "GL/glu.h"
Bitmap Display::m_HeightMap;
unsigned int Display::m_TextureID;
void Display::Init(int argc, char ** argv)
{
glEnable(GL_TEXTURE_2D);
Bitmap image;
image.loadBMP("myTexture.bmp");
glGenTextures(1, amp;m_TextureID); //Generates 1 texture, puts the ID in m_TextureID
glBindTexture(GL_TEXTURE_2D, m_TextureID); //Sets m_TextureID as the current textureID
//All below are just functions to set up the rendering modes of the texture
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image.width, image.height, GL_RGB, GL_UNSIGNED_BYTE, image.data); //Copy image to graphics card
glutInit(amp;argc, argv); // initializes glut
// sets display mode. These parameter set RGB colour model
// and double buffering.
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutCreateWindow("OpenGL Tutorial");
// Set glut callback functions
glutDisplayFunc(Display::DisplayScene);
glutIdleFunc(Display::Idle);
glutReshapeFunc(Display::Resize);
// Begin glut main loop
glutMainLoop();
}
void Display::DisplayScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the back buffer
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, m_TextureID);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-2, 2, -3);
glTexCoord2f(1.0f, 1.0f);
glVertex3f(2, 2, -3);
glTexCoord2f(1.0f, 0.0f);
glVertex3f(2, -2, -3);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-2, -2, -3);
glEnd();
glutSwapBuffers(); // Swap the front and back buffers
}
void Display::Resize(int w, int h)
{
/* Resize is called when window is resized */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0,0,w,h);
gluPerspective(45, (float)w/(float)h, 1, 1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0,0,10,
0,0,0,
0,1,0);
}
void Display::Idle()
{
/* When nothing else is happening, idle is called.
* Simulation should be done here and then
* the display method should be called
*/
glutPostRedisplay();
}
Но квадрат остается пустым белым. Bitmap — это класс, предоставляемый университетом, я думаю. Я могу предоставить это, если вам нужно.
Что я делаю не так?
Ответ №1:
Вам необходимо инициализировать GLUT перед вызовом функций OpenGL, таких как glEnable. В противном случае они не будут работать, потому что для них требуется наличие контекста OpenGL, а glutCreateWindow — это метод, который создает такой контекст.
Комментарии:
1. Спасибо. Я поменял местами два «сегмента» кода в Display::Init, но безрезультатно. Есть ли что-то еще?
Ответ №2:
1) вам необходимо инициализировать и создать window перед выполнением любого вызова opengl
2) Ваш вызов gluBuild2DMipmaps неверен. Цель должна быть GLU_TEXTURE_2D
3) по завершении рендеринга (после glEnd();
) вызовите glDisable(GL_TEXTURE_2D);
Вы также можете проверять наличие ошибки opengl с помощью glGetError после каждого вызова opengl. Это должно подсказать вам, какой вызов завершился неудачно и почему. Проверьте справочные страницы неудачного вызова.
Комментарии:
1. Он вызывает gluBuild2DMipmaps.
2. Привет, спасибо, я изменил вызов функции на gluBuild2DMipmaps(GLU_TEXTURE_2D, но я получаю «GLU_TEXTURE_2D не определен»… Каких компонентов мне не хватает?
3. img855.imageshack.us/img855/4332/glu.png 🙂 Редактировать: Хорошо, это неправильная функция, но вы поняли идею
4. @Motig На ссылочных страницах указано, что параметром должен быть GLU_TEXTURE_2D. Вы можете попробовать использовать GL_TEXTURE_2D
5. GL_TEXTURE_2D компилируется, но я все равно получаю белый квадрат. Нет текстуры.