рендеринг изображения на сфере с помощью opengl

Я хочу визуализировать изображение на сфере любого типа (например, jpg tif bmp). поэтому я пробую opencv и opengl для этой работы. но я новичок в opengl.

ниже приведен код, который я использовал.

void createTex(Mat &img)
{
    glGenTextures(2, m_texnames);
    glBindTexture(GL_TEXTURE_2D, m_texnames[0]);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPLACE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPLACE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, img.cols, img.rows, GL_BGR_EXT, GL_UNSIGNED_BYTE, img.data);
}
void sphere()
{
    glEnable(GL_TEXTURE_2D);
    createTex(src);
    glBindTexture(GL_TEXTURE_2D, m_texnames[0]);
    glPushMatrix();
    gluQuadricTexture(g_text, GLU_TRUE);             
    gluQuadricDrawStyle(g_text, GLU_FILL);           
    gluSphere(g_text, 1.0, 64, 64); /*draw sun */
    glPopMatrix();
    glDisable(GL_TEXTURE_2D);
}

virtual void onDisplay()
{
    glClear(GL_COLOR_BUFFER_BIT);
    validateCameraPosition();
    validateModelPosition();
    sphere();
    glFlush();
    glutSwapBuffers();
}

Я не могу пока опубликовать картинку; эээ ......... эээ картинка очень нормальная (карта земли из вики), как показано ниже.

но когда я меняю положение обзора, возникает ошибка в сфере. есть ли ошибка в моем коде? а кто-нибудь может сказать, почему это происходит?

//update:2015.06.28

наконец, я нашел ошибку. функция gluPerspective () не может принимать значение 0,0f, указывающее расстояние от зрителя до ближайшей плоскости отсечения; я думаю, что 0.0f может помешать проекту matix; поэтому значение должно быть больше нуля; ниже код отклонен;

virtual void onResize(int w, int h)
{
    printf("resize window: %d, %d\n", w, h);
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    //gluPerspective(100.0,(GLfloat)w / (GLfloat)h, 0.0/*wrong*/, 20.0);
    gluPerspective(100.0, (GLfloat)w / (GLfloat)h, 0.1, 20.0);
    //glOrtho(-1, 1, -1, 1,0,20);
}

person EchoLiu    schedule 25.06.2015    source источник


Ответы (1)


Не уверен, что это поможет ... но все же лучше, чем отсутствие ответов.

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPLACE);

Я не думаю, что glTexParameterf должен использоваться для GL_TEXTURE_WRAP_S. Лучше быть glTextParameteri. Кроме того, я не думаю, что для него допустимое значение GL_REPLACE. см. этот справочник. Я скорее:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

Функция, которая на самом деле использует GL_REPLACE, будет glTexEnvi, когда pname имеет значение GL_TEXTURE_ENV_MODE.

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

Вот доска, на которой некоторые люди обсуждали это.

Личное примечание: я бы не стал использовать glu и попытался бы потренироваться в рендеринге с помощью современного OpenGL. Полезное руководство.

person user2883715    schedule 25.06.2015
comment
да. он по-прежнему не работает. как рендер текстуры выполняет свою работу? можешь дать мне какие-нибудь бумажные имена вокруг этого? - person EchoLiu; 26.06.2015
comment
Я только что изменил режим проекта в своем коде с gluPerspective на glOrtho, и теперь он работает хорошо. но как? какова причина ? - person EchoLiu; 26.06.2015