在 OpenGL 中应用于多边形后纹理看起来有点模糊
Textures look kind of fuzzy after being applied to a polygon in OpenGL
最近我一直在尝试使用 OpenGL,现在我正在尝试
在简单的形状上应用一些纹理,在本例中为 GL_POLYGON
。
问题是结果看起来有点模糊、模糊,我 运行 排除了这个问题的可能原因。
我正在尝试使用的纹理
# -*- 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()
结果
所以我终于找到了问题的根本原因。下面一行
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()
最近我一直在尝试使用 OpenGL,现在我正在尝试
在简单的形状上应用一些纹理,在本例中为 GL_POLYGON
。
问题是结果看起来有点模糊、模糊,我 运行 排除了这个问题的可能原因。
我正在尝试使用的纹理
# -*- 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()
结果
所以我终于找到了问题的根本原因。下面一行
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()