使用 opengl 在球体上渲染图像

Posted

技术标签:

【中文标题】使用 opengl 在球体上渲染图像【英文标题】:render an image on the sphere using opengl 【发布时间】:2015-06-25 14:50:20 【问题描述】:

我想在球体上渲染任何类型的图像(例如 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();

我暂时不能发图;呃……呃……呃 图片很正常(来自wiki的地球地图),如下图。

但是,当我更改视图位置时,球体出现故障。我的代码有错误吗?有人能说出为什么会这样吗?

//更新: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);

【问题讨论】:

【参考方案1】:

不确定这是否会有所帮助。但总比没有答案好。

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPLACE);

我认为 glTexParameterf 不应该用于 GL_TEXTURE_WRAP_S。最好是 glTextParameteri。另外,我认为 GL_REPLACE 不是它的有效值。见this reference。我宁愿:

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);

当 pname 为 GL_TEXTURE_ENV_MODE 时,实际使用 GL_REPLACE 的函数将是 glTexEnvi。

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

Here 是一些人讨论过的板块。

个人说明:我会远离 glu,并尝试使用现代 OpenGL 练习自己的渲染。 Useful tutorial.

【讨论】:

是的。它仍然无法正常工作。纹理渲染是如何工作的?你能给我一些关于它的论文名字吗? 我刚才把代码里的项目模式从gluPerspective改成了glOrtho,现在效果很好。但如何?是什么原因?

以上是关于使用 opengl 在球体上渲染图像的主要内容,如果未能解决你的问题,请参考以下文章

iPhone OpenGL ES 2.0 奇怪的图案在 COLLADA 文件中的球体上渲染纹理

使用python在OpenGL中仅渲染立方体内的一部分球体?

OpenGL没有渲染图

球内的OpenGL间隙

基于opengl的基础渲染器

如何在OpenGL中做“AND”模具?