【问题标题】:OpenGL Texturing SPHERE using Soil?使用土壤的OpenGL纹理球体?
【发布时间】:2014-10-24 21:13:24
【问题描述】:

只是想问一个关于球体的 OpenGL 纹理映射的问题。我想创建一个行星(地球),我试图为此使用 SOIL,因为我发现它是最简单的,但它根本不起作用。我得到的只是黑屏。有人可以检查代码吗?这里是:

顺便说一句,它是使用 Xcode 编译的。

#include <stdlib.h>
#include <stdio.h>
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <GLUT/glut.h>
#include <SOIL.h>

GLuint texEarth;
GLUquadricObj *pSphere = NULL;

void OpenGLInit(void);
void draw_sun();
static void display(void );
static void ResizeWindow(int w, int h);

GLuint loadTex(const char* filename)
{
    GLuint tex_ID = SOIL_load_OGL_texture(filename, SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID,(SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT));
        glEnable( GL_TEXTURE_2D );
        glBindTexture( GL_TEXTURE_2D, tex_ID );
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        return tex_ID;
    }

void OpenGLInit(void)
{
    glShadeModel( GL_FLAT );
    glClearColor( 0.0, 0.0, 0.0, 0.0 );
    glClearDepth( 1.0 );
    glEnable( GL_DEPTH_TEST);
    pSphere = gluNewQuadric();
    gluQuadricDrawStyle(pSphere, GLU_FILL);
    gluQuadricNormals(pSphere, GLU_SMOOTH);
    gluQuadricTexture(pSphere, GLU_TRUE);
}

static void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D,texEarth);
    glColor3f(1.0,1.0,1.0);
    glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE, GL_TEXTURE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glPushMatrix();
    glRotatef( -90.0, 1.0, 0.0, 0.0 );
    gluSphere(pSphere, 1.0, 18, 18);
    glDisable(GL_TEXTURE_2D);
    glPopMatrix();
    glutSwapBuffers();
    glutPostRedisplay();

}

void initTex()
{
    texEarth = loadTex("earth.bmp");  
}

void draw_sun()
{


    glPushMatrix();
    glRotatef( -90.0, 1.0, 0.0, 0.0 );
    glColor3f(1.0, 1.0, 0.0);
    glutSolidSphere(1.0, 15, 15);
    glPopMatrix();
}

static void ResizeWindow(int w, int h)
{
    float aspectRatio;
    h = (h == 0) ? 1 : h;
    w = (w == 0) ? 1 : w;
    glViewport( 0, 0, w, h );
    aspectRatio = (float)w/(float)h;
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective( 60.0, aspectRatio, 1.0, 30.0 );
    glMatrixMode( GL_MODELVIEW );
}


int main( int argc, char** argv )
{

    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH );
    glutInitWindowPosition( 0, 0 );
    glutInitWindowSize( 1200, 900);
    glutCreateWindow( "Solar System" );
    OpenGLInit();
    initTex();
    glutReshapeFunc(ResizeWindow);
    glutDisplayFunc(display);
    glutMainLoop();
    return(0);
}

【问题讨论】:

    标签: c xcode opengl texture-mapping soil


    【解决方案1】:

    您的代码中有一个调用应该会产生错误:

    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_TEXTURE);
    

    GL_TEXTURE 不是 GL_TEXTURE_ENV_MODE 的有效值。来自manual page

    如果 pname 是 GL_TEXTURE_ENV_MODE,则 params 是(或指向)纹理函数的符号名称。可以指定六个纹理函数:GL_ADD、GL_MODULATE、GL_DECAL、GL_BLEND、GL_REPLACE 或 GL_COMBINE。

    如果您只想使用从纹理中采样的值,请改用它:

    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    

    然后,您的投影将整个几何体转换出视野:

    gluPerspective(60.0, aspectRatio, 1.0, 30.0);
    

    标准透视变换从原点向下看负 z 轴。 near 和 far 值指定 z 值的范围。在这种情况下,从 -1.0 到 -30.0 的 z 值将在可见范围内。由于渲染的球体以原点为中心,因此不在可见范围内。

    要纠正此问题,您可以将球体沿负 z 轴平移,使其位于可见范围内。大约 -2.0 和 -29.0 之间的任何值都应该起作用,并且会影响球体的显示大小。作为起点,将此glTranslatef() 调用添加到您的display() 函数中:

    glPushMatrix();
    glTranslatef(0.0f, 0.0f, -10.0f);
    glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
    gluSphere(pSphere, 1.0, 18, 18);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多