2016-05-22 4 views
1

Я работаю над созданием баскетбольной игры в openGL, однако я беру детские шаги и деля свои работы на разделы. В настоящее время я сосредоточен на текстурировании, пытаясь построить дом, используя библиотеку SOIL.OpenGL Texturing with SOIL

Я чрезвычайно новичок во всем этом, поэтому я, вероятно, неправильно устарел, но моя главная проблема заключается в том, что текстуры действуют так, как будто они зажаты в краю от того, что я вижу.

В настоящее время проекта является особой стеной предназначена для текстурированных кирпичей, вот изображение на выходе я получаю: Texture Fail

Вот исходный код:

#include <stdlib.h> 
#include <GL/glut.h> 
#include <SOIL.h> 
#include <stdio.h> 

float _angle = 0.0; 
GLuint _textureBrick; 

static void resize(int width, int height) 
{ 
    const float ar = (float) width/(float) height; 
    glViewport(0, 0, width, height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glFrustum(-ar, ar, -1.0, 1.0, 1.0, 100.0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

void renderScene(void) 
{ 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_TEXTURE_2D); 

    // Front side brick wall 
    glPushMatrix(); 
     glBindTexture(GL_TEXTURE_2D, _textureBrick); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
     glTranslatef(0,0,-6); 
     glRotatef(_angle, 0.0, 1.0, 0.0); 
     glBegin(GL_QUADS); // Wall 
      glTexCoord3f(-50.0,2.0,0.1); glVertex3f(-50,0,1); 
      glTexCoord3f(50.0,2.0,0.1); glVertex3f(50,0,1); 
      glTexCoord3f(50.0,0.0,0.1); glVertex3f(50,-1.5,1); 
      glTexCoord3f(-50.0,0.0,0.1); glVertex3f(-50,-1.5,1); 
     glEnd(); 
    glPopMatrix(); 

    glutSwapBuffers(); 
} 

void mySpecialFunc(int key, int x, int y){ 
    switch (key) { 
    case GLUT_KEY_RIGHT: 
     _angle += 1; 
     if (_angle > 360) _angle = 0.0; 
     break; 
    case GLUT_KEY_LEFT: 
     _angle -= 1; 
     if (_angle > 360) _angle = 0.0; 
     break; 
    } 
    glutPostRedisplay(); 
} 

GLuint loadTex(const char* texname) 
{ 
    GLuint texture = SOIL_load_OGL_texture 
        (
         texname, 
         SOIL_LOAD_AUTO, 
         SOIL_CREATE_NEW_ID, 
         SOIL_FLAG_INVERT_Y 

        ); 

    if(0 == texture) 
    { 
     printf("SOIL loading error: '%s'\n", SOIL_last_result()); 
    } 

    //glBindTexture(GL_TEXTURE_2D, texture); 
    //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    return texture; 
} 

void Initialize() { 
    glClearColor(0.0, 0.0, 0.0, 1.0); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-100.0, 100.0, -100.0, 100.0, -100.0, 100.0); 

    //_textureFloor = loadTex("C:\\Users\\Mikle\\OneDrive\\Uni work\\Second Year\\Projects\\3D-House-using-OpenGL-and-C--master\\court.png"); 

    _textureBrick = loadTex("C:\\Users\\Mikle\\OneDrive\\Uni work\\Second Year\\Projects\\3D-House-using-OpenGL-and-C--master\\bricks.bmp"); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); 
    glutInitWindowPosition(0,0); 
    glutInitWindowSize(600,600); 
    glutCreateWindow("Textured House"); 
    glEnable(GL_DEPTH_TEST); 

    glutReshapeFunc(resize); 
    glutSpecialFunc(mySpecialFunc); 
    glutDisplayFunc(renderScene); 
    Initialize(); 

    glutMainLoop(); 

    return 0; 
} 

Любой помощь будем благодарны, благодарю!

+0

Если вы начинаете с OpenGL, использование старого устаревшего API - это не лучший способ сделать это;) Идите и изучите современный программируемый OpenGL. –

+0

К сожалению, мой университетский курс не позволяет этого. –

+0

Изображение похоже, что вам нужно добавить параметр GL_TEXTURE_WRAP, а также фильтры MIN/MAG. Я слежу за [Learn Opengl] (http://www.learnopengl.com/#!Getting-started/Textures), и они были очень полезны. – Jere

ответ

0

Michael. Для того, чтобы генерировать мип и, возможно, исправить текстуру, вы должны изменить параметры функции загрузки почвы в

GLuint texture = SOIL_load_OGL_texture 
       (
        texname, 
        SOIL_LOAD_AUTO, 
        SOIL_CREATE_NEW_ID, 
        SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT 

       ); 

это будет автоматически генерировать мип из библиотеки OpenGL, как вы не называли впоследствии glGenerateMipmaps(). Он также сохраняет память, необходимую для хранения текстур. Еще одно предложение для зажима и обертывания текстуры заключается в использовании

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

после использования функции загрузки. Удачи вам в обучении OpenGL. Надеюсь, вам это помогло.

EDIT:

Вы также не должны повторять glTexParameteri каждый кадр. Это создает избыточную и ненужную нагрузку на ваш (или пользовательский) процессор.