簡體   English   中英

使用土壤的OpenGL紋理SPHERE?

[英]OpenGL Texturing SPHERE using Soil?

只是想問一個關於球體的OpenGL紋理映射的問題。 我想創建一個Planet(Earth),並且嘗試使用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);
}

您的代碼中有一個調用會產生錯誤:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_TEXTURE);

GL_TEXTURE不是GL_TEXTURE_ENV_MODE 手冊頁

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM