2016-11-28 7 views
1

В последнее время я экспериментировал с OpenGL, и сейчас я пытаюсь использовать некоторые текстуры на простых фигурах, а именно GL_POLYGON в этом случае. Проблема в том, что результат выглядит нечетким, неопределенным, и у меня заканчиваются возможные причины этой проблемы.Текстуры выглядят как нечеткие после применения к полигону в OpenGL

Фактура Я пытаюсь использовать

enter image description here

# -*- coding: UTF-8 -*- 

import math 

from OpenGL.GL import * 
from OpenGL.GLUT import * 
from OpenGL.GLU import * 
from PIL import Image 


width, height = 640, 480 


def init(): 
    glEnable(GL_DEPTH_TEST) 
    glClearColor(0.0, 0.0, 0.0, 0.0) 
    gl_ortho() 


def gl_ortho(): 
    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity() 


def display(): 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
    glViewport(0, 0, width, height) 

    glMatrixMode(GL_MODELVIEW) 
    glLoadIdentity() 

    im = Image.open('glass_texture.png') 
    try: 
     ix, iy, image = im.size[0], im.size[1], im.tobytes("raw", "RGB", 0, -1) 
    except SystemError: 
     ix, iy, image = im.size[0], im.size[1], im.tobytes("raw", "RGBX", 0, -1) 

    texture_id = glGenTextures(1) 
    glBindTexture(GL_TEXTURE_2D, texture_id) 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1) 
    glTexImage2D(
     GL_TEXTURE_2D, 0, 3, ix, iy, 0, 
     GL_RGBA, GL_UNSIGNED_BYTE, image 
    ) 
    glEnable(GL_TEXTURE_2D) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL) 

    glBindTexture(GL_TEXTURE_2D, texture_id) 

    glPushMatrix() 
    glBegin(GL_POLYGON) 
    glTexCoord2f(0.0, 1.0) 
    glVertex3f(-0.5, 0.5, 0.0) 
    glTexCoord2f(1.0, 1.0) 
    glVertex3f(0.5, 0.5, 0.0) 
    glTexCoord2f(1.0, 0.0) 
    glVertex3f(0.5, -0.5, 0.0) 
    glTexCoord2f(0.0, 0.0) 
    glVertex3f(-0.5, -0.5, 0.0) 
    glEnd() 
    glPopMatrix() 

    glutSwapBuffers() 
    glFlush() 


if __name__ == '__main__': 
    glutInit() 
    glutInitWindowSize(width, height) 
    glutCreateWindow('Textures') 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH) 
    glutDisplayFunc(display) 
    glutIdleFunc(display) 
    init() 
    glutMainLoop() 

Результат

enter image description here

+0

ли использовать вас [Мипмаппинг] (HTTPS : //en.wikipedia.org/wiki/Mipmap)? –

+0

Также вы можете взглянуть на [мультисэмплинг] (https://www.opengl.org/wiki/Multisampling) –

ответ

3

Так что я наконец-то нашел причину проблемы. Линию ниже

im = Image.open('brick_texture.jpg') 

следует заменить

im = Image.open('brick_texture.jpg').convert('RGBA') 

, а затем, через несколько строк ниже tobytes метода должны быть вызваны без аргументов

ix, iy, image = im.size[0], im.size[1], im.tobytes()