2016-11-28 76 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()